diff --git a/ExtTransferSwitch.py b/ExtTransferSwitch.py new file mode 100755 index 00000000..96acbe08 --- /dev/null +++ b/ExtTransferSwitch.py @@ -0,0 +1,420 @@ +#!/usr/bin/env python + +# This program integrates an external transfer switch ahead of the single AC input +# of a MultiPlus or Quattro inverter/charger. +# +# A new type of digital input is defined to provide select grid or generator input profiles +# +# When the external transfer switch changes between grid and generator the data for that input must be switched between +# grid and generator settings +# +# These two sets of settings are stored in dbus Settings. +# When the transfer switch digital input changes, this program switches +# the Multiplus settings between these two stored values +# When the user changes the settings, the grid or generator-specific Settings are updated +# +# In order to function, one of the digital inputs must be set to External AC Transfer Switch +# This input should be connected to a contact closure on the external transfer switch to indicate +# which of it's sources is switched to its output +# +# For Quattro, the /Settings/TransferSwitch/TransferSwitchOnAc2 tells this program where the transfer switch is connected: +# 0 if connected to AC 1 In +# 1 if connected to AC 2 In + +import platform +import argparse +import logging +import sys +import subprocess +import os +import time +import dbus + +dbusSettingsPath = "com.victronenergy.settings" +dbusSystemPath = "com.victronenergy.system" + + + +# accommodate both Python 2 and 3 +# if the Python 3 GLib import fails, import the Python 2 gobject +try: + from gi.repository import GLib # for Python 3 +except ImportError: + import gobject as GLib # for Python 2 + +# add the path to our own packages for import +# use an established Victron service to maintain compatiblity +sys.path.insert(1, os.path.join('/opt/victronenergy/dbus-systemcalc-py', 'ext', 'velib_python')) +from vedbus import VeDbusService +from ve_utils import wrap_dbus_value +from settingsdevice import SettingsDevice + +class Monitor: + + def getVeBusObjects (self): + vebusService = "" + + # invalidate all local parameters if transfer switch is not active + if not self.transferSwitchActive: + # release generator override if it's still active + try: + if self.remoteGeneratorSelectedItem != None: + self.remoteGeneratorSelectedItem.SetValue (wrap_dbus_value (0)) + except: + logging.error ("could not release /Ac/Control/RemoteGeneratorSelected") + pass + self.remoteGeneratorSelectedItem = None + self.remoteGeneratorSelectedLocalValue = -1 + self.dbusOk = False + self.numberOfAcInputs = 0 + self.stopWhenAcAvailableObj = None + self.stopWhenAcAvailableFpObj = None + self.acInputTypeObj = None + self.veBusService = "" + self.transferSwitchLocation = 0 + return + + try: + obj = self.theBus.get_object (dbusSystemPath, '/VebusService') + vebusService = obj.GetText () + except: + if self.dbusOk: + logging.info ("Multi/Quattro disappeared - /VebusService invalid") + self.veBusService = "" + self.dbusOk = False + self.numberOfAcInputs = 0 + self.acInputTypeObj = None + + if vebusService == "---": + if self.veBusService != "": + logging.info ("Multi/Quattro disappeared") + self.veBusService = "" + self.dbusOk = False + self.numberOfAcInputs = 0 + elif self.veBusService == "" or vebusService != self.veBusService: + self.veBusService = vebusService + try: + self.numberOfAcInputs = self.theBus.get_object (vebusService, "/Ac/NumberOfAcInputs").GetValue () + except: + self.numberOfAcInputs = 0 + try: + self.remoteGeneratorSelectedItem = self.theBus.get_object (vebusService, + "/Ac/Control/RemoteGeneratorSelected") + except: + self.remoteGeneratorSelectedItem = None + self.remoteGeneratorSelectedLocalValue = -1 + + if self.numberOfAcInputs == 0: + self.dbusOk = False + elif self.numberOfAcInputs == 2: + logging.info ("discovered Quattro at " + vebusService) + elif self.numberOfAcInputs == 1: + logging.info ("discovered Multi at " + vebusService) + + try: + self.currentLimitObj = self.theBus.get_object (vebusService, "/Ac/ActiveIn/CurrentLimit") + self.currentLimitIsAdjustableObj = self.theBus.get_object (vebusService, "/Ac/ActiveIn/CurrentLimitIsAdjustable") + except: + logging.error ("current limit dbus setup failed - changes can't be made") + self.dbusOk = False + + # check to see where the transfer switch is connected + if self.numberOfAcInputs == 0: + transferSwitchLocation = 0 + elif self.numberOfAcInputs == 1: + transferSwitchLocation = 1 + self.numberOfAcInputs > 1 and self.DbusSettings['transferSwitchOnAc2'] == 1 + elif self.DbusSettings['transferSwitchOnAc2'] == 1: + transferSwitchLocation = 2 + else: + transferSwitchLocation = 1 + + # if changed, trigger refresh of object pointers + if transferSwitchLocation != self.transferSwitchLocation: + if transferSwitchLocation != 0: + logging.info ("Transfer switch is on AC %d in" % transferSwitchLocation) + self.transferSwitchLocation = transferSwitchLocation + self.stopWhenAcAvailableObj = None + self.stopWhenAcAvailableFpObj = None + try: + if self.transferSwitchLocation == 2: + self.acInputTypeObj = self.theBus.get_object (dbusSettingsPath, "/Settings/SystemSetup/AcInput2") + else: + self.acInputTypeObj = self.theBus.get_object (dbusSettingsPath, "/Settings/SystemSetup/AcInput1") + self.dbusOk = True + except: + self.dbusOk = False + logging.error ("AC input dbus setup failed - changes can't be made") + + # set up objects for stop when AC available + # there's one for "Generator" and one for "FischerPanda" + # ignore errors if these aren't present + try: + if self.transferSwitchLocation == 2: + self.stopWhenAcAvailableObj = self.theBus.get_object (dbusSettingsPath, "/Settings/Generator0/StopWhenAc2Available") + else: + self.stopWhenAcAvailableObj = self.theBus.get_object (dbusSettingsPath, "/Settings/Generator0/StopWhenAc1Available") + except: + self.stopWhenAcAvailableObj = None + # first try new settings + try: + if self.transferSwitchLocation == 2: + self.stopWhenAcAvailableFpObj = self.theBus.get_object (dbusSettingsPath, "/Settings/Generator1/StopWhenAc2Available") + else: + self.stopWhenAcAvailableFpObj = self.theBus.get_object (dbusSettingsPath, "/Settings/Generator1/StopWhenAc1Available") + # next try old settings + except: + try: + if self.transferSwitchLocation == 2: + self.stopWhenAcAvailableFpObj = self.theBus.get_object (dbusSettingsPath, "/Settings/FischerPanda0/StopWhenAc2Available") + else: + self.stopWhenAcAvailableFpObj = self.theBus.get_object (dbusSettingsPath, "/Settings/FischerPanda0/StopWhenAc1Available") + except: + self.stopWhenAcAvailableFpObj = None + + + def updateTransferSwitchState (self): + inputInvalid = False + try: + if self.transferSwitchActive: + state = self.transferSwitchStateObj.GetValue () + if state == 12: # 12 is the on generator value + self.onGenerator = True + elif state == 13: # 13 is the on grid value + self.onGenerator = False + # other value indicates the selected digital input is assigned to a different function + else: + inputInvalid = True + + # digital input not active + # search for a new one only every 10 seconds to avoid unnecessary processing + elif self.tsInputSearchDelay >= 10: + newInputService = "" + for service in self.theBus.list_names(): + # found a digital input service, now check the for valid state value + if service.startswith ("com.victronenergy.digitalinput"): + self.transferSwitchStateObj = self.theBus.get_object (service, '/State') + state = self.transferSwitchStateObj.GetValue() + # found it! + if state == 12 or state == 13: + newInputService = service + break + + # found new service - set up to use it's values + if newInputService != "": + logging.info ("discovered transfer switch digital input service at %s", newInputService) + self.transferSwitchActive = True + elif self.transferSwitchActive: + logging.info ("Transfer switch digital input service NOT found") + self.transferSwitchActive = False + + + # any exception indicates the selected digital input is no longer active + except: + inputInvalid = True + + if inputInvalid: + if self.transferSwitchActive: + logging.info ("Transfer switch digital input no longer valid") + self.transferSwitchActive = False + + if self.transferSwitchActive: + self.tsInputSearchDelay = 0 + else: + self.onGenerator = False + # if serch delay timer is active, increment it now + if self.tsInputSearchDelay < 10: + self.tsInputSearchDelay += 1 + else: + self.tsInputSearchDelay = 0 + + + def transferToGrid (self): + if self.dbusOk: + logging.info ("switching to grid settings") + # save current values for restore when switching back to generator + try: + self.DbusSettings['generatorCurrentLimit'] = self.currentLimitObj.GetValue () + except: + logging.error ("dbus error generator AC input current limit not saved switching to grid") + + try: + self.acInputTypeObj.SetValue (self.DbusSettings['gridInputType']) + except: + logging.error ("dbus error AC input type not changed to grid") + try: + if self.currentLimitIsAdjustableObj.GetValue () == 1: + self.currentLimitObj.SetValue (wrap_dbus_value (self.DbusSettings['gridCurrentLimit'])) + else: + logging.warning ("Input current limit not adjustable - not changed") + except: + logging.error ("dbus error AC input current limit not changed switching to grid") + + try: + if self.stopWhenAcAvailableObj != None: + self.stopWhenAcAvailableObj.SetValue (self.DbusSettings['stopWhenAcAvaiable']) + if self.stopWhenAcAvailableFpObj != None: + self.stopWhenAcAvailableFpObj.SetValue (self.DbusSettings['stopWhenAcAvaiableFp']) + except: + logging.error ("stopWhenAcAvailable update not changed when switching to grid") + + def transferToGenerator (self): + if self.dbusOk: + logging.info ("switching to generator settings") + # save current values for restore when switching back to grid + try: + self.DbusSettings['gridInputType'] = self.acInputTypeObj.GetValue () + except: + logging.error ("dbus error AC input type not saved when switching to generator") + try: + self.DbusSettings['gridCurrentLimit'] = self.currentLimitObj.GetValue () + except: + logging.error ("dbus error AC input current limit not saved when switching to generator") + try: + if self.stopWhenAcAvailableObj != None: + self.DbusSettings['stopWhenAcAvaiable'] = self.stopWhenAcAvailableObj.GetValue () + else: + self.DbusSettings['stopWhenAcAvaiable'] = 0 + if self.stopWhenAcAvailableFpObj != None: + self.DbusSettings['stopWhenAcAvaiableFp'] = self.stopWhenAcAvailableFpObj.GetValue () + else: + self.DbusSettings['stopWhenAcAvaiableFp'] = 0 + except: + logging.error ("dbus error stop when AC available settings not saved when switching to generator") + + try: + self.acInputTypeObj.SetValue (2) + except: + logging.error ("dbus error AC input type not changed when switching to generator") + try: + if self.currentLimitIsAdjustableObj.GetValue () == 1: + self.currentLimitObj.SetValue (wrap_dbus_value (self.DbusSettings['generatorCurrentLimit'])) + else: + logging.warning ("Input current limit not adjustable - not changed") + except: + logging.error ("dbus error AC input current limit not changed when switching to generator") + + try: + if self.stopWhenAcAvailableObj != None: + self.stopWhenAcAvailableObj.SetValue (0) + if self.stopWhenAcAvailableFpObj != None: + self.stopWhenAcAvailableFpObj.SetValue (0) + except: + logging.error ("stopWhenAcAvailable update not changed switching to generator") + + + def background (self): + + ##startTime = time.time() + self.updateTransferSwitchState () + self.getVeBusObjects () + + # skip processing if any dbus paramters were not initialized properly + if self.dbusOk and self.transferSwitchActive: + + # process transfer switch state change + if self.lastOnGenerator != None and self.onGenerator != self.lastOnGenerator: + if self.onGenerator: + self.transferToGenerator () + else: + self.transferToGrid () + self.lastOnGenerator = self.onGenerator + elif self.onGenerator: + self.transferToGrid () + + # update main VE.Bus RemoteGeneratorSelected which is used to enable grid charging + # if renewable energy is turned on + if not self.dbusOk or not self.onGenerator: + newRemoteGeneratorSelectedLocalValue = 0 + else: + newRemoteGeneratorSelectedLocalValue = 1 + if self.remoteGeneratorSelectedItem == None: + self.remoteGeneratorSelectedLocalValue = -1 + elif newRemoteGeneratorSelectedLocalValue != self.remoteGeneratorSelectedLocalValue: + try: + self.remoteGeneratorSelectedItem.SetValue (wrap_dbus_value (newRemoteGeneratorSelectedLocalValue)) + except: + logging.error ("could not set /Ac/Control/RemoteGeneratorSelected") + pass + + self.remoteGeneratorSelectedLocalValue = newRemoteGeneratorSelectedLocalValue + + ##stopTime = time.time() + ##print ("#### background time %0.3f" % (stopTime - startTime)) + return True + + + def __init__(self): + + self.theBus = dbus.SystemBus() + self.onGenerator = False + self.veBusService = "" + self.lastVeBusService = "" + self.acInputTypeObj = None + self.numberOfAcInputs = 0 + self.currentLimitObj = None + self.currentLimitIsAdjustableObj = None + self.stopWhenAcAvailableObj = None + self.stopWhenAcAvailableFpObj = None + self.remoteGeneratorSelectedItem = None + self.remoteGeneratorSelectedLocalValue = -1 + + self.transferSwitchStateObj = None + self.extTransferDigInputName = "External AC Input transfer switch" # must match name set in dbus_digitalInputs.py !!!!! + + self.lastOnGenerator = None + self.transferSwitchActive = False + self.dbusOk = False + self.transferSwitchLocation = 0 + self.tsInputSearchDelay = 99 # allow serch to occur immediately + + # create / attach local settings + settingsList = { + 'gridCurrentLimit': [ '/Settings/TransferSwitch/GridCurrentLimit', 0.0, 0.0, 0.0 ], + 'generatorCurrentLimit': [ '/Settings/TransferSwitch/GeneratorCurrentLimit', 0.0, 0.0, 0.0 ], + 'gridInputType': [ '/Settings/TransferSwitch/GridType', 0, 0, 0 ], + 'stopWhenAcAvaiable': [ '/Settings/TransferSwitch/StopWhenAcAvailable', 0, 0, 0 ], + 'stopWhenAcAvaiableFp': [ '/Settings/TransferSwitch/StopWhenAcAvailableFp', 0, 0, 0 ], + 'transferSwitchOnAc2': [ '/Settings/TransferSwitch/TransferSwitchOnAc2', 0, 0, 0 ], + } + self.DbusSettings = SettingsDevice(bus=self.theBus, supportedSettings=settingsList, + timeout = 10, eventCallback=None ) + + GLib.timeout_add (1000, self.background) + return None + +def main(): + + from dbus.mainloop.glib import DBusGMainLoop + + # set logging level to include info level entries + logging.basicConfig(level=logging.INFO) + + # Have a mainloop, so we can send/receive asynchronous calls to and from dbus + DBusGMainLoop(set_as_default=True) + + installedVersion = "(no version installed)" + versionFile = "/etc/venus/installedVersion-GuiMods" + if os.path.exists (versionFile): + try: + proc = subprocess.Popen (["cat", versionFile], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + except: + pass + else: + proc.wait() + # convert from binary to string + stdout, stderr = proc.communicate () + stdout = stdout.decode ().strip () + stderr = stderr.decode ().strip () + returnCode = proc.returncode + if proc.returncode == 0: + installedVersion = stdout + + logging.info (">>>>>>>>>>>>>>>> ExtTransferSwitch starting " + installedVersion + " <<<<<<<<<<<<<<<<") + + Monitor () + + mainloop = GLib.MainLoop() + mainloop.run() + +main() diff --git a/FileSets/fileList b/FileSets/fileList index c4d03c36..7710320b 100644 --- a/FileSets/fileList +++ b/FileSets/fileList @@ -1,5 +1,3 @@ -/opt/victronenergy/dbus-generator-starter/dbus_generator.py -/opt/victronenergy/dbus-generator-starter/startstop.py /opt/victronenergy/dbus-systemcalc-py/dbus_systemcalc.py /opt/victronenergy/gui/qml/Battery.qml /opt/victronenergy/gui/qml/DetailAcInput.qml @@ -45,3 +43,9 @@ /opt/victronenergy/gui/qml/TileText.qml /opt/victronenergy/gui/qml/main.qml /var/www/venus/styling/styles.css +/opt/victronenergy/gui/qml/PageDigitalInput.qml +/opt/victronenergy/gui/qml/MbItemDigitalInput.qml +/opt/victronenergy/dbus-digitalinputs/dbus_digitalinputs.py +/opt/victronenergy/dbus-modbustcp/attributes.csv +/opt/victronenergy/dbus-generator-starter/dbus_generator.py +/opt/victronenergy/dbus-generator-starter/startstop.py diff --git a/FileSets/v2.71/MbEditBox.qml b/FileSets/v2.71/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.71/MbEditBox.qml +++ b/FileSets/v2.71/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.71/MbEditBoxDateTime.qml b/FileSets/v2.71/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.71/MbEditBoxDateTime.qml +++ b/FileSets/v2.71/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.71/MbItemDigitalInput.qml b/FileSets/v2.71/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.71/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.71/MbSubMenu.qml b/FileSets/v2.71/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.71/MbSubMenu.qml +++ b/FileSets/v2.71/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.71/Multi.qml b/FileSets/v2.71/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.71/Multi.qml +++ b/FileSets/v2.71/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.71/OverviewBox.qml b/FileSets/v2.71/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.71/OverviewBox.qml +++ b/FileSets/v2.71/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.71/OverviewConnection.qml b/FileSets/v2.71/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.71/OverviewConnection.qml +++ b/FileSets/v2.71/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.71/OverviewConnectionEnd.qml b/FileSets/v2.71/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.71/OverviewConnectionEnd.qml +++ b/FileSets/v2.71/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.71/OverviewSolarCharger.qml b/FileSets/v2.71/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.71/OverviewSolarCharger.qml +++ b/FileSets/v2.71/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.71/OverviewTankDelegate.qml b/FileSets/v2.71/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.71/OverviewTankDelegate.qml +++ b/FileSets/v2.71/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.71/OverviewTanks.qml b/FileSets/v2.71/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.71/OverviewTanks.qml +++ b/FileSets/v2.71/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.71/PageDigitalInput.qml b/FileSets/v2.71/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.71/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.71/TileText.qml b/FileSets/v2.71/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.71/TileText.qml +++ b/FileSets/v2.71/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.71/attributes.csv b/FileSets/v2.71/attributes.csv new file mode 120000 index 00000000..b7a7945f --- /dev/null +++ b/FileSets/v2.71/attributes.csv @@ -0,0 +1 @@ +../v2.73/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.71/dbus_digitalinputs.py b/FileSets/v2.71/dbus_digitalinputs.py new file mode 120000 index 00000000..fb25a639 --- /dev/null +++ b/FileSets/v2.71/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.73/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.71/styles.css b/FileSets/v2.71/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.71/styles.css +++ b/FileSets/v2.71/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.72/MbEditBox.qml b/FileSets/v2.72/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.72/MbEditBox.qml +++ b/FileSets/v2.72/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.72/MbEditBoxDateTime.qml b/FileSets/v2.72/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.72/MbEditBoxDateTime.qml +++ b/FileSets/v2.72/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.72/MbItemDigitalInput.qml b/FileSets/v2.72/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.72/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.72/MbSubMenu.qml b/FileSets/v2.72/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.72/MbSubMenu.qml +++ b/FileSets/v2.72/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.72/Multi.qml b/FileSets/v2.72/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.72/Multi.qml +++ b/FileSets/v2.72/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.72/OverviewBox.qml b/FileSets/v2.72/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.72/OverviewBox.qml +++ b/FileSets/v2.72/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.72/OverviewConnection.qml b/FileSets/v2.72/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.72/OverviewConnection.qml +++ b/FileSets/v2.72/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.72/OverviewConnectionEnd.qml b/FileSets/v2.72/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.72/OverviewConnectionEnd.qml +++ b/FileSets/v2.72/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.72/OverviewSolarCharger.qml b/FileSets/v2.72/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.72/OverviewSolarCharger.qml +++ b/FileSets/v2.72/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.72/OverviewTankDelegate.qml b/FileSets/v2.72/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.72/OverviewTankDelegate.qml +++ b/FileSets/v2.72/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.72/OverviewTanks.qml b/FileSets/v2.72/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.72/OverviewTanks.qml +++ b/FileSets/v2.72/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.72/PageDigitalInput.qml b/FileSets/v2.72/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.72/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.72/TileText.qml b/FileSets/v2.72/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.72/TileText.qml +++ b/FileSets/v2.72/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.72/attributes.csv b/FileSets/v2.72/attributes.csv new file mode 120000 index 00000000..b7a7945f --- /dev/null +++ b/FileSets/v2.72/attributes.csv @@ -0,0 +1 @@ +../v2.73/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.72/dbus_digitalinputs.py b/FileSets/v2.72/dbus_digitalinputs.py new file mode 120000 index 00000000..fb25a639 --- /dev/null +++ b/FileSets/v2.72/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.73/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.72/styles.css b/FileSets/v2.72/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.72/styles.css +++ b/FileSets/v2.72/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.73/MbEditBox.qml b/FileSets/v2.73/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.73/MbEditBox.qml +++ b/FileSets/v2.73/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.73/MbEditBoxDateTime.qml b/FileSets/v2.73/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.73/MbEditBoxDateTime.qml +++ b/FileSets/v2.73/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.73/MbItemDigitalInput.qml b/FileSets/v2.73/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.73/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.73/MbSubMenu.qml b/FileSets/v2.73/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.73/MbSubMenu.qml +++ b/FileSets/v2.73/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.73/Multi.qml b/FileSets/v2.73/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.73/Multi.qml +++ b/FileSets/v2.73/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.73/OverviewBox.qml b/FileSets/v2.73/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.73/OverviewBox.qml +++ b/FileSets/v2.73/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.73/OverviewConnection.qml b/FileSets/v2.73/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.73/OverviewConnection.qml +++ b/FileSets/v2.73/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.73/OverviewConnectionEnd.qml b/FileSets/v2.73/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.73/OverviewConnectionEnd.qml +++ b/FileSets/v2.73/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.73/OverviewSolarCharger.qml b/FileSets/v2.73/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.73/OverviewSolarCharger.qml +++ b/FileSets/v2.73/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.73/OverviewTankDelegate.qml b/FileSets/v2.73/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.73/OverviewTankDelegate.qml +++ b/FileSets/v2.73/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.73/OverviewTanks.qml b/FileSets/v2.73/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.73/OverviewTanks.qml +++ b/FileSets/v2.73/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.73/PageDigitalInput.qml b/FileSets/v2.73/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.73/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.73/TileText.qml b/FileSets/v2.73/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.73/TileText.qml +++ b/FileSets/v2.73/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.73/attributes.csv b/FileSets/v2.73/attributes.csv new file mode 100644 index 00000000..a53f6d62 --- /dev/null +++ b/FileSets/v2.73/attributes.csv @@ -0,0 +1,448 @@ +com.victronenergy.gps,/Position/Latitude,d,Decimal degrees,2800,int32,10000000,R +com.victronenergy.gps,/Position/Longitude,d,Decimal degrees,2802,int32,10000000,R +com.victronenergy.gps,/Course,d,Degrees,2804,uint16,100,R +com.victronenergy.gps,/Speed,d,m/s,2805,uint16,100,R +com.victronenergy.gps,/Fix,y,,2806,uint16,1,R +com.victronenergy.gps,/NrOfSatellites,y,,2807,uint16,1,R +com.victronenergy.gps,/Altitude,d,m,2808,int32,10,R +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/State,i,0=BL disabled;1=Restarting;2=Self-consumption;3=Self-consumption;4=Self-consumption;5=Discharge disabled;6=Force charge;7=Sustain;9=Keep batteries charged;10=BL Disabled;11=BL Disabled (Low SoC),2900,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/MinimumSocLimit,d,%,2901,uint16,10,W +com.victronenergy.settings,/Settings/CGwacs/Hub4Mode,i,1=ESS with Phase Compensation;2=ESS without phase compensation;3=Disabled/External Control,2902,uint16,1,W +com.victronenergy.vebus,/Interfaces/Mk2/Version,u,,1,,,R +com.victronenergy.vebus,/Devices/0/Version,u,,2,,,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/V,d,V AC,3,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/V,d,V AC,4,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/V,d,V AC,5,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/I,d,A AC,6,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/I,d,A AC,7,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/I,d,A AC,8,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/F,d,Hz,9,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/F,d,Hz,10,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/F,d,Hz,11,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/P,i,VA or Watts,12,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/P,i,VA or Watts,13,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/P,i,VA or Watts,14,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L1/V,d,V AC,15,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L2/V,d,V AC,16,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L3/V,d,V AC,17,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L1/I,d,A AC,18,int16,10,R +com.victronenergy.vebus,/Ac/Out/L2/I,d,A AC,19,int16,10,R +com.victronenergy.vebus,/Ac/Out/L3/I,d,A AC,20,int16,10,R +com.victronenergy.vebus,/Ac/Out/L1/F,d,Hz,21,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/CurrentLimit,d,A,22,int16,10,W +com.victronenergy.vebus,/Ac/Out/L1/P,i,VA or Watts,23,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L2/P,i,VA or Watts,24,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L3/P,i,VA or Watts,25,int16,0.1,R +com.victronenergy.vebus,/Dc/0/Voltage,d,V DC,26,uint16,100,R +com.victronenergy.vebus,/Dc/0/Current,d,A DC,27,int16,10,R +com.victronenergy.vebus,/Ac/NumberOfPhases,u,count,28,uint16,1,R +com.victronenergy.vebus,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,29,uint16,1,R +com.victronenergy.vebus,/Soc,d,%,30,uint16,10,W +com.victronenergy.vebus,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=Bulk protection,31,uint16,1,R +com.victronenergy.vebus,/VebusError,u,0=No error;1=VE.Bus Error 1: Device is switched off because one of the other phases in the system has switched off;2=VE.Bus Error 2: New and old types MK2 are mixed in the system;3=VE.Bus Error 3: Not all- or more than- the expected devices were found in the system;4=VE.Bus Error 4: No other device whatsoever detected;5=VE.Bus Error 5: Overvoltage on AC-out;6=VE.Bus Error 6: Error in DDC Program;7=VE.Bus BMS connected- which requires an Assistant- but no assistant found;10=VE.Bus Error 10: System time synchronisation problem occurred;14=VE.Bus Error 14: Device cannot transmit data;16=VE.Bus Error 16: Dongle missing;17=VE.Bus Error 17: One of the devices assumed master status because the original master failed;18=VE.Bus Error 18: AC Overvoltage on the output of a slave has occurred while already switched off;22=VE.Bus Error 22: This device cannot function as slave;24=VE.Bus Error 24: Switch-over system protection initiated;25=VE.Bus Error 25: Firmware incompatibility. The firmware of one of the connected device is not sufficiently up to date to operate in conjunction with this device;26=VE.Bus Error 26: Internal error,32,uint16,1,R +com.victronenergy.vebus,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,33,uint16,1,W +com.victronenergy.vebus,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,34,uint16,1,R +com.victronenergy.vebus,/Alarms/LowBattery,u,0=Ok;1=Warning;2=Alarm,35,uint16,1,R +com.victronenergy.vebus,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,36,uint16,1,R +com.victronenergy.vebus,/Alarms/TemperatureSensor,u,0=Ok;1=Warning;2=Alarm,42,uint16,1,R +com.victronenergy.vebus,/Alarms/VoltageSensor,u,0=Ok;1=Warning;2=Alarm,43,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/HighTemperature,u,0=Ok;1=Warning;2=Alarm,44,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/LowBattery,u,0=Ok;1=Warning;2=Alarm,45,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Overload,u,0=Ok;1=Warning;2=Alarm,46,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Ripple,u,0=Ok;1=Warning;2=Alarm,47,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/HighTemperature,u,0=Ok;1=Warning;2=Alarm,48,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/LowBattery,u,0=Ok;1=Warning;2=Alarm,49,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Overload,u,0=Ok;1=Warning;2=Alarm,50,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Ripple,u,0=Ok;1=Warning;2=Alarm,51,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/HighTemperature,u,0=Ok;1=Warning;2=Alarm,52,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/LowBattery,u,0=Ok;1=Warning;2=Alarm,53,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Overload,u,0=Ok;1=Warning;2=Alarm,54,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Ripple,u,0=Ok;1=Warning;2=Alarm,55,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,37,int16,1,W +com.victronenergy.vebus,/Hub4/DisableCharge,u,0=Charge allowed;1=Charge disabled,38,uint16,1,W +com.victronenergy.vebus,/Hub4/DisableFeedIn,u,0=Feed in allowed;1=Feed in disabled,39,uint16,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,40,int16,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,41,int16,1,W +com.victronenergy.vebus,/PvInverter/Disable,u,0=PV enabled;1=PV disabled,56,uint16,1,W +com.victronenergy.vebus,/Bms/AllowToCharge,u,0=No;1=Yes,57,uint16,1,R +com.victronenergy.vebus,/Bms/AllowToDischarge,u,0=No;1=Yes,58,uint16,1,R +com.victronenergy.vebus,/Bms/BmsExpected,u,0=No;1=Yes,59,uint16,1,R +com.victronenergy.vebus,/Bms/Error,u,0=No;1=Yes,60,uint16,1,R +com.victronenergy.vebus,/Dc/0/Temperature,d,Degrees celsius,61,int16,10,R +com.victronenergy.vebus,/SystemReset,y,0=No action;1=VE.Bus Reset,62,uint16,1,W +com.victronenergy.vebus,/Alarms/PhaseRotation,u,0=Ok;1=Warning,63,uint16,1,R +com.victronenergy.vebus,/Alarms/GridLost,i,0=No alarm;2=Alarm,64,uint16,1,R +com.victronenergy.vebus,/Hub4/DoNotFeedInOvervoltage,i,0=Feed in overvoltage;1=Don't feed in overvoltage,65,uint16,1,W +com.victronenergy.vebus,/Hub4/L1/MaxFeedInPower,d,W,66,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L2/MaxFeedInPower,d,W,67,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L3/MaxFeedInPower,d,W,68,uint16,0.01,W +com.victronenergy.vebus,/Ac/State/IgnoreAcIn1,i,0=AC input not ignored; 1=AC input ignored,69,uint16,1,R +com.victronenergy.vebus,/Ac/State/IgnoreAcIn2,i,0=AC input not ignored; 1=AC input ignored,70,uint16,1,R +com.victronenergy.vebus,/Hub4/TargetPowerIsMaxFeedIn,i,0=AcPowerSetpoint interpreted normally; 1=AcPowerSetpoint as OvervoltageFeedIn limit,71,uint16,W +com.victronenergy.vebus,/Hub4/FixSolarOffsetTo100mV,i,0=OvervoltageFeedIn uses 1V offset; 1=OvervoltageFeedIn uses 0.1V offset,72,uint16,W +com.victronenergy.battery,/ProductId,u,,256,,,R +com.victronenergy.battery,/FirmwareVersion,u,,257,,,R +com.victronenergy.battery,/Serial,s,,258,,,R +com.victronenergy.battery,/Dc/0/Voltage,d,V DC,259,uint16,100,R +com.victronenergy.battery,/Dc/1/Voltage,d,V DC,260,uint16,100,R +com.victronenergy.battery,/Dc/0/Current,d,A DC,261,int16,10,R +com.victronenergy.battery,/Dc/0/Temperature,d,Degrees celsius,262,int16,10,R +com.victronenergy.battery,/Dc/0/MidVoltage,d,V DC,263,uint16,100,R +com.victronenergy.battery,/Dc/0/MidVoltageDeviation,d,%,264,uint16,100,R +com.victronenergy.battery,/ConsumedAmphours,d,Ah,265,uint16,-10,R +com.victronenergy.battery,/Soc,y,%,266,uint16,10,R +com.victronenergy.battery,/Soh,y,%,304,uint16,10,R +com.victronenergy.battery,/TimeToGo,q,seconds,303,uint16,0.01,R +com.victronenergy.battery,/Info/MaxChargeVoltage,u,V DC,305,uint16,10,R +com.victronenergy.battery,/Info/BatteryLowVoltage,u,V DC,306,uint16,10,R +com.victronenergy.battery,/Info/MaxChargeCurrent,u,A DC,307,uint16,10,R +com.victronenergy.battery,/Info/MaxDischargeCurrent,u,A DC,308,uint16,10,R +com.victronenergy.battery,/Alarms/Alarm,y,0=No alarm;2=Alarm,267,uint16,1,R +com.victronenergy.battery,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,268,uint16,1,R +com.victronenergy.battery,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,269,uint16,1,R +com.victronenergy.battery,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,270,uint16,1,R +com.victronenergy.battery,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,271,uint16,1,R +com.victronenergy.battery,/Alarms/LowSoc,u,0=No alarm;2=Alarm,272,uint16,1,R +com.victronenergy.battery,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,273,uint16,1,R +com.victronenergy.battery,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,274,uint16,1,R +com.victronenergy.battery,/Alarms/MidVoltage,u,0=No alarm;2=Alarm,275,uint16,1,R +com.victronenergy.battery,/Alarms/LowFusedVoltage,u,0=No alarm;2=Alarm,276,uint16,1,R +com.victronenergy.battery,/Alarms/HighFusedVoltage,u,0=No alarm;2=Alarm,277,uint16,1,R +com.victronenergy.battery,/Alarms/FuseBlown,u,0=No alarm;2=Alarm,278,uint16,1,R +com.victronenergy.battery,/Alarms/HighInternalTemperature,u,0=No alarm;2=Alarm,279,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeCurrent,u,0=No alarm;2=Alarm,320,uint16,1,R +com.victronenergy.battery,/Alarms/HighDischargeCurrent,u,0=No alarm;2=Alarm,321,uint16,1,R +com.victronenergy.battery,/Alarms/CellImbalance,u,0=No alarm;2=Alarm,322,uint16,1,R +com.victronenergy.battery,/Alarms/InternalFailure,u,0=No alarm;2=Alarm,323,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeTemperature,u,0=No alarm;2=Alarm,324,uint16,1,R +com.victronenergy.battery,/Alarms/LowChargeTemperature,u,0=No alarm;2=Alarm,325,uint16,1,R +com.victronenergy.battery,/Alarms/LowCellVoltage,u,0=No alarm;1=Almost discharged;2=Alarm,326,uint16,1,R +com.victronenergy.battery,/Relay/0/State,y,0=Open;1=Closed,280,uint16,1,W +com.victronenergy.battery,/History/DeepestDischarge,d,Ah,281,uint16,-10,R +com.victronenergy.battery,/History/LastDischarge,d,Ah,282,uint16,-10,R +com.victronenergy.battery,/History/AverageDischarge,d,Ah,283,uint16,-10,R +com.victronenergy.battery,/History/ChargeCycles,i,count,284,uint16,1,R +com.victronenergy.battery,/History/FullDischarges,i,count,285,uint16,1,R +com.victronenergy.battery,/History/TotalAhDrawn,d,Ah,286,uint16,-10,R +com.victronenergy.battery,/History/MinimumVoltage,d,V DC,287,uint16,100,R +com.victronenergy.battery,/History/MaximumVoltage,d,V DC,288,uint16,100,R +com.victronenergy.battery,/History/TimeSinceLastFullCharge,i,seconds,289,uint16,0.01,R +com.victronenergy.battery,/History/AutomaticSyncs,i,count,290,uint16,1,R +com.victronenergy.battery,/History/LowVoltageAlarms,i,count,291,uint16,1,R +com.victronenergy.battery,/History/HighVoltageAlarms,i,count,292,uint16,1,R +com.victronenergy.battery,/History/LowStarterVoltageAlarms,i,count,293,uint16,1,R +com.victronenergy.battery,/History/HighStarterVoltageAlarms,i,count,294,uint16,1,R +com.victronenergy.battery,/History/MinimumStarterVoltage,d,V DC,295,uint16,100,R +com.victronenergy.battery,/History/MaximumStarterVoltage,d,V DC,296,uint16,100,R +com.victronenergy.battery,/History/LowFusedVoltageAlarms,i,count,297,uint16,1,R +com.victronenergy.battery,/History/HighFusedVoltageAlarms,i,count,298,uint16,1,R +com.victronenergy.battery,/History/MinimumFusedVoltage,d,V DC,299,uint16,100,R +com.victronenergy.battery,/History/MaximumFusedVoltage,d,V DC,300,uint16,100,R +com.victronenergy.battery,/History/DischargedEnergy,d,kWh,301,uint16,10,R +com.victronenergy.battery,/History/ChargedEnergy,d,kWh,302,uint16,10,R +com.victronenergy.battery,/Capacity,d,Ah,309,uint16,10,R +com.victronenergy.battery,/State,y,0=Initializing (Wait start);1=Initializing (before boot);2=Initializing (Before boot delay);3=Initializing (Wait boot);4=Initializing;5=Initializing (Measure battery voltage);6=Initializing (Calculate battery voltage);7=Initializing (Wait bus voltage);8=Initializing (Wait for lynx shunt);9=Running;10=Error (10);11=Error (11),1282,uint16,1,R +com.victronenergy.battery,/ErrorCode,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1283,uint16,1,R +com.victronenergy.battery,/SystemSwitch,y,0=Disabled;1=Enabled,1284,uint16,1,R +com.victronenergy.battery,/Balancing,y,0=Inactive;1=Active,1285,uint16,1,R +com.victronenergy.battery,/System/NrOfBatteries,y,count,1286,uint16,1,R +com.victronenergy.battery,/System/BatteriesParallel,y,count,1287,uint16,1,R +com.victronenergy.battery,/System/BatteriesSeries,y,count,1288,uint16,1,R +com.victronenergy.battery,/System/NrOfCellsPerBattery,y,count,1289,uint16,1,R +com.victronenergy.battery,/System/MinCellVoltage,d,V DC,1290,uint16,100,R +com.victronenergy.battery,/System/MaxCellVoltage,d,V DC,1291,uint16,100,R +com.victronenergy.battery,/Diagnostics/ShutDownsDueError,q,count,1292,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1293,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1294,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1295,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1296,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Time,u,,310,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Time,u,,312,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Time,u,,314,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Time,u,,316,int32,1,R +com.victronenergy.battery,/System/MinCellTemperature,d,Degrees celsius,318,int16,10,R +com.victronenergy.battery,/System/MaxCellTemperature,d,Degrees celsius,319,int16,10,R +com.victronenergy.battery,/Io/AllowToCharge,y,0=No;1=Yes,1297,uint16,1,R +com.victronenergy.battery,/Io/AllowToDischarge,y,0=No;1=Yes,1298,uint16,1,R +com.victronenergy.battery,/Io/ExternalRelay,y,0=Inactive;1=Active,1299,uint16,1,R +com.victronenergy.battery,/History/MinimumCellVoltage,d,V DC,1300,uint16,100,R +com.victronenergy.battery,/History/MaximumCellVoltage,d,V DC,1301,uint16,100,R +com.victronenergy.solarcharger,/ProductId,u,,768,,,R +com.victronenergy.solarcharger,/FirmwareVersion,u,,769,,,R +com.victronenergy.solarcharger,/Serial,s,,770,,,R +com.victronenergy.solarcharger,/Dc/0/Voltage,d,V DC,771,uint16,100,R +com.victronenergy.solarcharger,/Dc/0/Current,d,A DC,772,int16,10,R +com.victronenergy.solarcharger,/Dc/0/Temperature,d,Degrees celsius,773,int16,10,R +com.victronenergy.solarcharger,/Mode,i,1=On;4=Off,774,uint16,1,W +com.victronenergy.solarcharger,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;11=Other (Hub-1);252=Hub-1,775,uint16,1,R +com.victronenergy.solarcharger,/Pv/V,d,V DC,776,uint16,100,R +com.victronenergy.solarcharger,/Pv/I,d,A DC,777,int16,10,R +com.victronenergy.solarcharger,/Yield/Power,d,W,789,uint16,10,R +com.victronenergy.solarcharger,/Equalization/Pending,i,0=No;1=Yes;2=Error;3=Unavailable- Unknown,778,uint16,1,R +com.victronenergy.solarcharger,/Equalization/TimeRemaining,d,seconds,779,uint16,10,R +com.victronenergy.solarcharger,/Relay/0/State,i,0=Open;1=Closed,780,uint16,1,R +com.victronenergy.solarcharger,/Alarms/Alarm,i,0=No alarm;2=Alarm,781,uint16,1,R +com.victronenergy.solarcharger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,782,uint16,1,R +com.victronenergy.solarcharger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,783,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Yield,d,kWh,784,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/MaxPower,d,W,785,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Yield,d,kWh,786,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/MaxPower,d,W,787,uint16,1,R +com.victronenergy.solarcharger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,788,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,790,uint16,10,R +com.victronenergy.solarcharger,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,791,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/V,d,V DC,3700,uint16,100,R +com.victronenergy.solarcharger,/Pv/1/V,d,V DC,3701,uint16,100,R +com.victronenergy.solarcharger,/Pv/2/V,d,V DC,3702,uint16,100,R +com.victronenergy.solarcharger,/Pv/3/V,d,V DC,3703,uint16,100,R +com.victronenergy.solarcharger,/Pv/0/I,d,A DC,3704,int16,10,R +com.victronenergy.solarcharger,/Pv/1/I,d,A DC,3705,int16,10,R +com.victronenergy.solarcharger,/Pv/2/I,d,A DC,3706,int16,10,R +com.victronenergy.solarcharger,/Pv/3/I,d,A DC,3707,int16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/Yield,d,kWh,3708,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/Yield,d,kWh,3709,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/Yield,d,kWh,3710,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/Yield,d,kWh,3711,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/Yield,d,kWh,3712,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/Yield,d,kWh,3713,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/Yield,d,kWh,3714,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/Yield,d,kWh,3715,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/MaxPower,d,W,3716,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/MaxPower,d,W,3717,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/MaxPower,d,W,3718,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/MaxPower,d,W,3719,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/MaxPower,d,W,3720,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/MaxPower,d,W,3721,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/MaxPower,d,W,3722,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/MaxPower,d,W,3723,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L1/Power,d,W,808,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L2/Power,d,W,809,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L3/Power,d,W,810,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L1/Power,d,W,811,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L2/Power,d,W,812,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L3/Power,d,W,813,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L1/Power,d,W,814,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L2/Power,d,W,815,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L3/Power,d,W,816,uint16,1,R +com.victronenergy.system,/Dc/Pv/Power,d,W,850,uint16,1,R +com.victronenergy.system,/Dc/Pv/Current,d,A DC,851,int16,10,R +com.victronenergy.system,/Dc/Charger/Power,d,W,855,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L1/Power,d,W,817,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L2/Power,d,W,818,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L3/Power,d,W,819,uint16,1,R +com.victronenergy.system,/Ac/Grid/L1/Power,d,W,820,int16,1,R +com.victronenergy.system,/Ac/Grid/L2/Power,d,W,821,int16,1,R +com.victronenergy.system,/Ac/Grid/L3/Power,d,W,822,int16,1,R +com.victronenergy.system,/Ac/Genset/L1/Power,d,W,823,int16,1,R +com.victronenergy.system,/Ac/Genset/L2/Power,d,W,824,int16,1,R +com.victronenergy.system,/Ac/Genset/L3/Power,d,W,825,int16,1,R +com.victronenergy.system,/Ac/ActiveIn/Source,u,0=Not available;1=Grid;2=Generator;3=Shore power;240=Not connected,826,int16,1,R +com.victronenergy.system,/Dc/System/Power,d,W,860,int16,1,R +com.victronenergy.system,/Dc/Battery/Voltage,d,V DC,840,uint16,10,R +com.victronenergy.system,/Dc/Battery/Current,d,A DC,841,int16,10,R +com.victronenergy.system,/Dc/Battery/Power,d,W,842,int16,1,R +com.victronenergy.system,/Dc/Vebus/Current,d,A DC,865,int16,10,R +com.victronenergy.system,/Dc/Vebus/Power,d,W,866,int16,1,R +com.victronenergy.system,/Dc/Battery/Soc,d,%,843,uint16,1,R +com.victronenergy.system,/Dc/Battery/State,i,0=idle;1=charging;2=discharging,844,uint16,1,R +com.victronenergy.system,/Dc/Battery/ConsumedAmphours,d,Ah,845,uint16,-10,R +com.victronenergy.system,/Dc/Battery/TimeToGo,d,s,846,uint16,0.01,R +com.victronenergy.system,/Relay/0/State,i,0=Open;1=Closed,806,uint16,1,W +com.victronenergy.system,/Relay/1/State,i,0=Open;1=Closed,807,uint16,1,W +com.victronenergy.system,/Serial,s,,800,string[6],1,R +com.victronenergy.pvinverter,/ProductId,u,,1024,,,R +com.victronenergy.pvinverter,/FirmwareVersion,s,,1025,,,R +com.victronenergy.pvinverter,/Position,i,0=AC input 1;1=AC output;2=AC input 2,1026,uint16,1,R +com.victronenergy.pvinverter,/Serial,s,,1039,string[7],1,R +com.victronenergy.pvinverter,/Ac/L1/Voltage,d,V AC,1027,uint16,10,R +com.victronenergy.pvinverter,/Ac/L1/Current,d,A AC,1028,int16,10,R +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1029,uint16,1,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1030,uint16,100,R +com.victronenergy.pvinverter,/Ac/L2/Voltage,d,V AC,1031,uint16,10,R +com.victronenergy.pvinverter,/Ac/L2/Current,d,A AC,1032,int16,10,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1033,uint16,1,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1034,uint16,100,R +com.victronenergy.pvinverter,/Ac/L3/Voltage,d,V AC,1035,uint16,10,R +com.victronenergy.pvinverter,/Ac/L3/Current,d,A AC,1036,int16,10,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1037,uint16,1,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1038,uint16,100,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1046,uint32,100,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1048,uint32,100,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1050,uint32,100,R +com.victronenergy.pvinverter,/Ac/Power,i,kW,1052,int32,1,W +com.victronenergy.pvinverter,/Ac/MaxPower,u,kW,1054,uint32,1,W +com.victronenergy.pvinverter,/Ac/PowerLimit,u,kW,1056,uint32,1,W +com.victronenergy.motordrive,/Motor/RPM,d,RPM,2048,int16,1,R +com.victronenergy.motordrive,/Motor/Temperature,d,Degrees celsius,2049,int16,10,R +com.victronenergy.motordrive,/Dc/0/Voltage,d,V DC,2050,uint16,100,R +com.victronenergy.motordrive,/Dc/0/Current,d,A DC,2051,int16,10,R +com.victronenergy.motordrive,/Dc/0/Power,d,W,2052,int16,10,R +com.victronenergy.motordrive,/Controller/Temperature,d,Degrees celsius,2053,int16,10,R +com.victronenergy.charger,/ProductId,,,2304,,,R +com.victronenergy.charger,/FirmwareVersion,,,2305,,,R +com.victronenergy.charger,/Serial,,,2306,,,R +com.victronenergy.charger,/Dc/0/Voltage,d,V DC,2307,uint16,100,R +com.victronenergy.charger,/Dc/0/Current,d,A DC,2308,int16,10,R +com.victronenergy.charger,/Dc/0/Temperature,d,Degrees celsius,2309,int16,10,R +com.victronenergy.charger,/Dc/1/Voltage,d,V DC,2310,uint16,100,R +com.victronenergy.charger,/Dc/1/Current,d,A DC,2311,int16,10,R +com.victronenergy.charger,/Dc/2/Voltage,d,V DC,2312,uint16,100,R +com.victronenergy.charger,/Dc/2/Current,d,A DC,2313,int16,10,R +com.victronenergy.charger,/Ac/In/L1/I,d,A AC,2314,int16,10,R +com.victronenergy.charger,/Ac/In/L1/P,d,W DC,2315,uint16,1,R +com.victronenergy.charger,/Ac/In/CurrentLimit,d,A AC,2316,int16,10,W +com.victronenergy.charger,/Mode,i,0=Off;1=On;2=Error;3=Unavailable- Unknown,2317,uint16,1,W +com.victronenergy.charger,/State,i,0=Off;1=Low Power Mode;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply mode;252=Bulk protection,2318,uint16,1,R +com.victronenergy.charger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,2319,uint16,1,R +com.victronenergy.charger,/Relay/0/State,i,0=Open;1=Closed,2320,uint16,1,R +com.victronenergy.charger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,2321,uint16,1,R +com.victronenergy.charger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,2322,uint16,1,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2600,int16,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2601,int16,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2602,int16,1,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2603,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2604,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2605,uint16,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2606,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2607,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2608,uint16,100,R +com.victronenergy.grid,/Serial,s,,2609,string[7],,R +com.victronenergy.grid,/Ac/L1/Voltage,d,V AC,2616,uint16,10,R +com.victronenergy.grid,/Ac/L1/Current,d,A AC,2617,int16,10,R +com.victronenergy.grid,/Ac/L2/Voltage,d,V AC,2618,uint16,10,R +com.victronenergy.grid,/Ac/L2/Current,d,A AC,2619,int16,10,R +com.victronenergy.grid,/Ac/L3/Voltage,d,V AC,2620,uint16,10,R +com.victronenergy.grid,/Ac/L3/Current,d,A AC,2621,int16,10,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2622,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2624,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2626,uint32,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2628,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2630,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2632,uint32,100,R +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2700,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2703,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/MaxChargePercentage,d,%,2701,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePercentage,d,%,2702,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePower,d,W,2704,uint16,0.1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeCurrent,d,A,2705,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxFeedInPower,d,W,2706,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/OvervoltageFeedIn,i,0=Don't feed excess DC-coupled PV into grid;1=Feed excess DC-coupled PV into the grid,2707,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/PreventFeedback,i,0=Feed excess AC-coupled PV into grid;1=Don't feed excess AC-coupled PV into the grid,2708,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeVoltage,d,V,2710,uint16,1,V +com.victronenergy.hub4,/PvPowerLimiterActive,i,0=Feed-in limiting inactive;1=Feed-in limiting active,2709,uint16,1,R +com.victronenergy.tank,/ProductId,u,,3000,uint16,1,R +com.victronenergy.tank,/Capacity,d,m3,3001,uint32,10000,R +com.victronenergy.tank,/FluidType,u,0=Fuel;1=Fresh water;2=Waste water;3=Live well;4=Oil;5=Black water (sewage),3003,uint16,1,R +com.victronenergy.tank,/Level,d,%,3004,uint16,10,R +com.victronenergy.tank,/Remaining,d,m3,3005,uint32,10000,R +com.victronenergy.tank,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3007,uint16,1,R +com.victronenergy.inverter,/ProductId,u,,3127,uint16,1,R +com.victronenergy.inverter,/FirmwareVersion,u,,3125,uint16,1,R +com.victronenergy.inverter,/Ac/Out/L1/I,d,A AC,3100,int16,10,R +com.victronenergy.inverter,/Ac/Out/L1/V,d,V AC,3101,uint16,10,R +com.victronenergy.inverter,/Ac/Out/L1/P,d,W AC,3102,int16,0.1,R +com.victronenergy.inverter,/Alarms/HighTemperature,u,0=No alarm;1=Warning;2=Alarm,3110,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltage,u,0=No alarm;1=Warning;2=Alarm,3111,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3112,uint16,1,R +com.victronenergy.inverter,/Alarms/LowTemperature,u,0=No alarm;1=Warning;2=Alarm,3113,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltage,u,0=No alarm;1=Warning;2=Alarm,3114,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3115,uint16,1,R +com.victronenergy.inverter,/Alarms/Overload,u,0=No alarm;1=Warning;2=Alarm,3116,uint16,1,R +com.victronenergy.inverter,/Alarms/Ripple,u,0=No alarm;1=Warning;2=Alarm,3117,uint16,1,R +com.victronenergy.inverter,/Dc/0/Voltage,d,V DC,3105,uint16,100,R +com.victronenergy.inverter,/Dc/0/Current,d,A DC,3106,int16,10,R +com.victronenergy.inverter,/Mode,u,2=On;4=Off;5=Eco,3126,uint16,1,W +com.victronenergy.inverter,/State,u,0=Off;1=Low power mode (search mode);2=Fault;9=Inverting (on),3128,uint16,1,R +com.victronenergy.inverter,/Energy/InverterToAcOut,d,kWh,3130,uint32,100,R +com.victronenergy.inverter,/Energy/OutToInverter,d,kWh,3132,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToAcOut,d,kWh,3134,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToBattery,d,kWh,3136,uint32,100,R +com.victronenergy.inverter,/Pv/V,d,V DC,3138,uint16,10,R +com.victronenergy.inverter,/Pv/I,d,A DC,3139,uint16,10,R +com.victronenergy.inverter,/Pv/0/V,d,V DC,3140,uint16,10,R +com.victronenergy.inverter,/Pv/1/V,d,V DC,3141,uint16,10,R +com.victronenergy.inverter,/Pv/2/V,d,V DC,3142,uint16,10,R +com.victronenergy.inverter,/Pv/3/V,d,V DC,3143,uint16,10,R +com.victronenergy.inverter,/Pv/0/I,d,A DC,3144,uint16,10,R +com.victronenergy.inverter,/Pv/1/I,d,A DC,3145,uint16,10,R +com.victronenergy.inverter,/Pv/2/I,d,A DC,3146,uint16,10,R +com.victronenergy.inverter,/Pv/3/I,d,A DC,3147,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/Yield,d,kWh,3148,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/Yield,d,kWh,3149,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/Yield,d,kWh,3150,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/Yield,d,kWh,3151,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/Yield,d,kWh,3152,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/Yield,d,kWh,3153,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/Yield,d,kWh,3154,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/Yield,d,kWh,3155,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/MaxPower,d,W,3156,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/MaxPower,d,W,3157,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/MaxPower,d,W,3158,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/MaxPower,d,W,3159,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/MaxPower,d,W,3160,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/MaxPower,d,W,3161,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/MaxPower,d,W,3162,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/MaxPower,d,W,3163,uint16,1,R +com.victronenergy.genset,/ProductId,u,,3212,uint16,1,R +com.victronenergy.genset,/StatusCode,u,0=Standby;1=Startup 1;2=Startup 2;3=Startup 3;4=Startup 4;5=Startup 5;6=Startup 6;7=Startup 7;8=Running;9=Stopping;10=Error,3213,uint16,1,R +com.victronenergy.genset,/ErrorCode,u,0=No error;1=AC voltage L1 too low;2=AC frequency L1 too low;3=AC current too low;4=AC power too low;5=Emergency stop;6=Servo current too low;7=Oil pressure too low;8=Engine temperature too low;9=Winding temperature too low;10=Exhaust temperature too low;13=Starter current too low;14=Glow current too low;15=Glow current too low;16=Fuel holding magnet current too low;17=Stop solenoid hold coil current too low;18=Stop solenoid pull coil current too low;19=Optional DC out current too low;20=5V output voltage too low;21=Boost output current too low;22=Panel supply current too high;25=Starter battery voltage too low;26=Startup aborted (rotation too low);28=Rotation too low;29=Power contactor current too low;30=AC voltage L2 too low;31=AC frequency L2 too low;32=AC current L2 too low;33=AC power L2 too low;34=AC voltage L3 too low;35=AC frequency L3 too low;36=AC current L3 too low;37=AC power L3 too low;62=Fuel temperature too low;63=Fuel level too low;65=AC voltage L1 too high;66=AC frequency too high;67=AC current too high;68=AC power too high;70=Servo current too high;71=Oil pressure too high;72=Engine temperature too high;73=Winding temperature too high;74=Exhaust temperature too low;77=Starter current too low;78=Glow current too high;79=Glow current too high;80=Fuel holding magnet current too high;81=Stop solenoid hold coil current too high;82=Stop solenoid pull coil current too high;83=Optional DC out current too high;84=5V output voltage too high;85=Boost output current too high;89=Starter battery voltage too high;90=Startup aborted (rotation too high);92=Rotation too high;93=Power contactor current too high;94=AC voltage L2 too high;95=AC frequency L2 too high;96=AC current L2 too high;97=AC power L2 too high;98=AC voltage L3 too high;99=AC frequency L3 too high;100=AC current L3 too high;101=AC power L3 too high;126=Fuel temperature too high;127=Fuel level too high;130=Lost control unit;131=Lost panel;132=Service needed;133=Lost 3-phase module;134=Lost AGT module;135=Synchronization failure;137=Intake airfilter;139=Lost sync. module;140=Load-balance failed;141=Sync-mode deactivated;142=Engine controller;148=Rotating field wrong;149=Fuel level sensor lost;150=Init failed;151=Watchdog;152=Out: winding;153=Out: exhaust;154=Out: Cyl. head;155=Inverter over temperature;156=Inverter overload;157=Inverter communication lost;158=Inverter sync failed;159=CAN communication lost;160=L1 overload;161=L2 overload;162=L3 overload;163=DC overload;164=DC overvoltage;165=Emergency stop;166=No connection,3214,uint16,1,R +com.victronenergy.genset,/AutoStart,u,0=Disabled;1=Enabled,3215,uint16,1,R +com.victronenergy.genset,/Start,u,0=Stop;1=Start,3223,uint16,1,W +com.victronenergy.genset,/Engine/Load,d,%,3216,uint16,1,R +com.victronenergy.genset,/Engine/Speed,d,RPM,3217,uint16,1,R +com.victronenergy.genset,/Engine/OperatingHours,d,s,3218,uint16,0.01,R +com.victronenergy.genset,/Engine/CoolantTemperature,d,Degrees celsius,3219,int16,10,R +com.victronenergy.genset,/Engine/WindingTemperature,d,Degrees celsius,3220,int16,10,R +com.victronenergy.genset,/Engine/ExaustTemperature,d,Degrees celsius,3221,int16,10,R +com.victronenergy.genset,/StarterVoltage,d,V DC,3222,uint16,100,R +com.victronenergy.genset,/Ac/L1/Voltage,d,V AC,3200,uint16,10,R +com.victronenergy.genset,/Ac/L1/Current,d,A AC,3203,int16,10,R +com.victronenergy.genset,/Ac/L1/Power,d,W,3206,int16,1,R +com.victronenergy.genset,/Ac/L1/Frequency,d,Hz,3209,uint16,100,R +com.victronenergy.genset,/Ac/L2/Voltage,d,V AC,3201,uint16,10,R +com.victronenergy.genset,/Ac/L2/Current,d,A AC,3204,int16,10,R +com.victronenergy.genset,/Ac/L2/Power,d,W,3207,int16,1,R +com.victronenergy.genset,/Ac/L2/Frequency,d,Hz,3210,uint16,100,R +com.victronenergy.genset,/Ac/L3/Voltage,d,V AC,3202,uint16,10,R +com.victronenergy.genset,/Ac/L3/Current,d,A AC,3205,int16,10,R +com.victronenergy.genset,/Ac/L3/Power,d,W,3208,int16,1,R +com.victronenergy.genset,/Ac/L3/Frequency,d,Hz,3211,uint16,100,R +com.victronenergy.temperature,/ProductId,u,,3300,uint16,1,R +com.victronenergy.temperature,/Scale,d,,3301,uint16,100,R +com.victronenergy.temperature,/Offset,d,,3302,int16,100,R +com.victronenergy.temperature,/TemperatureType,u,0=Battery;1=Fridge;2=Generic,3303,uint16,1,R +com.victronenergy.temperature,/Temperature,d,Degrees celsius,3304,int16,100,R +com.victronenergy.temperature,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3305,uint16,1,R +com.victronenergy.pulsemeter,/Aggregate,i,,3400,uint32,1,R +com.victronenergy.pulsemeter,/Count,i,,3402,uint32,1,R +com.victronenergy.digitalinput,/Count,i,,3420,uint32,1,R +com.victronenergy.digitalinput,/State,i,,3422,uint16,1,R +com.victronenergy.digitalinput,/Alarm,i,0=No alarm;2=Alarm,3423,uint16,1,R +com.victronenergy.digitalinput,/Type,i,2=Door;3=Bilge pump;4=Bilge alarm;5=Burglar alarm;6=Smoke alarm;7=Fire alarm;8=CO2 alarm;9=Generator;10=ExtTransferSwitch,3424,uint16,1,R +com.victronenergy.generator,/Generator0/ManualStart,i,0=Stop generator;1=Start generator,3500,uint16,1,W +com.victronenergy.generator,/Generator0/RunningByConditionCode,i,0=Stopped;1=Manual;2=TestRun;3=LossOfComms;4=Soc;5=AcLoad;6=BatteryCurrent;7=BatteryVoltage;8=InverterTemperatur;9=InverterOverload;10=StopOnAc1,3501,uint16,1,R +com.victronenergy.generator,/Generator0/Runtime,i,seconds,3502,uint16,1,R +com.victronenergy.generator,/Generator0/Runtime,u,seconds,3504,uint32,1,R +com.victronenergy.generator,/Generator0/State,i,0=Stopped;1=Running;10=Error,3506,uint16,1,R +com.victronenergy.generator,/Generator0/Error,i,0=No Error;1=Remote disabled;2=Remote fault,3507,uint16,1,R +com.victronenergy.generator,/Generator0/Alarms/NoGeneratorAtAcIn,i,0=No Alarm;2=Alarm,3508,uint16,1,R +com.victronenergy.meteo,/Irradiance,d,W/m^2,3600,uint16,10,R +com.victronenergy.meteo,/WindSpeed,d,m/s,3601,uint16,10,R +com.victronenergy.meteo,/CellTemperature,d,Degrees celsius,3602,int16,10,R +com.victronenergy.meteo,/ExternalTemperature,d,Degrees celsius,3603,int16,10,R +com.victronenergy.evcharger,/ProductId,u,,3800,uint16,1,R +com.victronenergy.evcharger,/FirmwareVersion,u,,3802,uint32,1,R +com.victronenergy.evcharger,/Serial,s,,3804,string[6],,R +com.victronenergy.evcharger,/Model,s,,3810,string[4],,R +com.victronenergy.evcharger,/MaxCurrent,d,A,3814,uint16,1,W +com.victronenergy.evcharger,/Mode,u,0=Manual;1=Auto,3815,uint16,1,W +com.victronenergy.evcharger,/Ac/Energy/Forward,d,kWh,3816,uint32,100,R +com.victronenergy.evcharger,/Ac/L1/Power,d,W,3818,uint16,1,R +com.victronenergy.evcharger,/Ac/L2/Power,d,W,3819,uint16,1,R +com.victronenergy.evcharger,/Ac/L3/Power,d,W,3820,uint16,1,R +com.victronenergy.evcharger,/Ac/Power,d,W,3821,uint16,1,R +com.victronenergy.evcharger,/ChargingTime,d,s,3822,uint16,0.01,R +com.victronenergy.evcharger,/Current,d,A,3823,uint16,1,W +com.victronenergy.evcharger,/Status,u,0=Disconnected; 1=Connected; 2=Charging; 3=Charged; 4=Waiting for sun; 5=Waiting for RFID; 6=Waiting for start; 7=Low SOC; 8=Ground fault; 9=Welded contacts; 10=CP Input shorted; 11=Residual current detected; 12=Under voltage detected; 13=Overvoltage detected; 14=Overheating detected,3824,uint16,1,R +com.victronenergy.evcharger,/SetCurrent,d,A,3825,uint16,1,W +com.victronenergy.evcharger,/StartStop,u,0=Stop;1=Start,3826,uint16,1,W diff --git a/FileSets/v2.73/attributes.csv.orig b/FileSets/v2.73/attributes.csv.orig new file mode 100644 index 00000000..88c6af36 --- /dev/null +++ b/FileSets/v2.73/attributes.csv.orig @@ -0,0 +1,448 @@ +com.victronenergy.gps,/Position/Latitude,d,Decimal degrees,2800,int32,10000000,R +com.victronenergy.gps,/Position/Longitude,d,Decimal degrees,2802,int32,10000000,R +com.victronenergy.gps,/Course,d,Degrees,2804,uint16,100,R +com.victronenergy.gps,/Speed,d,m/s,2805,uint16,100,R +com.victronenergy.gps,/Fix,y,,2806,uint16,1,R +com.victronenergy.gps,/NrOfSatellites,y,,2807,uint16,1,R +com.victronenergy.gps,/Altitude,d,m,2808,int32,10,R +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/State,i,0=BL disabled;1=Restarting;2=Self-consumption;3=Self-consumption;4=Self-consumption;5=Discharge disabled;6=Force charge;7=Sustain;9=Keep batteries charged;10=BL Disabled;11=BL Disabled (Low SoC),2900,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/MinimumSocLimit,d,%,2901,uint16,10,W +com.victronenergy.settings,/Settings/CGwacs/Hub4Mode,i,1=ESS with Phase Compensation;2=ESS without phase compensation;3=Disabled/External Control,2902,uint16,1,W +com.victronenergy.vebus,/Interfaces/Mk2/Version,u,,1,,,R +com.victronenergy.vebus,/Devices/0/Version,u,,2,,,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/V,d,V AC,3,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/V,d,V AC,4,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/V,d,V AC,5,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/I,d,A AC,6,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/I,d,A AC,7,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/I,d,A AC,8,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/F,d,Hz,9,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/F,d,Hz,10,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/F,d,Hz,11,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/P,i,VA or Watts,12,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/P,i,VA or Watts,13,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/P,i,VA or Watts,14,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L1/V,d,V AC,15,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L2/V,d,V AC,16,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L3/V,d,V AC,17,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L1/I,d,A AC,18,int16,10,R +com.victronenergy.vebus,/Ac/Out/L2/I,d,A AC,19,int16,10,R +com.victronenergy.vebus,/Ac/Out/L3/I,d,A AC,20,int16,10,R +com.victronenergy.vebus,/Ac/Out/L1/F,d,Hz,21,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/CurrentLimit,d,A,22,int16,10,W +com.victronenergy.vebus,/Ac/Out/L1/P,i,VA or Watts,23,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L2/P,i,VA or Watts,24,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L3/P,i,VA or Watts,25,int16,0.1,R +com.victronenergy.vebus,/Dc/0/Voltage,d,V DC,26,uint16,100,R +com.victronenergy.vebus,/Dc/0/Current,d,A DC,27,int16,10,R +com.victronenergy.vebus,/Ac/NumberOfPhases,u,count,28,uint16,1,R +com.victronenergy.vebus,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,29,uint16,1,R +com.victronenergy.vebus,/Soc,d,%,30,uint16,10,W +com.victronenergy.vebus,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=Bulk protection,31,uint16,1,R +com.victronenergy.vebus,/VebusError,u,0=No error;1=VE.Bus Error 1: Device is switched off because one of the other phases in the system has switched off;2=VE.Bus Error 2: New and old types MK2 are mixed in the system;3=VE.Bus Error 3: Not all- or more than- the expected devices were found in the system;4=VE.Bus Error 4: No other device whatsoever detected;5=VE.Bus Error 5: Overvoltage on AC-out;6=VE.Bus Error 6: Error in DDC Program;7=VE.Bus BMS connected- which requires an Assistant- but no assistant found;10=VE.Bus Error 10: System time synchronisation problem occurred;14=VE.Bus Error 14: Device cannot transmit data;16=VE.Bus Error 16: Dongle missing;17=VE.Bus Error 17: One of the devices assumed master status because the original master failed;18=VE.Bus Error 18: AC Overvoltage on the output of a slave has occurred while already switched off;22=VE.Bus Error 22: This device cannot function as slave;24=VE.Bus Error 24: Switch-over system protection initiated;25=VE.Bus Error 25: Firmware incompatibility. The firmware of one of the connected device is not sufficiently up to date to operate in conjunction with this device;26=VE.Bus Error 26: Internal error,32,uint16,1,R +com.victronenergy.vebus,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,33,uint16,1,W +com.victronenergy.vebus,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,34,uint16,1,R +com.victronenergy.vebus,/Alarms/LowBattery,u,0=Ok;1=Warning;2=Alarm,35,uint16,1,R +com.victronenergy.vebus,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,36,uint16,1,R +com.victronenergy.vebus,/Alarms/TemperatureSensor,u,0=Ok;1=Warning;2=Alarm,42,uint16,1,R +com.victronenergy.vebus,/Alarms/VoltageSensor,u,0=Ok;1=Warning;2=Alarm,43,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/HighTemperature,u,0=Ok;1=Warning;2=Alarm,44,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/LowBattery,u,0=Ok;1=Warning;2=Alarm,45,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Overload,u,0=Ok;1=Warning;2=Alarm,46,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Ripple,u,0=Ok;1=Warning;2=Alarm,47,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/HighTemperature,u,0=Ok;1=Warning;2=Alarm,48,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/LowBattery,u,0=Ok;1=Warning;2=Alarm,49,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Overload,u,0=Ok;1=Warning;2=Alarm,50,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Ripple,u,0=Ok;1=Warning;2=Alarm,51,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/HighTemperature,u,0=Ok;1=Warning;2=Alarm,52,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/LowBattery,u,0=Ok;1=Warning;2=Alarm,53,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Overload,u,0=Ok;1=Warning;2=Alarm,54,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Ripple,u,0=Ok;1=Warning;2=Alarm,55,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,37,int16,1,W +com.victronenergy.vebus,/Hub4/DisableCharge,u,0=Charge allowed;1=Charge disabled,38,uint16,1,W +com.victronenergy.vebus,/Hub4/DisableFeedIn,u,0=Feed in allowed;1=Feed in disabled,39,uint16,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,40,int16,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,41,int16,1,W +com.victronenergy.vebus,/PvInverter/Disable,u,0=PV enabled;1=PV disabled,56,uint16,1,W +com.victronenergy.vebus,/Bms/AllowToCharge,u,0=No;1=Yes,57,uint16,1,R +com.victronenergy.vebus,/Bms/AllowToDischarge,u,0=No;1=Yes,58,uint16,1,R +com.victronenergy.vebus,/Bms/BmsExpected,u,0=No;1=Yes,59,uint16,1,R +com.victronenergy.vebus,/Bms/Error,u,0=No;1=Yes,60,uint16,1,R +com.victronenergy.vebus,/Dc/0/Temperature,d,Degrees celsius,61,int16,10,R +com.victronenergy.vebus,/SystemReset,y,0=No action;1=VE.Bus Reset,62,uint16,1,W +com.victronenergy.vebus,/Alarms/PhaseRotation,u,0=Ok;1=Warning,63,uint16,1,R +com.victronenergy.vebus,/Alarms/GridLost,i,0=No alarm;2=Alarm,64,uint16,1,R +com.victronenergy.vebus,/Hub4/DoNotFeedInOvervoltage,i,0=Feed in overvoltage;1=Don't feed in overvoltage,65,uint16,1,W +com.victronenergy.vebus,/Hub4/L1/MaxFeedInPower,d,W,66,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L2/MaxFeedInPower,d,W,67,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L3/MaxFeedInPower,d,W,68,uint16,0.01,W +com.victronenergy.vebus,/Ac/State/IgnoreAcIn1,i,0=AC input not ignored; 1=AC input ignored,69,uint16,1,R +com.victronenergy.vebus,/Ac/State/IgnoreAcIn2,i,0=AC input not ignored; 1=AC input ignored,70,uint16,1,R +com.victronenergy.vebus,/Hub4/TargetPowerIsMaxFeedIn,i,0=AcPowerSetpoint interpreted normally; 1=AcPowerSetpoint as OvervoltageFeedIn limit,71,uint16,W +com.victronenergy.vebus,/Hub4/FixSolarOffsetTo100mV,i,0=OvervoltageFeedIn uses 1V offset; 1=OvervoltageFeedIn uses 0.1V offset,72,uint16,W +com.victronenergy.battery,/ProductId,u,,256,,,R +com.victronenergy.battery,/FirmwareVersion,u,,257,,,R +com.victronenergy.battery,/Serial,s,,258,,,R +com.victronenergy.battery,/Dc/0/Voltage,d,V DC,259,uint16,100,R +com.victronenergy.battery,/Dc/1/Voltage,d,V DC,260,uint16,100,R +com.victronenergy.battery,/Dc/0/Current,d,A DC,261,int16,10,R +com.victronenergy.battery,/Dc/0/Temperature,d,Degrees celsius,262,int16,10,R +com.victronenergy.battery,/Dc/0/MidVoltage,d,V DC,263,uint16,100,R +com.victronenergy.battery,/Dc/0/MidVoltageDeviation,d,%,264,uint16,100,R +com.victronenergy.battery,/ConsumedAmphours,d,Ah,265,uint16,-10,R +com.victronenergy.battery,/Soc,y,%,266,uint16,10,R +com.victronenergy.battery,/Soh,y,%,304,uint16,10,R +com.victronenergy.battery,/TimeToGo,q,seconds,303,uint16,0.01,R +com.victronenergy.battery,/Info/MaxChargeVoltage,u,V DC,305,uint16,10,R +com.victronenergy.battery,/Info/BatteryLowVoltage,u,V DC,306,uint16,10,R +com.victronenergy.battery,/Info/MaxChargeCurrent,u,A DC,307,uint16,10,R +com.victronenergy.battery,/Info/MaxDischargeCurrent,u,A DC,308,uint16,10,R +com.victronenergy.battery,/Alarms/Alarm,y,0=No alarm;2=Alarm,267,uint16,1,R +com.victronenergy.battery,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,268,uint16,1,R +com.victronenergy.battery,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,269,uint16,1,R +com.victronenergy.battery,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,270,uint16,1,R +com.victronenergy.battery,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,271,uint16,1,R +com.victronenergy.battery,/Alarms/LowSoc,u,0=No alarm;2=Alarm,272,uint16,1,R +com.victronenergy.battery,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,273,uint16,1,R +com.victronenergy.battery,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,274,uint16,1,R +com.victronenergy.battery,/Alarms/MidVoltage,u,0=No alarm;2=Alarm,275,uint16,1,R +com.victronenergy.battery,/Alarms/LowFusedVoltage,u,0=No alarm;2=Alarm,276,uint16,1,R +com.victronenergy.battery,/Alarms/HighFusedVoltage,u,0=No alarm;2=Alarm,277,uint16,1,R +com.victronenergy.battery,/Alarms/FuseBlown,u,0=No alarm;2=Alarm,278,uint16,1,R +com.victronenergy.battery,/Alarms/HighInternalTemperature,u,0=No alarm;2=Alarm,279,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeCurrent,u,0=No alarm;2=Alarm,320,uint16,1,R +com.victronenergy.battery,/Alarms/HighDischargeCurrent,u,0=No alarm;2=Alarm,321,uint16,1,R +com.victronenergy.battery,/Alarms/CellImbalance,u,0=No alarm;2=Alarm,322,uint16,1,R +com.victronenergy.battery,/Alarms/InternalFailure,u,0=No alarm;2=Alarm,323,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeTemperature,u,0=No alarm;2=Alarm,324,uint16,1,R +com.victronenergy.battery,/Alarms/LowChargeTemperature,u,0=No alarm;2=Alarm,325,uint16,1,R +com.victronenergy.battery,/Alarms/LowCellVoltage,u,0=No alarm;1=Almost discharged;2=Alarm,326,uint16,1,R +com.victronenergy.battery,/Relay/0/State,y,0=Open;1=Closed,280,uint16,1,W +com.victronenergy.battery,/History/DeepestDischarge,d,Ah,281,uint16,-10,R +com.victronenergy.battery,/History/LastDischarge,d,Ah,282,uint16,-10,R +com.victronenergy.battery,/History/AverageDischarge,d,Ah,283,uint16,-10,R +com.victronenergy.battery,/History/ChargeCycles,i,count,284,uint16,1,R +com.victronenergy.battery,/History/FullDischarges,i,count,285,uint16,1,R +com.victronenergy.battery,/History/TotalAhDrawn,d,Ah,286,uint16,-10,R +com.victronenergy.battery,/History/MinimumVoltage,d,V DC,287,uint16,100,R +com.victronenergy.battery,/History/MaximumVoltage,d,V DC,288,uint16,100,R +com.victronenergy.battery,/History/TimeSinceLastFullCharge,i,seconds,289,uint16,0.01,R +com.victronenergy.battery,/History/AutomaticSyncs,i,count,290,uint16,1,R +com.victronenergy.battery,/History/LowVoltageAlarms,i,count,291,uint16,1,R +com.victronenergy.battery,/History/HighVoltageAlarms,i,count,292,uint16,1,R +com.victronenergy.battery,/History/LowStarterVoltageAlarms,i,count,293,uint16,1,R +com.victronenergy.battery,/History/HighStarterVoltageAlarms,i,count,294,uint16,1,R +com.victronenergy.battery,/History/MinimumStarterVoltage,d,V DC,295,uint16,100,R +com.victronenergy.battery,/History/MaximumStarterVoltage,d,V DC,296,uint16,100,R +com.victronenergy.battery,/History/LowFusedVoltageAlarms,i,count,297,uint16,1,R +com.victronenergy.battery,/History/HighFusedVoltageAlarms,i,count,298,uint16,1,R +com.victronenergy.battery,/History/MinimumFusedVoltage,d,V DC,299,uint16,100,R +com.victronenergy.battery,/History/MaximumFusedVoltage,d,V DC,300,uint16,100,R +com.victronenergy.battery,/History/DischargedEnergy,d,kWh,301,uint16,10,R +com.victronenergy.battery,/History/ChargedEnergy,d,kWh,302,uint16,10,R +com.victronenergy.battery,/Capacity,d,Ah,309,uint16,10,R +com.victronenergy.battery,/State,y,0=Initializing (Wait start);1=Initializing (before boot);2=Initializing (Before boot delay);3=Initializing (Wait boot);4=Initializing;5=Initializing (Measure battery voltage);6=Initializing (Calculate battery voltage);7=Initializing (Wait bus voltage);8=Initializing (Wait for lynx shunt);9=Running;10=Error (10);11=Error (11),1282,uint16,1,R +com.victronenergy.battery,/ErrorCode,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1283,uint16,1,R +com.victronenergy.battery,/SystemSwitch,y,0=Disabled;1=Enabled,1284,uint16,1,R +com.victronenergy.battery,/Balancing,y,0=Inactive;1=Active,1285,uint16,1,R +com.victronenergy.battery,/System/NrOfBatteries,y,count,1286,uint16,1,R +com.victronenergy.battery,/System/BatteriesParallel,y,count,1287,uint16,1,R +com.victronenergy.battery,/System/BatteriesSeries,y,count,1288,uint16,1,R +com.victronenergy.battery,/System/NrOfCellsPerBattery,y,count,1289,uint16,1,R +com.victronenergy.battery,/System/MinCellVoltage,d,V DC,1290,uint16,100,R +com.victronenergy.battery,/System/MaxCellVoltage,d,V DC,1291,uint16,100,R +com.victronenergy.battery,/Diagnostics/ShutDownsDueError,q,count,1292,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1293,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1294,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1295,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1296,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Time,u,,310,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Time,u,,312,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Time,u,,314,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Time,u,,316,int32,1,R +com.victronenergy.battery,/System/MinCellTemperature,d,Degrees celsius,318,int16,10,R +com.victronenergy.battery,/System/MaxCellTemperature,d,Degrees celsius,319,int16,10,R +com.victronenergy.battery,/Io/AllowToCharge,y,0=No;1=Yes,1297,uint16,1,R +com.victronenergy.battery,/Io/AllowToDischarge,y,0=No;1=Yes,1298,uint16,1,R +com.victronenergy.battery,/Io/ExternalRelay,y,0=Inactive;1=Active,1299,uint16,1,R +com.victronenergy.battery,/History/MinimumCellVoltage,d,V DC,1300,uint16,100,R +com.victronenergy.battery,/History/MaximumCellVoltage,d,V DC,1301,uint16,100,R +com.victronenergy.solarcharger,/ProductId,u,,768,,,R +com.victronenergy.solarcharger,/FirmwareVersion,u,,769,,,R +com.victronenergy.solarcharger,/Serial,s,,770,,,R +com.victronenergy.solarcharger,/Dc/0/Voltage,d,V DC,771,uint16,100,R +com.victronenergy.solarcharger,/Dc/0/Current,d,A DC,772,int16,10,R +com.victronenergy.solarcharger,/Dc/0/Temperature,d,Degrees celsius,773,int16,10,R +com.victronenergy.solarcharger,/Mode,i,1=On;4=Off,774,uint16,1,W +com.victronenergy.solarcharger,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;11=Other (Hub-1);252=Hub-1,775,uint16,1,R +com.victronenergy.solarcharger,/Pv/V,d,V DC,776,uint16,100,R +com.victronenergy.solarcharger,/Pv/I,d,A DC,777,int16,10,R +com.victronenergy.solarcharger,/Yield/Power,d,W,789,uint16,10,R +com.victronenergy.solarcharger,/Equalization/Pending,i,0=No;1=Yes;2=Error;3=Unavailable- Unknown,778,uint16,1,R +com.victronenergy.solarcharger,/Equalization/TimeRemaining,d,seconds,779,uint16,10,R +com.victronenergy.solarcharger,/Relay/0/State,i,0=Open;1=Closed,780,uint16,1,R +com.victronenergy.solarcharger,/Alarms/Alarm,i,0=No alarm;2=Alarm,781,uint16,1,R +com.victronenergy.solarcharger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,782,uint16,1,R +com.victronenergy.solarcharger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,783,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Yield,d,kWh,784,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/MaxPower,d,W,785,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Yield,d,kWh,786,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/MaxPower,d,W,787,uint16,1,R +com.victronenergy.solarcharger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,788,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,790,uint16,10,R +com.victronenergy.solarcharger,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,791,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/V,d,V DC,3700,uint16,100,R +com.victronenergy.solarcharger,/Pv/1/V,d,V DC,3701,uint16,100,R +com.victronenergy.solarcharger,/Pv/2/V,d,V DC,3702,uint16,100,R +com.victronenergy.solarcharger,/Pv/3/V,d,V DC,3703,uint16,100,R +com.victronenergy.solarcharger,/Pv/0/I,d,A DC,3704,int16,10,R +com.victronenergy.solarcharger,/Pv/1/I,d,A DC,3705,int16,10,R +com.victronenergy.solarcharger,/Pv/2/I,d,A DC,3706,int16,10,R +com.victronenergy.solarcharger,/Pv/3/I,d,A DC,3707,int16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/Yield,d,kWh,3708,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/Yield,d,kWh,3709,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/Yield,d,kWh,3710,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/Yield,d,kWh,3711,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/Yield,d,kWh,3712,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/Yield,d,kWh,3713,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/Yield,d,kWh,3714,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/Yield,d,kWh,3715,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/MaxPower,d,W,3716,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/MaxPower,d,W,3717,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/MaxPower,d,W,3718,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/MaxPower,d,W,3719,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/MaxPower,d,W,3720,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/MaxPower,d,W,3721,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/MaxPower,d,W,3722,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/MaxPower,d,W,3723,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L1/Power,d,W,808,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L2/Power,d,W,809,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L3/Power,d,W,810,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L1/Power,d,W,811,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L2/Power,d,W,812,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L3/Power,d,W,813,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L1/Power,d,W,814,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L2/Power,d,W,815,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L3/Power,d,W,816,uint16,1,R +com.victronenergy.system,/Dc/Pv/Power,d,W,850,uint16,1,R +com.victronenergy.system,/Dc/Pv/Current,d,A DC,851,int16,10,R +com.victronenergy.system,/Dc/Charger/Power,d,W,855,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L1/Power,d,W,817,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L2/Power,d,W,818,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L3/Power,d,W,819,uint16,1,R +com.victronenergy.system,/Ac/Grid/L1/Power,d,W,820,int16,1,R +com.victronenergy.system,/Ac/Grid/L2/Power,d,W,821,int16,1,R +com.victronenergy.system,/Ac/Grid/L3/Power,d,W,822,int16,1,R +com.victronenergy.system,/Ac/Genset/L1/Power,d,W,823,int16,1,R +com.victronenergy.system,/Ac/Genset/L2/Power,d,W,824,int16,1,R +com.victronenergy.system,/Ac/Genset/L3/Power,d,W,825,int16,1,R +com.victronenergy.system,/Ac/ActiveIn/Source,u,0=Not available;1=Grid;2=Generator;3=Shore power;240=Not connected,826,int16,1,R +com.victronenergy.system,/Dc/System/Power,d,W,860,int16,1,R +com.victronenergy.system,/Dc/Battery/Voltage,d,V DC,840,uint16,10,R +com.victronenergy.system,/Dc/Battery/Current,d,A DC,841,int16,10,R +com.victronenergy.system,/Dc/Battery/Power,d,W,842,int16,1,R +com.victronenergy.system,/Dc/Vebus/Current,d,A DC,865,int16,10,R +com.victronenergy.system,/Dc/Vebus/Power,d,W,866,int16,1,R +com.victronenergy.system,/Dc/Battery/Soc,d,%,843,uint16,1,R +com.victronenergy.system,/Dc/Battery/State,i,0=idle;1=charging;2=discharging,844,uint16,1,R +com.victronenergy.system,/Dc/Battery/ConsumedAmphours,d,Ah,845,uint16,-10,R +com.victronenergy.system,/Dc/Battery/TimeToGo,d,s,846,uint16,0.01,R +com.victronenergy.system,/Relay/0/State,i,0=Open;1=Closed,806,uint16,1,W +com.victronenergy.system,/Relay/1/State,i,0=Open;1=Closed,807,uint16,1,W +com.victronenergy.system,/Serial,s,,800,string[6],1,R +com.victronenergy.pvinverter,/ProductId,u,,1024,,,R +com.victronenergy.pvinverter,/FirmwareVersion,s,,1025,,,R +com.victronenergy.pvinverter,/Position,i,0=AC input 1;1=AC output;2=AC input 2,1026,uint16,1,R +com.victronenergy.pvinverter,/Serial,s,,1039,string[7],1,R +com.victronenergy.pvinverter,/Ac/L1/Voltage,d,V AC,1027,uint16,10,R +com.victronenergy.pvinverter,/Ac/L1/Current,d,A AC,1028,int16,10,R +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1029,uint16,1,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1030,uint16,100,R +com.victronenergy.pvinverter,/Ac/L2/Voltage,d,V AC,1031,uint16,10,R +com.victronenergy.pvinverter,/Ac/L2/Current,d,A AC,1032,int16,10,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1033,uint16,1,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1034,uint16,100,R +com.victronenergy.pvinverter,/Ac/L3/Voltage,d,V AC,1035,uint16,10,R +com.victronenergy.pvinverter,/Ac/L3/Current,d,A AC,1036,int16,10,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1037,uint16,1,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1038,uint16,100,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1046,uint32,100,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1048,uint32,100,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1050,uint32,100,R +com.victronenergy.pvinverter,/Ac/Power,i,kW,1052,int32,1,W +com.victronenergy.pvinverter,/Ac/MaxPower,u,kW,1054,uint32,1,W +com.victronenergy.pvinverter,/Ac/PowerLimit,u,kW,1056,uint32,1,W +com.victronenergy.motordrive,/Motor/RPM,d,RPM,2048,int16,1,R +com.victronenergy.motordrive,/Motor/Temperature,d,Degrees celsius,2049,int16,10,R +com.victronenergy.motordrive,/Dc/0/Voltage,d,V DC,2050,uint16,100,R +com.victronenergy.motordrive,/Dc/0/Current,d,A DC,2051,int16,10,R +com.victronenergy.motordrive,/Dc/0/Power,d,W,2052,int16,10,R +com.victronenergy.motordrive,/Controller/Temperature,d,Degrees celsius,2053,int16,10,R +com.victronenergy.charger,/ProductId,,,2304,,,R +com.victronenergy.charger,/FirmwareVersion,,,2305,,,R +com.victronenergy.charger,/Serial,,,2306,,,R +com.victronenergy.charger,/Dc/0/Voltage,d,V DC,2307,uint16,100,R +com.victronenergy.charger,/Dc/0/Current,d,A DC,2308,int16,10,R +com.victronenergy.charger,/Dc/0/Temperature,d,Degrees celsius,2309,int16,10,R +com.victronenergy.charger,/Dc/1/Voltage,d,V DC,2310,uint16,100,R +com.victronenergy.charger,/Dc/1/Current,d,A DC,2311,int16,10,R +com.victronenergy.charger,/Dc/2/Voltage,d,V DC,2312,uint16,100,R +com.victronenergy.charger,/Dc/2/Current,d,A DC,2313,int16,10,R +com.victronenergy.charger,/Ac/In/L1/I,d,A AC,2314,int16,10,R +com.victronenergy.charger,/Ac/In/L1/P,d,W DC,2315,uint16,1,R +com.victronenergy.charger,/Ac/In/CurrentLimit,d,A AC,2316,int16,10,W +com.victronenergy.charger,/Mode,i,0=Off;1=On;2=Error;3=Unavailable- Unknown,2317,uint16,1,W +com.victronenergy.charger,/State,i,0=Off;1=Low Power Mode;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply mode;252=Bulk protection,2318,uint16,1,R +com.victronenergy.charger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,2319,uint16,1,R +com.victronenergy.charger,/Relay/0/State,i,0=Open;1=Closed,2320,uint16,1,R +com.victronenergy.charger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,2321,uint16,1,R +com.victronenergy.charger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,2322,uint16,1,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2600,int16,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2601,int16,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2602,int16,1,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2603,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2604,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2605,uint16,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2606,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2607,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2608,uint16,100,R +com.victronenergy.grid,/Serial,s,,2609,string[7],,R +com.victronenergy.grid,/Ac/L1/Voltage,d,V AC,2616,uint16,10,R +com.victronenergy.grid,/Ac/L1/Current,d,A AC,2617,int16,10,R +com.victronenergy.grid,/Ac/L2/Voltage,d,V AC,2618,uint16,10,R +com.victronenergy.grid,/Ac/L2/Current,d,A AC,2619,int16,10,R +com.victronenergy.grid,/Ac/L3/Voltage,d,V AC,2620,uint16,10,R +com.victronenergy.grid,/Ac/L3/Current,d,A AC,2621,int16,10,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2622,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2624,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2626,uint32,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2628,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2630,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2632,uint32,100,R +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2700,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2703,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/MaxChargePercentage,d,%,2701,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePercentage,d,%,2702,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePower,d,W,2704,uint16,0.1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeCurrent,d,A,2705,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxFeedInPower,d,W,2706,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/OvervoltageFeedIn,i,0=Don't feed excess DC-coupled PV into grid;1=Feed excess DC-coupled PV into the grid,2707,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/PreventFeedback,i,0=Feed excess AC-coupled PV into grid;1=Don't feed excess AC-coupled PV into the grid,2708,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeVoltage,d,V,2710,uint16,1,V +com.victronenergy.hub4,/PvPowerLimiterActive,i,0=Feed-in limiting inactive;1=Feed-in limiting active,2709,uint16,1,R +com.victronenergy.tank,/ProductId,u,,3000,uint16,1,R +com.victronenergy.tank,/Capacity,d,m3,3001,uint32,10000,R +com.victronenergy.tank,/FluidType,u,0=Fuel;1=Fresh water;2=Waste water;3=Live well;4=Oil;5=Black water (sewage),3003,uint16,1,R +com.victronenergy.tank,/Level,d,%,3004,uint16,10,R +com.victronenergy.tank,/Remaining,d,m3,3005,uint32,10000,R +com.victronenergy.tank,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3007,uint16,1,R +com.victronenergy.inverter,/ProductId,u,,3127,uint16,1,R +com.victronenergy.inverter,/FirmwareVersion,u,,3125,uint16,1,R +com.victronenergy.inverter,/Ac/Out/L1/I,d,A AC,3100,int16,10,R +com.victronenergy.inverter,/Ac/Out/L1/V,d,V AC,3101,uint16,10,R +com.victronenergy.inverter,/Ac/Out/L1/P,d,W AC,3102,int16,0.1,R +com.victronenergy.inverter,/Alarms/HighTemperature,u,0=No alarm;1=Warning;2=Alarm,3110,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltage,u,0=No alarm;1=Warning;2=Alarm,3111,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3112,uint16,1,R +com.victronenergy.inverter,/Alarms/LowTemperature,u,0=No alarm;1=Warning;2=Alarm,3113,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltage,u,0=No alarm;1=Warning;2=Alarm,3114,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3115,uint16,1,R +com.victronenergy.inverter,/Alarms/Overload,u,0=No alarm;1=Warning;2=Alarm,3116,uint16,1,R +com.victronenergy.inverter,/Alarms/Ripple,u,0=No alarm;1=Warning;2=Alarm,3117,uint16,1,R +com.victronenergy.inverter,/Dc/0/Voltage,d,V DC,3105,uint16,100,R +com.victronenergy.inverter,/Dc/0/Current,d,A DC,3106,int16,10,R +com.victronenergy.inverter,/Mode,u,2=On;4=Off;5=Eco,3126,uint16,1,W +com.victronenergy.inverter,/State,u,0=Off;1=Low power mode (search mode);2=Fault;9=Inverting (on),3128,uint16,1,R +com.victronenergy.inverter,/Energy/InverterToAcOut,d,kWh,3130,uint32,100,R +com.victronenergy.inverter,/Energy/OutToInverter,d,kWh,3132,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToAcOut,d,kWh,3134,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToBattery,d,kWh,3136,uint32,100,R +com.victronenergy.inverter,/Pv/V,d,V DC,3138,uint16,10,R +com.victronenergy.inverter,/Pv/I,d,A DC,3139,uint16,10,R +com.victronenergy.inverter,/Pv/0/V,d,V DC,3140,uint16,10,R +com.victronenergy.inverter,/Pv/1/V,d,V DC,3141,uint16,10,R +com.victronenergy.inverter,/Pv/2/V,d,V DC,3142,uint16,10,R +com.victronenergy.inverter,/Pv/3/V,d,V DC,3143,uint16,10,R +com.victronenergy.inverter,/Pv/0/I,d,A DC,3144,uint16,10,R +com.victronenergy.inverter,/Pv/1/I,d,A DC,3145,uint16,10,R +com.victronenergy.inverter,/Pv/2/I,d,A DC,3146,uint16,10,R +com.victronenergy.inverter,/Pv/3/I,d,A DC,3147,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/Yield,d,kWh,3148,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/Yield,d,kWh,3149,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/Yield,d,kWh,3150,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/Yield,d,kWh,3151,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/Yield,d,kWh,3152,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/Yield,d,kWh,3153,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/Yield,d,kWh,3154,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/Yield,d,kWh,3155,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/MaxPower,d,W,3156,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/MaxPower,d,W,3157,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/MaxPower,d,W,3158,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/MaxPower,d,W,3159,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/MaxPower,d,W,3160,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/MaxPower,d,W,3161,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/MaxPower,d,W,3162,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/MaxPower,d,W,3163,uint16,1,R +com.victronenergy.genset,/ProductId,u,,3212,uint16,1,R +com.victronenergy.genset,/StatusCode,u,0=Standby;1=Startup 1;2=Startup 2;3=Startup 3;4=Startup 4;5=Startup 5;6=Startup 6;7=Startup 7;8=Running;9=Stopping;10=Error,3213,uint16,1,R +com.victronenergy.genset,/ErrorCode,u,0=No error;1=AC voltage L1 too low;2=AC frequency L1 too low;3=AC current too low;4=AC power too low;5=Emergency stop;6=Servo current too low;7=Oil pressure too low;8=Engine temperature too low;9=Winding temperature too low;10=Exhaust temperature too low;13=Starter current too low;14=Glow current too low;15=Glow current too low;16=Fuel holding magnet current too low;17=Stop solenoid hold coil current too low;18=Stop solenoid pull coil current too low;19=Optional DC out current too low;20=5V output voltage too low;21=Boost output current too low;22=Panel supply current too high;25=Starter battery voltage too low;26=Startup aborted (rotation too low);28=Rotation too low;29=Power contactor current too low;30=AC voltage L2 too low;31=AC frequency L2 too low;32=AC current L2 too low;33=AC power L2 too low;34=AC voltage L3 too low;35=AC frequency L3 too low;36=AC current L3 too low;37=AC power L3 too low;62=Fuel temperature too low;63=Fuel level too low;65=AC voltage L1 too high;66=AC frequency too high;67=AC current too high;68=AC power too high;70=Servo current too high;71=Oil pressure too high;72=Engine temperature too high;73=Winding temperature too high;74=Exhaust temperature too low;77=Starter current too low;78=Glow current too high;79=Glow current too high;80=Fuel holding magnet current too high;81=Stop solenoid hold coil current too high;82=Stop solenoid pull coil current too high;83=Optional DC out current too high;84=5V output voltage too high;85=Boost output current too high;89=Starter battery voltage too high;90=Startup aborted (rotation too high);92=Rotation too high;93=Power contactor current too high;94=AC voltage L2 too high;95=AC frequency L2 too high;96=AC current L2 too high;97=AC power L2 too high;98=AC voltage L3 too high;99=AC frequency L3 too high;100=AC current L3 too high;101=AC power L3 too high;126=Fuel temperature too high;127=Fuel level too high;130=Lost control unit;131=Lost panel;132=Service needed;133=Lost 3-phase module;134=Lost AGT module;135=Synchronization failure;137=Intake airfilter;139=Lost sync. module;140=Load-balance failed;141=Sync-mode deactivated;142=Engine controller;148=Rotating field wrong;149=Fuel level sensor lost;150=Init failed;151=Watchdog;152=Out: winding;153=Out: exhaust;154=Out: Cyl. head;155=Inverter over temperature;156=Inverter overload;157=Inverter communication lost;158=Inverter sync failed;159=CAN communication lost;160=L1 overload;161=L2 overload;162=L3 overload;163=DC overload;164=DC overvoltage;165=Emergency stop;166=No connection,3214,uint16,1,R +com.victronenergy.genset,/AutoStart,u,0=Disabled;1=Enabled,3215,uint16,1,R +com.victronenergy.genset,/Start,u,0=Stop;1=Start,3223,uint16,1,W +com.victronenergy.genset,/Engine/Load,d,%,3216,uint16,1,R +com.victronenergy.genset,/Engine/Speed,d,RPM,3217,uint16,1,R +com.victronenergy.genset,/Engine/OperatingHours,d,s,3218,uint16,0.01,R +com.victronenergy.genset,/Engine/CoolantTemperature,d,Degrees celsius,3219,int16,10,R +com.victronenergy.genset,/Engine/WindingTemperature,d,Degrees celsius,3220,int16,10,R +com.victronenergy.genset,/Engine/ExaustTemperature,d,Degrees celsius,3221,int16,10,R +com.victronenergy.genset,/StarterVoltage,d,V DC,3222,uint16,100,R +com.victronenergy.genset,/Ac/L1/Voltage,d,V AC,3200,uint16,10,R +com.victronenergy.genset,/Ac/L1/Current,d,A AC,3203,int16,10,R +com.victronenergy.genset,/Ac/L1/Power,d,W,3206,int16,1,R +com.victronenergy.genset,/Ac/L1/Frequency,d,Hz,3209,uint16,100,R +com.victronenergy.genset,/Ac/L2/Voltage,d,V AC,3201,uint16,10,R +com.victronenergy.genset,/Ac/L2/Current,d,A AC,3204,int16,10,R +com.victronenergy.genset,/Ac/L2/Power,d,W,3207,int16,1,R +com.victronenergy.genset,/Ac/L2/Frequency,d,Hz,3210,uint16,100,R +com.victronenergy.genset,/Ac/L3/Voltage,d,V AC,3202,uint16,10,R +com.victronenergy.genset,/Ac/L3/Current,d,A AC,3205,int16,10,R +com.victronenergy.genset,/Ac/L3/Power,d,W,3208,int16,1,R +com.victronenergy.genset,/Ac/L3/Frequency,d,Hz,3211,uint16,100,R +com.victronenergy.temperature,/ProductId,u,,3300,uint16,1,R +com.victronenergy.temperature,/Scale,d,,3301,uint16,100,R +com.victronenergy.temperature,/Offset,d,,3302,int16,100,R +com.victronenergy.temperature,/TemperatureType,u,0=Battery;1=Fridge;2=Generic,3303,uint16,1,R +com.victronenergy.temperature,/Temperature,d,Degrees celsius,3304,int16,100,R +com.victronenergy.temperature,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3305,uint16,1,R +com.victronenergy.pulsemeter,/Aggregate,i,,3400,uint32,1,R +com.victronenergy.pulsemeter,/Count,i,,3402,uint32,1,R +com.victronenergy.digitalinput,/Count,i,,3420,uint32,1,R +com.victronenergy.digitalinput,/State,i,,3422,uint16,1,R +com.victronenergy.digitalinput,/Alarm,i,0=No alarm;2=Alarm,3423,uint16,1,R +com.victronenergy.digitalinput,/Type,i,2=Door;3=Bilge pump;4=Bilge alarm;5=Burglar alarm;6=Smoke alarm;7=Fire alarm;8=CO2 alarm,3424,uint16,1,R +com.victronenergy.generator,/Generator0/ManualStart,i,0=Stop generator;1=Start generator,3500,uint16,1,W +com.victronenergy.generator,/Generator0/RunningByConditionCode,i,0=Stopped;1=Manual;2=TestRun;3=LossOfComms;4=Soc;5=AcLoad;6=BatteryCurrent;7=BatteryVoltage;8=InverterTemperatur;9=InverterOverload;10=StopOnAc1,3501,uint16,1,R +com.victronenergy.generator,/Generator0/Runtime,i,seconds,3502,uint16,1,R +com.victronenergy.generator,/Generator0/Runtime,u,seconds,3504,uint32,1,R +com.victronenergy.generator,/Generator0/State,i,0=Stopped;1=Running;10=Error,3506,uint16,1,R +com.victronenergy.generator,/Generator0/Error,i,0=No Error;1=Remote disabled;2=Remote fault,3507,uint16,1,R +com.victronenergy.generator,/Generator0/Alarms/NoGeneratorAtAcIn,i,0=No Alarm;2=Alarm,3508,uint16,1,R +com.victronenergy.meteo,/Irradiance,d,W/m^2,3600,uint16,10,R +com.victronenergy.meteo,/WindSpeed,d,m/s,3601,uint16,10,R +com.victronenergy.meteo,/CellTemperature,d,Degrees celsius,3602,int16,10,R +com.victronenergy.meteo,/ExternalTemperature,d,Degrees celsius,3603,int16,10,R +com.victronenergy.evcharger,/ProductId,u,,3800,uint16,1,R +com.victronenergy.evcharger,/FirmwareVersion,u,,3802,uint32,1,R +com.victronenergy.evcharger,/Serial,s,,3804,string[6],,R +com.victronenergy.evcharger,/Model,s,,3810,string[4],,R +com.victronenergy.evcharger,/MaxCurrent,d,A,3814,uint16,1,W +com.victronenergy.evcharger,/Mode,u,0=Manual;1=Auto,3815,uint16,1,W +com.victronenergy.evcharger,/Ac/Energy/Forward,d,kWh,3816,uint32,100,R +com.victronenergy.evcharger,/Ac/L1/Power,d,W,3818,uint16,1,R +com.victronenergy.evcharger,/Ac/L2/Power,d,W,3819,uint16,1,R +com.victronenergy.evcharger,/Ac/L3/Power,d,W,3820,uint16,1,R +com.victronenergy.evcharger,/Ac/Power,d,W,3821,uint16,1,R +com.victronenergy.evcharger,/ChargingTime,d,s,3822,uint16,0.01,R +com.victronenergy.evcharger,/Current,d,A,3823,uint16,1,W +com.victronenergy.evcharger,/Status,u,0=Disconnected; 1=Connected; 2=Charging; 3=Charged; 4=Waiting for sun; 5=Waiting for RFID; 6=Waiting for start; 7=Low SOC; 8=Ground fault; 9=Welded contacts; 10=CP Input shorted; 11=Residual current detected; 12=Under voltage detected; 13=Overvoltage detected; 14=Overheating detected,3824,uint16,1,R +com.victronenergy.evcharger,/SetCurrent,d,A,3825,uint16,1,W +com.victronenergy.evcharger,/StartStop,u,0=Stop;1=Start,3826,uint16,1,W diff --git a/FileSets/v2.73/dbus_digitalinputs.py b/FileSets/v2.73/dbus_digitalinputs.py new file mode 100755 index 00000000..0a9652b0 --- /dev/null +++ b/FileSets/v2.73/dbus_digitalinputs.py @@ -0,0 +1,556 @@ +#!/usr/bin/python -u + +#### modified for ExtTransferSwitch package + +import sys, os +import signal +from threading import Thread +from select import select, epoll, EPOLLPRI +from functools import partial +from collections import namedtuple +from argparse import ArgumentParser +import traceback +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) + +from dbus.mainloop.glib import DBusGMainLoop +import dbus +import gobject +from vedbus import VeDbusService +from settingsdevice import SettingsDevice + +VERSION = '0.11' +MAXCOUNT = 2**31-1 +SAVEINTERVAL = 60000 + +INPUT_FUNCTION_COUNTER = 1 +INPUT_FUNCTION_INPUT = 2 + +Translation = namedtuple('Translation', ['no', 'yes']) + +# Only append at the end +INPUTTYPES = [ + 'Disabled', + 'Pulse meter', + 'Door', + 'Bilge pump', + 'Bilge alarm', + 'Burglar alarm', + 'Smoke alarm', + 'Fire alarm', + 'CO2 alarm', + 'Generator', +#### added for ExtTransferSwitch package + 'Generic I/O', #added to make following entry line up across versions +#### added for ExtTransferSwitch package -- must be LAST in the list + 'Transfer switch' +] + +# Translations. The text will be used only for GetText, it will be translated +# in the gui. +TRANSLATIONS = [ + Translation('low', 'high'), + Translation('off', 'on'), + Translation('no', 'yes'), + Translation('open', 'closed'), + Translation('ok', 'alarm'), + Translation('running', 'stopped'), +#### added for ExtTransferSwitch package + Translation('on generator', 'on grid') +] + +class SystemBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SYSTEM) + +class SessionBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SESSION) + +class BasePulseCounter(object): + pass + +class DebugPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + self.gpiomap[gpio] = None + return 0 + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + for level in cycle([0, 1]): + gpios = self.gpiomap.keys() + for gpio in gpios: + yield gpio, level + sleep(0.25/len(self.gpiomap)) + +class EpollPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + self.states = {} + self.ob = epoll() + + def register(self, path, gpio): + path = os.path.realpath(path) + + # Set up gpio for rising edge interrupts + with open(os.path.join(path, 'edge'), 'ab') as fp: + fp.write('both') + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) # flush it in case it's high at startup + self.gpiomap[gpio] = fp + self.states[gpio] = level + self.ob.register(fp, EPOLLPRI) + return level + + def unregister(self, gpio): + fp = self.gpiomap[gpio] + self.ob.unregister(fp) + del self.gpiomap[gpio] + del self.states[gpio] + fp.close() + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + while True: + # We have a timeout of 1 second on the poll, because poll() only + # looks at files in the epoll object at the time poll() was called. + # The timeout means we let other files (added via calls to + # register/unregister) into the loop at least that often. + self.ob.poll(1) + + # When coming out of the epoll call, we read all the gpios to make + # sure we didn't miss any edges. This is a safety fallback that + # ensures everything is up to date once a second, but + # edge-triggered results are handled immediately. + # NOTE: There has not been a report of a missed interrupt yet. + # Belts and suspenders. + for gpio, fp in self.gpiomap.iteritems(): + os.lseek(fp.fileno(), 0, os.SEEK_SET) + v = int(os.read(fp.fileno(), 1)) + if v != self.states[gpio]: + self.states[gpio] = v + yield gpio, v + +class PollingPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + path = os.path.realpath(path) + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) + self.gpiomap[gpio] = [fp, level] + return level + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + while True: + for gpio, (fp, level) in self.gpiomap.iteritems(): + fp.seek(0, os.SEEK_SET) + v = int(fp.read()) + if v != level: + self.gpiomap[gpio][1] = v + yield gpio, v + sleep(1) + +class HandlerMaker(type): + """ Meta-class for keeping track of all extended classes. """ + def __init__(cls, name, bases, attrs): + if not hasattr(cls, 'handlers'): + cls.handlers = {} + else: + cls.handlers[cls.type_id] = cls + +class PinHandler(object): + product_id = 0xFFFF + _product_name = 'Generic GPIO' + dbus_name = "digital" + __metaclass__ = HandlerMaker + def __init__(self, bus, base, path, gpio, settings): + self.gpio = gpio + self.path = path + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + self.service = VeDbusService( + "{}.{}.input{:02d}".format(base, self.dbus_name, gpio), bus=bus) + + # Add objects required by ve-api + self.service.add_path('/Mgmt/ProcessName', __file__) + self.service.add_path('/Mgmt/ProcessVersion', VERSION) + self.service.add_path('/Mgmt/Connection', path) + self.service.add_path('/DeviceInstance', gpio) + self.service.add_path('/ProductId', self.product_id) + self.service.add_path('/ProductName', self.product_name) + self.service.add_path('/Connected', 1) + + # Custom name setting + def _change_name(p, v): + # This should fire a change event that will update product_name + # below. + settings['name'] = v + return True + + self.service.add_path('/CustomName', settings['name'], writeable=True, + onchangecallback=_change_name) + + # We'll count the pulses for all types of services + self.service.add_path('/Count', value=settings['count']) + + @property + def product_name(self): + return self.settings['name'] or self._product_name + + @product_name.setter + def product_name(self, v): + # Some pin types don't have an associated service (Disabled pins for + # example) + if self.service is not None: + self.service['/ProductName'] = v or self._product_name + + def deactivate(self): + self.save_count() + self.service.__del__() + del self.service + self.service = None + + @property + def level(self): + return self._level + + @level.setter + def level(self, l): + self._level = int(bool(l)) + + def toggle(self, level): + # Only increment Count on rising edge. + if level and level != self._level: + self.service['/Count'] = (self.service['/Count']+1) % MAXCOUNT + self._level = level + + def refresh(self): + """ Toggle state to last remembered state. This is called if settings + are changed so the Service can recalculate paths. """ + self.toggle(self._level) + + def save_count(self): + if self.service is not None: + self.settings['count'] = self.count + + @property + def active(self): + return self.service is not None + + @property + def count(self): + return self.service['/Count'] + + @count.setter + def count(self, v): + self.service['/Count'] = v + + @classmethod + def createHandler(cls, _type, *args, **kwargs): + if _type in cls.handlers: + return cls.handlers[_type](*args, **kwargs) + return None + + +class DisabledPin(PinHandler): + """ Place holder for a disabled pin. """ + _product_name = 'Disabled' + type_id = 0 + def __init__(self, bus, base, path, gpio, settings): + self.service = None + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + def deactivate(self): + pass + + def toggle(self, level): + self._level = level + + def save_count(self): + # Do nothing + pass + + @property + def count(self): + return self.settings['count'] + + @count.setter + def count(self, v): + pass + + def refresh(self): + pass + + +class VolumeCounter(PinHandler): + product_id = 0xA165 + _product_name = "Generic pulse meter" + dbus_name = "pulsemeter" + type_id = 1 + + def __init__(self, bus, base, path, gpio, settings): + super(VolumeCounter, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/Aggregate', value=self.count*self.rate, + gettextcallback=lambda p, v: (str(v) + ' cubic meter')) + + @property + def rate(self): + return self.settings['rate'] + + def toggle(self, level): + super(VolumeCounter, self).toggle(level) + self.service['/Aggregate'] = self.count * self.rate + +class PinAlarm(PinHandler): + product_id = 0xA166 + _product_name = "Generic digital input" + dbus_name = "digitalinput" + type_id = 0xFF + translation = 0 # low, high + + def __init__(self, bus, base, path, gpio, settings): + super(PinAlarm, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/InputState', value=0) + self.service.add_path('/State', value=self.get_state(0), + gettextcallback=lambda p, v: TRANSLATIONS[v/2][v%2]) + self.service.add_path('/Alarm', value=self.get_alarm_state(0)) + + # Also expose the type + self.service.add_path('/Type', value=self.type_id, + gettextcallback=lambda p, v: INPUTTYPES[v]) + + def toggle(self, level): + super(PinAlarm, self).toggle(level) + self.service['/InputState'] = bool(level)*1 + self.service['/State'] = self.get_state(level) + # Ensure that the alarm flag resets if the /AlarmSetting config option + # disappears. + self.service['/Alarm'] = self.get_alarm_state(level) + + def get_state(self, level): + state = level ^ self.settings['invert'] + return 2 * self.translation + state + + def get_alarm_state(self, level): + return 2 * bool( + (level ^ self.settings['invertalarm']) and self.settings['alarm']) + + +# Various types of things we might want to monitor +class DoorSensor(PinAlarm): + _product_name = "Door alarm" + type_id = 2 + translation = 3 # open, closed + +class BilgePump(PinAlarm): + _product_name = "Bilge pump" + type_id = 3 + translation = 1 # off, on + +class BilgeAlarm(PinAlarm): + _product_name = "Bilge alarm" + type_id = 4 + translation = 4 # ok, alarm + +class BurglarAlarm(PinAlarm): + _product_name = "Burglar alarm" + type_id = 5 + translation = 4 # ok, alarm + +class SmokeAlarm(PinAlarm): + _product_name = "Smoke alarm" + type_id = 6 + translation = 4 # ok, alarm + +class FireAlarm(PinAlarm): + _product_name = "Fire alarm" + type_id = 7 + translation = 4 # ok, alarm + +class CO2Alarm(PinAlarm): + _product_name = "CO2 alarm" + type_id = 8 + translation = 4 # ok, alarm + +class Generator(PinAlarm): + _product_name = "Generator" + type_id = 9 + translation = 5 # running, stopped + +#### added for ExtTransferSwitch package +class GenericIO(PinAlarm): + _product_name = "Generic I/O" + type_id = 10 + translation = 0 # low, high + +class TransferSwitch(PinAlarm): + _product_name = "External AC Input transfer switch" + type_id = 11 + translation = 5 # Grid In / Generator In + + +def dbusconnection(): + return SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else SystemBus() + + +def main(): + parser = ArgumentParser(description=sys.argv[0]) + parser.add_argument('--servicebase', + help='Base service name on dbus, default is com.victronenergy', + default='com.victronenergy') + parser.add_argument('--poll', + help='Use a different kind of polling. Options are epoll, dumb and debug', + default='epoll') + parser.add_argument('inputs', nargs='+', help='Path to digital input') + args = parser.parse_args() + + PulseCounter = { + 'debug': DebugPulseCounter, + 'poll': PollingPulseCounter, + }.get(args.poll, EpollPulseCounter) + + DBusGMainLoop(set_as_default=True) + + # Keep track of enabled services + services = {} + inputs = dict(enumerate(args.inputs, 1)) + pulses = PulseCounter() # callable that iterates over pulses + + def register_gpio(path, gpio, bus, settings): + _type = settings['inputtype'] + print "Registering GPIO {} for type {}".format(gpio, _type) + + handler = PinHandler.createHandler(_type, + bus, args.servicebase, path, gpio, settings) + services[gpio] = handler + + # Only monitor if enabled + if _type > 0: + handler.level = pulses.register(path, gpio) + handler.refresh() + + def unregister_gpio(gpio): + print "unRegistering GPIO {}".format(gpio) + pulses.unregister(gpio) + services[gpio].deactivate() + + def handle_setting_change(inp, setting, old, new): + if setting == 'inputtype': + if new: + # Get current bus and settings objects, to be reused + service = services[inp] + bus, settings = service.bus, service.settings + + # Input enabled. If already enabled, unregister the old one first. + if pulses.registered(inp): + unregister_gpio(inp) + + # Before registering the new input, reset its settings to defaults + settings['count'] = 0 + settings['invert'] = 0 + settings['invertalarm'] = 0 + settings['alarm'] = 0 + + # Register it + register_gpio(inputs[inp], inp, bus, settings) + elif old: + # Input disabled + unregister_gpio(inp) + elif setting in ('rate', 'invert', 'alarm', 'invertalarm'): + services[inp].refresh() + elif setting == 'name': + services[inp].product_name = new + elif setting == 'count': + # Don't want this triggered on a period save, so only execute + # if it has changed. + v = int(new) + s = services[inp] + if s.count != v: + s.count = v + s.refresh() + + for inp, pth in inputs.items(): + supported_settings = { + 'inputtype': ['/Settings/DigitalInput/{}/Type'.format(inp), 0, 0, len(INPUTTYPES)], + 'rate': ['/Settings/DigitalInput/{}/Multiplier'.format(inp), 0.001, 0, 1.0], + 'count': ['/Settings/DigitalInput/{}/Count'.format(inp), 0, 0, MAXCOUNT, 1], + 'invert': ['/Settings/DigitalInput/{}/InvertTranslation'.format(inp), 0, 0, 1], + 'invertalarm': ['/Settings/DigitalInput/{}/InvertAlarm'.format(inp), 0, 0, 1], + 'alarm': ['/Settings/DigitalInput/{}/AlarmSetting'.format(inp), 0, 0, 1], + 'name': ['/Settings/DigitalInput/{}/CustomName'.format(inp), '', '', ''], + } + bus = dbusconnection() + sd = SettingsDevice(bus, supported_settings, partial(handle_setting_change, inp), timeout=10) + register_gpio(pth, inp, bus, sd) + + def poll(mainloop): + from time import time + idx = 0 + + try: + for inp, level in pulses(): + # epoll object only resyncs once a second. We may receive + # a pulse for something that's been deregistered. + try: + services[inp].toggle(level) + except KeyError: + continue + except: + traceback.print_exc() + mainloop.quit() + + # Need to run the gpio polling in separate thread. Pass in the mainloop so + # the thread can kill us if there is an exception. + gobject.threads_init() + mainloop = gobject.MainLoop() + + poller = Thread(target=lambda: poll(mainloop)) + poller.daemon = True + poller.start() + + # Periodically save the counter + def save_counters(): + for inp in inputs: + services[inp].save_count() + return True + gobject.timeout_add(SAVEINTERVAL, save_counters) + + # Save counter on shutdown + signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) + + try: + mainloop.run() + except KeyboardInterrupt: + pass + finally: + save_counters() + +if __name__ == "__main__": + main() diff --git a/FileSets/v2.73/dbus_digitalinputs.py.orig b/FileSets/v2.73/dbus_digitalinputs.py.orig new file mode 100755 index 00000000..c675ae4f --- /dev/null +++ b/FileSets/v2.73/dbus_digitalinputs.py.orig @@ -0,0 +1,537 @@ +#!/usr/bin/python -u + +import sys, os +import signal +from threading import Thread +from select import select, epoll, EPOLLPRI +from functools import partial +from collections import namedtuple +from argparse import ArgumentParser +import traceback +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) + +from dbus.mainloop.glib import DBusGMainLoop +import dbus +import gobject +from vedbus import VeDbusService +from settingsdevice import SettingsDevice + +VERSION = '0.11' +MAXCOUNT = 2**31-1 +SAVEINTERVAL = 60000 + +INPUT_FUNCTION_COUNTER = 1 +INPUT_FUNCTION_INPUT = 2 + +Translation = namedtuple('Translation', ['no', 'yes']) + +# Only append at the end +INPUTTYPES = [ + 'Disabled', + 'Pulse meter', + 'Door', + 'Bilge pump', + 'Bilge alarm', + 'Burglar alarm', + 'Smoke alarm', + 'Fire alarm', + 'CO2 alarm', + 'Generator' +] + +# Translations. The text will be used only for GetText, it will be translated +# in the gui. +TRANSLATIONS = [ + Translation('low', 'high'), + Translation('off', 'on'), + Translation('no', 'yes'), + Translation('open', 'closed'), + Translation('ok', 'alarm'), + Translation('running', 'stopped') +] + +class SystemBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SYSTEM) + +class SessionBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SESSION) + +class BasePulseCounter(object): + pass + +class DebugPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + self.gpiomap[gpio] = None + return 0 + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + for level in cycle([0, 1]): + gpios = self.gpiomap.keys() + for gpio in gpios: + yield gpio, level + sleep(0.25/len(self.gpiomap)) + +class EpollPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + self.states = {} + self.ob = epoll() + + def register(self, path, gpio): + path = os.path.realpath(path) + + # Set up gpio for rising edge interrupts + with open(os.path.join(path, 'edge'), 'ab') as fp: + fp.write('both') + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) # flush it in case it's high at startup + self.gpiomap[gpio] = fp + self.states[gpio] = level + self.ob.register(fp, EPOLLPRI) + return level + + def unregister(self, gpio): + fp = self.gpiomap[gpio] + self.ob.unregister(fp) + del self.gpiomap[gpio] + del self.states[gpio] + fp.close() + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + while True: + # We have a timeout of 1 second on the poll, because poll() only + # looks at files in the epoll object at the time poll() was called. + # The timeout means we let other files (added via calls to + # register/unregister) into the loop at least that often. + self.ob.poll(1) + + # When coming out of the epoll call, we read all the gpios to make + # sure we didn't miss any edges. This is a safety fallback that + # ensures everything is up to date once a second, but + # edge-triggered results are handled immediately. + # NOTE: There has not been a report of a missed interrupt yet. + # Belts and suspenders. + for gpio, fp in self.gpiomap.iteritems(): + os.lseek(fp.fileno(), 0, os.SEEK_SET) + v = int(os.read(fp.fileno(), 1)) + if v != self.states[gpio]: + self.states[gpio] = v + yield gpio, v + +class PollingPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + path = os.path.realpath(path) + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) + self.gpiomap[gpio] = [fp, level] + return level + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + while True: + for gpio, (fp, level) in self.gpiomap.iteritems(): + fp.seek(0, os.SEEK_SET) + v = int(fp.read()) + if v != level: + self.gpiomap[gpio][1] = v + yield gpio, v + sleep(1) + +class HandlerMaker(type): + """ Meta-class for keeping track of all extended classes. """ + def __init__(cls, name, bases, attrs): + if not hasattr(cls, 'handlers'): + cls.handlers = {} + else: + cls.handlers[cls.type_id] = cls + +class PinHandler(object): + product_id = 0xFFFF + _product_name = 'Generic GPIO' + dbus_name = "digital" + __metaclass__ = HandlerMaker + def __init__(self, bus, base, path, gpio, settings): + self.gpio = gpio + self.path = path + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + self.service = VeDbusService( + "{}.{}.input{:02d}".format(base, self.dbus_name, gpio), bus=bus) + + # Add objects required by ve-api + self.service.add_path('/Mgmt/ProcessName', __file__) + self.service.add_path('/Mgmt/ProcessVersion', VERSION) + self.service.add_path('/Mgmt/Connection', path) + self.service.add_path('/DeviceInstance', gpio) + self.service.add_path('/ProductId', self.product_id) + self.service.add_path('/ProductName', self.product_name) + self.service.add_path('/Connected', 1) + + # Custom name setting + def _change_name(p, v): + # This should fire a change event that will update product_name + # below. + settings['name'] = v + return True + + self.service.add_path('/CustomName', settings['name'], writeable=True, + onchangecallback=_change_name) + + # We'll count the pulses for all types of services + self.service.add_path('/Count', value=settings['count']) + + @property + def product_name(self): + return self.settings['name'] or self._product_name + + @product_name.setter + def product_name(self, v): + # Some pin types don't have an associated service (Disabled pins for + # example) + if self.service is not None: + self.service['/ProductName'] = v or self._product_name + + def deactivate(self): + self.save_count() + self.service.__del__() + del self.service + self.service = None + + @property + def level(self): + return self._level + + @level.setter + def level(self, l): + self._level = int(bool(l)) + + def toggle(self, level): + # Only increment Count on rising edge. + if level and level != self._level: + self.service['/Count'] = (self.service['/Count']+1) % MAXCOUNT + self._level = level + + def refresh(self): + """ Toggle state to last remembered state. This is called if settings + are changed so the Service can recalculate paths. """ + self.toggle(self._level) + + def save_count(self): + if self.service is not None: + self.settings['count'] = self.count + + @property + def active(self): + return self.service is not None + + @property + def count(self): + return self.service['/Count'] + + @count.setter + def count(self, v): + self.service['/Count'] = v + + @classmethod + def createHandler(cls, _type, *args, **kwargs): + if _type in cls.handlers: + return cls.handlers[_type](*args, **kwargs) + return None + + +class DisabledPin(PinHandler): + """ Place holder for a disabled pin. """ + _product_name = 'Disabled' + type_id = 0 + def __init__(self, bus, base, path, gpio, settings): + self.service = None + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + def deactivate(self): + pass + + def toggle(self, level): + self._level = level + + def save_count(self): + # Do nothing + pass + + @property + def count(self): + return self.settings['count'] + + @count.setter + def count(self, v): + pass + + def refresh(self): + pass + + +class VolumeCounter(PinHandler): + product_id = 0xA165 + _product_name = "Generic pulse meter" + dbus_name = "pulsemeter" + type_id = 1 + + def __init__(self, bus, base, path, gpio, settings): + super(VolumeCounter, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/Aggregate', value=self.count*self.rate, + gettextcallback=lambda p, v: (str(v) + ' cubic meter')) + + @property + def rate(self): + return self.settings['rate'] + + def toggle(self, level): + super(VolumeCounter, self).toggle(level) + self.service['/Aggregate'] = self.count * self.rate + +class PinAlarm(PinHandler): + product_id = 0xA166 + _product_name = "Generic digital input" + dbus_name = "digitalinput" + type_id = 0xFF + translation = 0 # low, high + + def __init__(self, bus, base, path, gpio, settings): + super(PinAlarm, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/InputState', value=0) + self.service.add_path('/State', value=self.get_state(0), + gettextcallback=lambda p, v: TRANSLATIONS[v/2][v%2]) + self.service.add_path('/Alarm', value=self.get_alarm_state(0)) + + # Also expose the type + self.service.add_path('/Type', value=self.type_id, + gettextcallback=lambda p, v: INPUTTYPES[v]) + + def toggle(self, level): + super(PinAlarm, self).toggle(level) + self.service['/InputState'] = bool(level)*1 + self.service['/State'] = self.get_state(level) + # Ensure that the alarm flag resets if the /AlarmSetting config option + # disappears. + self.service['/Alarm'] = self.get_alarm_state(level) + + def get_state(self, level): + state = level ^ self.settings['invert'] + return 2 * self.translation + state + + def get_alarm_state(self, level): + return 2 * bool( + (level ^ self.settings['invertalarm']) and self.settings['alarm']) + + +# Various types of things we might want to monitor +class DoorSensor(PinAlarm): + _product_name = "Door alarm" + type_id = 2 + translation = 3 # open, closed + +class BilgePump(PinAlarm): + _product_name = "Bilge pump" + type_id = 3 + translation = 1 # off, on + +class BilgeAlarm(PinAlarm): + _product_name = "Bilge alarm" + type_id = 4 + translation = 4 # ok, alarm + +class BurglarAlarm(PinAlarm): + _product_name = "Burglar alarm" + type_id = 5 + translation = 4 # ok, alarm + +class SmokeAlarm(PinAlarm): + _product_name = "Smoke alarm" + type_id = 6 + translation = 4 # ok, alarm + +class FireAlarm(PinAlarm): + _product_name = "Fire alarm" + type_id = 7 + translation = 4 # ok, alarm + +class CO2Alarm(PinAlarm): + _product_name = "CO2 alarm" + type_id = 8 + translation = 4 # ok, alarm + +class Generator(PinAlarm): + _product_name = "Generator" + type_id = 9 + translation = 5 # running, stopped + + +def dbusconnection(): + return SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else SystemBus() + + +def main(): + parser = ArgumentParser(description=sys.argv[0]) + parser.add_argument('--servicebase', + help='Base service name on dbus, default is com.victronenergy', + default='com.victronenergy') + parser.add_argument('--poll', + help='Use a different kind of polling. Options are epoll, dumb and debug', + default='epoll') + parser.add_argument('inputs', nargs='+', help='Path to digital input') + args = parser.parse_args() + + PulseCounter = { + 'debug': DebugPulseCounter, + 'poll': PollingPulseCounter, + }.get(args.poll, EpollPulseCounter) + + DBusGMainLoop(set_as_default=True) + + # Keep track of enabled services + services = {} + inputs = dict(enumerate(args.inputs, 1)) + pulses = PulseCounter() # callable that iterates over pulses + + def register_gpio(path, gpio, bus, settings): + _type = settings['inputtype'] + print "Registering GPIO {} for type {}".format(gpio, _type) + + handler = PinHandler.createHandler(_type, + bus, args.servicebase, path, gpio, settings) + services[gpio] = handler + + # Only monitor if enabled + if _type > 0: + handler.level = pulses.register(path, gpio) + handler.refresh() + + def unregister_gpio(gpio): + print "unRegistering GPIO {}".format(gpio) + pulses.unregister(gpio) + services[gpio].deactivate() + + def handle_setting_change(inp, setting, old, new): + if setting == 'inputtype': + if new: + # Get current bus and settings objects, to be reused + service = services[inp] + bus, settings = service.bus, service.settings + + # Input enabled. If already enabled, unregister the old one first. + if pulses.registered(inp): + unregister_gpio(inp) + + # Before registering the new input, reset its settings to defaults + settings['count'] = 0 + settings['invert'] = 0 + settings['invertalarm'] = 0 + settings['alarm'] = 0 + + # Register it + register_gpio(inputs[inp], inp, bus, settings) + elif old: + # Input disabled + unregister_gpio(inp) + elif setting in ('rate', 'invert', 'alarm', 'invertalarm'): + services[inp].refresh() + elif setting == 'name': + services[inp].product_name = new + elif setting == 'count': + # Don't want this triggered on a period save, so only execute + # if it has changed. + v = int(new) + s = services[inp] + if s.count != v: + s.count = v + s.refresh() + + for inp, pth in inputs.items(): + supported_settings = { + 'inputtype': ['/Settings/DigitalInput/{}/Type'.format(inp), 0, 0, len(INPUTTYPES)], + 'rate': ['/Settings/DigitalInput/{}/Multiplier'.format(inp), 0.001, 0, 1.0], + 'count': ['/Settings/DigitalInput/{}/Count'.format(inp), 0, 0, MAXCOUNT, 1], + 'invert': ['/Settings/DigitalInput/{}/InvertTranslation'.format(inp), 0, 0, 1], + 'invertalarm': ['/Settings/DigitalInput/{}/InvertAlarm'.format(inp), 0, 0, 1], + 'alarm': ['/Settings/DigitalInput/{}/AlarmSetting'.format(inp), 0, 0, 1], + 'name': ['/Settings/DigitalInput/{}/CustomName'.format(inp), '', '', ''], + } + bus = dbusconnection() + sd = SettingsDevice(bus, supported_settings, partial(handle_setting_change, inp), timeout=10) + register_gpio(pth, inp, bus, sd) + + def poll(mainloop): + from time import time + idx = 0 + + try: + for inp, level in pulses(): + # epoll object only resyncs once a second. We may receive + # a pulse for something that's been deregistered. + try: + services[inp].toggle(level) + except KeyError: + continue + except: + traceback.print_exc() + mainloop.quit() + + # Need to run the gpio polling in separate thread. Pass in the mainloop so + # the thread can kill us if there is an exception. + gobject.threads_init() + mainloop = gobject.MainLoop() + + poller = Thread(target=lambda: poll(mainloop)) + poller.daemon = True + poller.start() + + # Periodically save the counter + def save_counters(): + for inp in inputs: + services[inp].save_count() + return True + gobject.timeout_add(SAVEINTERVAL, save_counters) + + # Save counter on shutdown + signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) + + try: + mainloop.run() + except KeyboardInterrupt: + pass + finally: + save_counters() + +if __name__ == "__main__": + main() diff --git a/FileSets/v2.73/styles.css b/FileSets/v2.73/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.73/styles.css +++ b/FileSets/v2.73/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.80/MbEditBox.qml b/FileSets/v2.80/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.80/MbEditBox.qml +++ b/FileSets/v2.80/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.80/MbEditBoxDateTime.qml b/FileSets/v2.80/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.80/MbEditBoxDateTime.qml +++ b/FileSets/v2.80/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.80/MbItemDigitalInput.qml b/FileSets/v2.80/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.80/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.80/MbSubMenu.qml b/FileSets/v2.80/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.80/MbSubMenu.qml +++ b/FileSets/v2.80/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.80/Multi.qml b/FileSets/v2.80/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.80/Multi.qml +++ b/FileSets/v2.80/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.80/OverviewBox.qml b/FileSets/v2.80/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.80/OverviewBox.qml +++ b/FileSets/v2.80/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.80/OverviewConnection.qml b/FileSets/v2.80/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.80/OverviewConnection.qml +++ b/FileSets/v2.80/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.80/OverviewConnectionEnd.qml b/FileSets/v2.80/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.80/OverviewConnectionEnd.qml +++ b/FileSets/v2.80/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.80/OverviewSolarCharger.qml b/FileSets/v2.80/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.80/OverviewSolarCharger.qml +++ b/FileSets/v2.80/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.80/OverviewTankDelegate.qml b/FileSets/v2.80/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.80/OverviewTankDelegate.qml +++ b/FileSets/v2.80/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.80/OverviewTanks.qml b/FileSets/v2.80/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.80/OverviewTanks.qml +++ b/FileSets/v2.80/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.80/PageDigitalInput.qml b/FileSets/v2.80/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.80/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.80/TileText.qml b/FileSets/v2.80/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.80/TileText.qml +++ b/FileSets/v2.80/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.80/attributes.csv b/FileSets/v2.80/attributes.csv new file mode 120000 index 00000000..5a253081 --- /dev/null +++ b/FileSets/v2.80/attributes.csv @@ -0,0 +1 @@ +../v2.89/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.80/dbus_digitalinputs.py b/FileSets/v2.80/dbus_digitalinputs.py new file mode 120000 index 00000000..52bec86e --- /dev/null +++ b/FileSets/v2.80/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.89/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.80/styles.css b/FileSets/v2.80/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.80/styles.css +++ b/FileSets/v2.80/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.81/MbEditBox.qml b/FileSets/v2.81/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.81/MbEditBox.qml +++ b/FileSets/v2.81/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.81/MbEditBoxDateTime.qml b/FileSets/v2.81/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.81/MbEditBoxDateTime.qml +++ b/FileSets/v2.81/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.81/MbItemDigitalInput.qml b/FileSets/v2.81/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.81/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.81/MbSubMenu.qml b/FileSets/v2.81/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.81/MbSubMenu.qml +++ b/FileSets/v2.81/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.81/Multi.qml b/FileSets/v2.81/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.81/Multi.qml +++ b/FileSets/v2.81/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.81/OverviewBox.qml b/FileSets/v2.81/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.81/OverviewBox.qml +++ b/FileSets/v2.81/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.81/OverviewConnection.qml b/FileSets/v2.81/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.81/OverviewConnection.qml +++ b/FileSets/v2.81/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.81/OverviewConnectionEnd.qml b/FileSets/v2.81/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.81/OverviewConnectionEnd.qml +++ b/FileSets/v2.81/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.81/OverviewSolarCharger.qml b/FileSets/v2.81/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.81/OverviewSolarCharger.qml +++ b/FileSets/v2.81/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.81/OverviewTankDelegate.qml b/FileSets/v2.81/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.81/OverviewTankDelegate.qml +++ b/FileSets/v2.81/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.81/OverviewTanks.qml b/FileSets/v2.81/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.81/OverviewTanks.qml +++ b/FileSets/v2.81/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.81/PageDigitalInput.qml b/FileSets/v2.81/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.81/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.81/TileText.qml b/FileSets/v2.81/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.81/TileText.qml +++ b/FileSets/v2.81/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.81/attributes.csv b/FileSets/v2.81/attributes.csv new file mode 120000 index 00000000..5a253081 --- /dev/null +++ b/FileSets/v2.81/attributes.csv @@ -0,0 +1 @@ +../v2.89/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.81/dbus_digitalinputs.py b/FileSets/v2.81/dbus_digitalinputs.py new file mode 120000 index 00000000..52bec86e --- /dev/null +++ b/FileSets/v2.81/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.89/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.81/styles.css b/FileSets/v2.81/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.81/styles.css +++ b/FileSets/v2.81/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.82/MbEditBox.qml b/FileSets/v2.82/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.82/MbEditBox.qml +++ b/FileSets/v2.82/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.82/MbEditBoxDateTime.qml b/FileSets/v2.82/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.82/MbEditBoxDateTime.qml +++ b/FileSets/v2.82/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.82/MbItemDigitalInput.qml b/FileSets/v2.82/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.82/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.82/MbSubMenu.qml b/FileSets/v2.82/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.82/MbSubMenu.qml +++ b/FileSets/v2.82/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.82/Multi.qml b/FileSets/v2.82/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.82/Multi.qml +++ b/FileSets/v2.82/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.82/OverviewBox.qml b/FileSets/v2.82/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.82/OverviewBox.qml +++ b/FileSets/v2.82/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.82/OverviewConnection.qml b/FileSets/v2.82/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.82/OverviewConnection.qml +++ b/FileSets/v2.82/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.82/OverviewConnectionEnd.qml b/FileSets/v2.82/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.82/OverviewConnectionEnd.qml +++ b/FileSets/v2.82/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.82/OverviewSolarCharger.qml b/FileSets/v2.82/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.82/OverviewSolarCharger.qml +++ b/FileSets/v2.82/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.82/OverviewTankDelegate.qml b/FileSets/v2.82/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.82/OverviewTankDelegate.qml +++ b/FileSets/v2.82/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.82/OverviewTanks.qml b/FileSets/v2.82/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.82/OverviewTanks.qml +++ b/FileSets/v2.82/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.82/PageDigitalInput.qml b/FileSets/v2.82/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.82/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.82/TileText.qml b/FileSets/v2.82/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.82/TileText.qml +++ b/FileSets/v2.82/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.82/attributes.csv b/FileSets/v2.82/attributes.csv new file mode 120000 index 00000000..5a253081 --- /dev/null +++ b/FileSets/v2.82/attributes.csv @@ -0,0 +1 @@ +../v2.89/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.82/dbus_digitalinputs.py b/FileSets/v2.82/dbus_digitalinputs.py new file mode 120000 index 00000000..52bec86e --- /dev/null +++ b/FileSets/v2.82/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.89/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.82/styles.css b/FileSets/v2.82/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.82/styles.css +++ b/FileSets/v2.82/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.83/MbEditBox.qml b/FileSets/v2.83/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.83/MbEditBox.qml +++ b/FileSets/v2.83/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.83/MbEditBoxDateTime.qml b/FileSets/v2.83/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.83/MbEditBoxDateTime.qml +++ b/FileSets/v2.83/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.83/MbItemDigitalInput.qml b/FileSets/v2.83/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.83/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.83/MbSubMenu.qml b/FileSets/v2.83/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.83/MbSubMenu.qml +++ b/FileSets/v2.83/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.83/Multi.qml b/FileSets/v2.83/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.83/Multi.qml +++ b/FileSets/v2.83/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.83/OverviewBox.qml b/FileSets/v2.83/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.83/OverviewBox.qml +++ b/FileSets/v2.83/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.83/OverviewConnection.qml b/FileSets/v2.83/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.83/OverviewConnection.qml +++ b/FileSets/v2.83/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.83/OverviewConnectionEnd.qml b/FileSets/v2.83/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.83/OverviewConnectionEnd.qml +++ b/FileSets/v2.83/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.83/OverviewSolarCharger.qml b/FileSets/v2.83/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.83/OverviewSolarCharger.qml +++ b/FileSets/v2.83/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.83/OverviewTankDelegate.qml b/FileSets/v2.83/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.83/OverviewTankDelegate.qml +++ b/FileSets/v2.83/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.83/OverviewTanks.qml b/FileSets/v2.83/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.83/OverviewTanks.qml +++ b/FileSets/v2.83/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.83/PageDigitalInput.qml b/FileSets/v2.83/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.83/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.83/TileText.qml b/FileSets/v2.83/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.83/TileText.qml +++ b/FileSets/v2.83/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.83/attributes.csv b/FileSets/v2.83/attributes.csv new file mode 120000 index 00000000..5a253081 --- /dev/null +++ b/FileSets/v2.83/attributes.csv @@ -0,0 +1 @@ +../v2.89/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.83/dbus_digitalinputs.py b/FileSets/v2.83/dbus_digitalinputs.py new file mode 120000 index 00000000..52bec86e --- /dev/null +++ b/FileSets/v2.83/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.89/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.83/styles.css b/FileSets/v2.83/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.83/styles.css +++ b/FileSets/v2.83/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.84/MbEditBox.qml b/FileSets/v2.84/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.84/MbEditBox.qml +++ b/FileSets/v2.84/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.84/MbEditBoxDateTime.qml b/FileSets/v2.84/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.84/MbEditBoxDateTime.qml +++ b/FileSets/v2.84/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.84/MbItemDigitalInput.qml b/FileSets/v2.84/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.84/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.84/MbSubMenu.qml b/FileSets/v2.84/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.84/MbSubMenu.qml +++ b/FileSets/v2.84/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.84/Multi.qml b/FileSets/v2.84/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.84/Multi.qml +++ b/FileSets/v2.84/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.84/OverviewBox.qml b/FileSets/v2.84/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.84/OverviewBox.qml +++ b/FileSets/v2.84/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.84/OverviewConnection.qml b/FileSets/v2.84/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.84/OverviewConnection.qml +++ b/FileSets/v2.84/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.84/OverviewConnectionEnd.qml b/FileSets/v2.84/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.84/OverviewConnectionEnd.qml +++ b/FileSets/v2.84/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.84/OverviewSolarCharger.qml b/FileSets/v2.84/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.84/OverviewSolarCharger.qml +++ b/FileSets/v2.84/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.84/OverviewTankDelegate.qml b/FileSets/v2.84/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.84/OverviewTankDelegate.qml +++ b/FileSets/v2.84/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.84/OverviewTanks.qml b/FileSets/v2.84/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.84/OverviewTanks.qml +++ b/FileSets/v2.84/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.84/PageDigitalInput.qml b/FileSets/v2.84/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.84/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.84/TileText.qml b/FileSets/v2.84/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.84/TileText.qml +++ b/FileSets/v2.84/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.84/attributes.csv b/FileSets/v2.84/attributes.csv new file mode 120000 index 00000000..5a253081 --- /dev/null +++ b/FileSets/v2.84/attributes.csv @@ -0,0 +1 @@ +../v2.89/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.84/dbus_digitalinputs.py b/FileSets/v2.84/dbus_digitalinputs.py new file mode 120000 index 00000000..52bec86e --- /dev/null +++ b/FileSets/v2.84/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.89/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.84/styles.css b/FileSets/v2.84/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.84/styles.css +++ b/FileSets/v2.84/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.85/MbEditBox.qml b/FileSets/v2.85/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.85/MbEditBox.qml +++ b/FileSets/v2.85/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.85/MbEditBoxDateTime.qml b/FileSets/v2.85/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.85/MbEditBoxDateTime.qml +++ b/FileSets/v2.85/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.85/MbItemDigitalInput.qml b/FileSets/v2.85/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.85/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.85/MbSubMenu.qml b/FileSets/v2.85/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.85/MbSubMenu.qml +++ b/FileSets/v2.85/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.85/Multi.qml b/FileSets/v2.85/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.85/Multi.qml +++ b/FileSets/v2.85/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.85/OverviewBox.qml b/FileSets/v2.85/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.85/OverviewBox.qml +++ b/FileSets/v2.85/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.85/OverviewConnection.qml b/FileSets/v2.85/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.85/OverviewConnection.qml +++ b/FileSets/v2.85/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.85/OverviewConnectionEnd.qml b/FileSets/v2.85/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.85/OverviewConnectionEnd.qml +++ b/FileSets/v2.85/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.85/OverviewSolarCharger.qml b/FileSets/v2.85/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.85/OverviewSolarCharger.qml +++ b/FileSets/v2.85/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.85/OverviewTankDelegate.qml b/FileSets/v2.85/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.85/OverviewTankDelegate.qml +++ b/FileSets/v2.85/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.85/OverviewTanks.qml b/FileSets/v2.85/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.85/OverviewTanks.qml +++ b/FileSets/v2.85/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.85/PageDigitalInput.qml b/FileSets/v2.85/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.85/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.85/TileText.qml b/FileSets/v2.85/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.85/TileText.qml +++ b/FileSets/v2.85/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.85/attributes.csv b/FileSets/v2.85/attributes.csv new file mode 120000 index 00000000..5a253081 --- /dev/null +++ b/FileSets/v2.85/attributes.csv @@ -0,0 +1 @@ +../v2.89/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.85/dbus_digitalinputs.py b/FileSets/v2.85/dbus_digitalinputs.py new file mode 120000 index 00000000..52bec86e --- /dev/null +++ b/FileSets/v2.85/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.89/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.85/styles.css b/FileSets/v2.85/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.85/styles.css +++ b/FileSets/v2.85/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.86/MbEditBox.qml b/FileSets/v2.86/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.86/MbEditBox.qml +++ b/FileSets/v2.86/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.86/MbEditBoxDateTime.qml b/FileSets/v2.86/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.86/MbEditBoxDateTime.qml +++ b/FileSets/v2.86/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.86/MbItemDigitalInput.qml b/FileSets/v2.86/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.86/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.86/MbSubMenu.qml b/FileSets/v2.86/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.86/MbSubMenu.qml +++ b/FileSets/v2.86/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.86/Multi.qml b/FileSets/v2.86/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.86/Multi.qml +++ b/FileSets/v2.86/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.86/OverviewBox.qml b/FileSets/v2.86/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.86/OverviewBox.qml +++ b/FileSets/v2.86/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.86/OverviewConnection.qml b/FileSets/v2.86/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.86/OverviewConnection.qml +++ b/FileSets/v2.86/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.86/OverviewConnectionEnd.qml b/FileSets/v2.86/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.86/OverviewConnectionEnd.qml +++ b/FileSets/v2.86/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.86/OverviewSolarCharger.qml b/FileSets/v2.86/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.86/OverviewSolarCharger.qml +++ b/FileSets/v2.86/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.86/OverviewTankDelegate.qml b/FileSets/v2.86/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.86/OverviewTankDelegate.qml +++ b/FileSets/v2.86/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.86/OverviewTanks.qml b/FileSets/v2.86/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.86/OverviewTanks.qml +++ b/FileSets/v2.86/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.86/PageDigitalInput.qml b/FileSets/v2.86/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.86/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.86/TileText.qml b/FileSets/v2.86/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.86/TileText.qml +++ b/FileSets/v2.86/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.86/attributes.csv b/FileSets/v2.86/attributes.csv new file mode 120000 index 00000000..5a253081 --- /dev/null +++ b/FileSets/v2.86/attributes.csv @@ -0,0 +1 @@ +../v2.89/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.86/dbus_digitalinputs.py b/FileSets/v2.86/dbus_digitalinputs.py new file mode 120000 index 00000000..52bec86e --- /dev/null +++ b/FileSets/v2.86/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.89/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.86/styles.css b/FileSets/v2.86/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.86/styles.css +++ b/FileSets/v2.86/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.87/MbEditBox.qml b/FileSets/v2.87/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.87/MbEditBox.qml +++ b/FileSets/v2.87/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.87/MbEditBoxDateTime.qml b/FileSets/v2.87/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.87/MbEditBoxDateTime.qml +++ b/FileSets/v2.87/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.87/MbItemDigitalInput.qml b/FileSets/v2.87/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.87/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.87/MbSubMenu.qml b/FileSets/v2.87/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.87/MbSubMenu.qml +++ b/FileSets/v2.87/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.87/Multi.qml b/FileSets/v2.87/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.87/Multi.qml +++ b/FileSets/v2.87/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.87/OverviewBox.qml b/FileSets/v2.87/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.87/OverviewBox.qml +++ b/FileSets/v2.87/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.87/OverviewConnection.qml b/FileSets/v2.87/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.87/OverviewConnection.qml +++ b/FileSets/v2.87/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.87/OverviewConnectionEnd.qml b/FileSets/v2.87/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.87/OverviewConnectionEnd.qml +++ b/FileSets/v2.87/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.87/OverviewSolarCharger.qml b/FileSets/v2.87/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.87/OverviewSolarCharger.qml +++ b/FileSets/v2.87/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.87/OverviewTankDelegate.qml b/FileSets/v2.87/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.87/OverviewTankDelegate.qml +++ b/FileSets/v2.87/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.87/OverviewTanks.qml b/FileSets/v2.87/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.87/OverviewTanks.qml +++ b/FileSets/v2.87/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.87/PageDigitalInput.qml b/FileSets/v2.87/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.87/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.87/TileText.qml b/FileSets/v2.87/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.87/TileText.qml +++ b/FileSets/v2.87/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.87/attributes.csv b/FileSets/v2.87/attributes.csv new file mode 120000 index 00000000..5a253081 --- /dev/null +++ b/FileSets/v2.87/attributes.csv @@ -0,0 +1 @@ +../v2.89/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.87/dbus_digitalinputs.py b/FileSets/v2.87/dbus_digitalinputs.py new file mode 120000 index 00000000..52bec86e --- /dev/null +++ b/FileSets/v2.87/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.89/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.87/styles.css b/FileSets/v2.87/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.87/styles.css +++ b/FileSets/v2.87/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.89/MbEditBox.qml b/FileSets/v2.89/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.89/MbEditBox.qml +++ b/FileSets/v2.89/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.89/MbEditBoxDateTime.qml b/FileSets/v2.89/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.89/MbEditBoxDateTime.qml +++ b/FileSets/v2.89/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.89/MbItemDigitalInput.qml b/FileSets/v2.89/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.89/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.89/MbSubMenu.qml b/FileSets/v2.89/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.89/MbSubMenu.qml +++ b/FileSets/v2.89/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.89/Multi.qml b/FileSets/v2.89/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.89/Multi.qml +++ b/FileSets/v2.89/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.89/OverviewBox.qml b/FileSets/v2.89/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.89/OverviewBox.qml +++ b/FileSets/v2.89/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.89/OverviewConnection.qml b/FileSets/v2.89/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.89/OverviewConnection.qml +++ b/FileSets/v2.89/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.89/OverviewConnectionEnd.qml b/FileSets/v2.89/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.89/OverviewConnectionEnd.qml +++ b/FileSets/v2.89/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.89/OverviewSolarCharger.qml b/FileSets/v2.89/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.89/OverviewSolarCharger.qml +++ b/FileSets/v2.89/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.89/OverviewTankDelegate.qml b/FileSets/v2.89/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.89/OverviewTankDelegate.qml +++ b/FileSets/v2.89/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.89/OverviewTanks.qml b/FileSets/v2.89/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.89/OverviewTanks.qml +++ b/FileSets/v2.89/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.89/PageDigitalInput.qml b/FileSets/v2.89/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.89/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.89/TileText.qml b/FileSets/v2.89/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.89/TileText.qml +++ b/FileSets/v2.89/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.89/attributes.csv b/FileSets/v2.89/attributes.csv new file mode 100644 index 00000000..a75aab87 --- /dev/null +++ b/FileSets/v2.89/attributes.csv @@ -0,0 +1,578 @@ +com.victronenergy.gps,/Position/Latitude,d,Decimal degrees,2800,int32,10000000,R +com.victronenergy.gps,/Position/Longitude,d,Decimal degrees,2802,int32,10000000,R +com.victronenergy.gps,/Course,d,Degrees,2804,uint16,100,R +com.victronenergy.gps,/Speed,d,m/s,2805,uint16,100,R +com.victronenergy.gps,/Fix,y,,2806,uint16,1,R +com.victronenergy.gps,/NrOfSatellites,y,,2807,uint16,1,R +com.victronenergy.gps,/Altitude,d,m,2808,int32,10,R +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/State,i,0=BL disabled;1=Restarting;2=Self-consumption;3=Self-consumption;4=Self-consumption;5=Discharge disabled;6=Force charge;7=Sustain;9=Keep batteries charged;10=BL Disabled;11=BL Disabled (Low SoC),2900,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/MinimumSocLimit,d,%,2901,uint16,10,W +com.victronenergy.settings,/Settings/CGwacs/Hub4Mode,i,1=ESS with Phase Compensation;2=ESS without phase compensation;3=Disabled/External Control,2902,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/SocLimit,d,%,2903,uint16,10,R +com.victronenergy.vebus,/Interfaces/Mk2/Version,u,,1,,,R +com.victronenergy.vebus,/Devices/0/Version,u,,2,,,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/V,d,V AC,3,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/V,d,V AC,4,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/V,d,V AC,5,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/I,d,A AC,6,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/I,d,A AC,7,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/I,d,A AC,8,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/F,d,Hz,9,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/F,d,Hz,10,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/F,d,Hz,11,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/P,i,VA or Watts,12,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/P,i,VA or Watts,13,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/P,i,VA or Watts,14,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L1/V,d,V AC,15,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L2/V,d,V AC,16,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L3/V,d,V AC,17,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L1/I,d,A AC,18,int16,10,R +com.victronenergy.vebus,/Ac/Out/L2/I,d,A AC,19,int16,10,R +com.victronenergy.vebus,/Ac/Out/L3/I,d,A AC,20,int16,10,R +com.victronenergy.vebus,/Ac/Out/L1/F,d,Hz,21,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/CurrentLimit,d,A,22,int16,10,W +com.victronenergy.vebus,/Ac/Out/L1/P,i,VA or Watts,23,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L2/P,i,VA or Watts,24,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L3/P,i,VA or Watts,25,int16,0.1,R +com.victronenergy.vebus,/Dc/0/Voltage,d,V DC,26,uint16,100,R +com.victronenergy.vebus,/Dc/0/Current,d,A DC,27,int16,10,R +com.victronenergy.vebus,/Ac/NumberOfPhases,u,count,28,uint16,1,R +com.victronenergy.vebus,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,29,uint16,1,R +com.victronenergy.vebus,/Soc,d,%,30,uint16,10,W +com.victronenergy.vebus,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=Bulk protection,31,uint16,1,R +com.victronenergy.vebus,/VebusError,u,0=No error;1=VE.Bus Error 1: Device is switched off because one of the other phases in the system has switched off;2=VE.Bus Error 2: New and old types MK2 are mixed in the system;3=VE.Bus Error 3: Not all- or more than- the expected devices were found in the system;4=VE.Bus Error 4: No other device whatsoever detected;5=VE.Bus Error 5: Overvoltage on AC-out;6=VE.Bus Error 6: Error in DDC Program;7=VE.Bus BMS connected- which requires an Assistant- but no assistant found;10=VE.Bus Error 10: System time synchronisation problem occurred;14=VE.Bus Error 14: Device cannot transmit data;16=VE.Bus Error 16: Dongle missing;17=VE.Bus Error 17: One of the devices assumed master status because the original master failed;18=VE.Bus Error 18: AC Overvoltage on the output of a slave has occurred while already switched off;22=VE.Bus Error 22: This device cannot function as slave;24=VE.Bus Error 24: Switch-over system protection initiated;25=VE.Bus Error 25: Firmware incompatibility. The firmware of one of the connected device is not sufficiently up to date to operate in conjunction with this device;26=VE.Bus Error 26: Internal error,32,uint16,1,R +com.victronenergy.vebus,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,33,uint16,1,W +com.victronenergy.vebus,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,34,uint16,1,R +com.victronenergy.vebus,/Alarms/LowBattery,u,0=Ok;1=Warning;2=Alarm,35,uint16,1,R +com.victronenergy.vebus,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,36,uint16,1,R +com.victronenergy.vebus,/Alarms/TemperatureSensor,u,0=Ok;1=Warning;2=Alarm,42,uint16,1,R +com.victronenergy.vebus,/Alarms/VoltageSensor,u,0=Ok;1=Warning;2=Alarm,43,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/HighTemperature,u,0=Ok;1=Warning;2=Alarm,44,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/LowBattery,u,0=Ok;1=Warning;2=Alarm,45,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Overload,u,0=Ok;1=Warning;2=Alarm,46,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Ripple,u,0=Ok;1=Warning;2=Alarm,47,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/HighTemperature,u,0=Ok;1=Warning;2=Alarm,48,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/LowBattery,u,0=Ok;1=Warning;2=Alarm,49,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Overload,u,0=Ok;1=Warning;2=Alarm,50,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Ripple,u,0=Ok;1=Warning;2=Alarm,51,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/HighTemperature,u,0=Ok;1=Warning;2=Alarm,52,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/LowBattery,u,0=Ok;1=Warning;2=Alarm,53,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Overload,u,0=Ok;1=Warning;2=Alarm,54,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Ripple,u,0=Ok;1=Warning;2=Alarm,55,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,37,int16,1,W +com.victronenergy.vebus,/Hub4/DisableCharge,u,0=Charge allowed;1=Charge disabled,38,uint16,1,W +com.victronenergy.vebus,/Hub4/DisableFeedIn,u,0=Feed in allowed;1=Feed in disabled,39,uint16,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,40,int16,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,41,int16,1,W +com.victronenergy.vebus,/PvInverter/Disable,u,0=PV enabled;1=PV disabled,56,uint16,1,W +com.victronenergy.vebus,/Bms/AllowToCharge,u,0=No;1=Yes,57,uint16,1,R +com.victronenergy.vebus,/Bms/AllowToDischarge,u,0=No;1=Yes,58,uint16,1,R +com.victronenergy.vebus,/Bms/BmsExpected,u,0=No;1=Yes,59,uint16,1,R +com.victronenergy.vebus,/Bms/Error,u,0=No;1=Yes,60,uint16,1,R +com.victronenergy.vebus,/Dc/0/Temperature,d,Degrees celsius,61,int16,10,R +com.victronenergy.vebus,/SystemReset,y,0=No action;1=VE.Bus Reset,62,uint16,1,W +com.victronenergy.vebus,/Alarms/PhaseRotation,u,0=Ok;1=Warning,63,uint16,1,R +com.victronenergy.vebus,/Alarms/GridLost,i,0=No alarm;2=Alarm,64,uint16,1,R +com.victronenergy.vebus,/Hub4/DoNotFeedInOvervoltage,i,0=Feed in overvoltage;1=Don't feed in overvoltage,65,uint16,1,W +com.victronenergy.vebus,/Hub4/L1/MaxFeedInPower,d,W,66,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L2/MaxFeedInPower,d,W,67,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L3/MaxFeedInPower,d,W,68,uint16,0.01,W +com.victronenergy.vebus,/Ac/State/IgnoreAcIn1,i,0=AC input not ignored; 1=AC input ignored,69,uint16,1,R +com.victronenergy.vebus,/Ac/State/IgnoreAcIn2,i,0=AC input not ignored; 1=AC input ignored,70,uint16,1,R +com.victronenergy.vebus,/Hub4/TargetPowerIsMaxFeedIn,i,0=AcPowerSetpoint interpreted normally; 1=AcPowerSetpoint as OvervoltageFeedIn limit,71,uint16,W +com.victronenergy.vebus,/Hub4/FixSolarOffsetTo100mV,i,0=OvervoltageFeedIn uses 1V offset; 1=OvervoltageFeedIn uses 0.1V offset,72,uint16,W +com.victronenergy.battery,/ProductId,u,,256,,,R +com.victronenergy.battery,/FirmwareVersion,u,,257,,,R +com.victronenergy.battery,/Serial,s,,258,,,R +com.victronenergy.battery,/Dc/0/Voltage,d,V DC,259,uint16,100,R +com.victronenergy.battery,/Dc/1/Voltage,d,V DC,260,uint16,100,R +com.victronenergy.battery,/Dc/0/Current,d,A DC,261,int16,10,R +com.victronenergy.battery,/Dc/0/Temperature,d,Degrees celsius,262,int16,10,R +com.victronenergy.battery,/Dc/0/MidVoltage,d,V DC,263,uint16,100,R +com.victronenergy.battery,/Dc/0/MidVoltageDeviation,d,%,264,uint16,100,R +com.victronenergy.battery,/ConsumedAmphours,d,Ah,265,uint16,-10,R +com.victronenergy.battery,/Soc,y,%,266,uint16,10,R +com.victronenergy.battery,/Soh,y,%,304,uint16,10,R +com.victronenergy.battery,/TimeToGo,q,seconds,303,uint16,0.01,R +com.victronenergy.battery,/Info/MaxChargeVoltage,u,V DC,305,uint16,10,R +com.victronenergy.battery,/Info/BatteryLowVoltage,u,V DC,306,uint16,10,R +com.victronenergy.battery,/Info/MaxChargeCurrent,u,A DC,307,uint16,10,R +com.victronenergy.battery,/Info/MaxDischargeCurrent,u,A DC,308,uint16,10,R +com.victronenergy.battery,/Alarms/Alarm,y,0=No alarm;2=Alarm,267,uint16,1,R +com.victronenergy.battery,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,268,uint16,1,R +com.victronenergy.battery,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,269,uint16,1,R +com.victronenergy.battery,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,270,uint16,1,R +com.victronenergy.battery,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,271,uint16,1,R +com.victronenergy.battery,/Alarms/LowSoc,u,0=No alarm;2=Alarm,272,uint16,1,R +com.victronenergy.battery,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,273,uint16,1,R +com.victronenergy.battery,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,274,uint16,1,R +com.victronenergy.battery,/Alarms/MidVoltage,u,0=No alarm;2=Alarm,275,uint16,1,R +com.victronenergy.battery,/Alarms/LowFusedVoltage,u,0=No alarm;2=Alarm,276,uint16,1,R +com.victronenergy.battery,/Alarms/HighFusedVoltage,u,0=No alarm;2=Alarm,277,uint16,1,R +com.victronenergy.battery,/Alarms/FuseBlown,u,0=No alarm;2=Alarm,278,uint16,1,R +com.victronenergy.battery,/Alarms/HighInternalTemperature,u,0=No alarm;2=Alarm,279,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeCurrent,u,0=No alarm;2=Alarm,320,uint16,1,R +com.victronenergy.battery,/Alarms/HighDischargeCurrent,u,0=No alarm;2=Alarm,321,uint16,1,R +com.victronenergy.battery,/Alarms/CellImbalance,u,0=No alarm;2=Alarm,322,uint16,1,R +com.victronenergy.battery,/Alarms/InternalFailure,u,0=No alarm;2=Alarm,323,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeTemperature,u,0=No alarm;2=Alarm,324,uint16,1,R +com.victronenergy.battery,/Alarms/LowChargeTemperature,u,0=No alarm;2=Alarm,325,uint16,1,R +com.victronenergy.battery,/Alarms/LowCellVoltage,u,0=No alarm;1=Almost discharged;2=Alarm,326,uint16,1,R +com.victronenergy.battery,/Relay/0/State,y,0=Open;1=Closed,280,uint16,1,W +com.victronenergy.battery,/History/DeepestDischarge,d,Ah,281,uint16,-10,R +com.victronenergy.battery,/History/LastDischarge,d,Ah,282,uint16,-10,R +com.victronenergy.battery,/History/AverageDischarge,d,Ah,283,uint16,-10,R +com.victronenergy.battery,/History/ChargeCycles,i,count,284,uint16,1,R +com.victronenergy.battery,/History/FullDischarges,i,count,285,uint16,1,R +com.victronenergy.battery,/History/TotalAhDrawn,d,Ah,286,uint16,-10,R +com.victronenergy.battery,/History/MinimumVoltage,d,V DC,287,uint16,100,R +com.victronenergy.battery,/History/MaximumVoltage,d,V DC,288,uint16,100,R +com.victronenergy.battery,/History/TimeSinceLastFullCharge,i,seconds,289,uint16,0.01,R +com.victronenergy.battery,/History/AutomaticSyncs,i,count,290,uint16,1,R +com.victronenergy.battery,/History/LowVoltageAlarms,i,count,291,uint16,1,R +com.victronenergy.battery,/History/HighVoltageAlarms,i,count,292,uint16,1,R +com.victronenergy.battery,/History/LowStarterVoltageAlarms,i,count,293,uint16,1,R +com.victronenergy.battery,/History/HighStarterVoltageAlarms,i,count,294,uint16,1,R +com.victronenergy.battery,/History/MinimumStarterVoltage,d,V DC,295,uint16,100,R +com.victronenergy.battery,/History/MaximumStarterVoltage,d,V DC,296,uint16,100,R +com.victronenergy.battery,/History/LowFusedVoltageAlarms,i,count,297,uint16,1,R +com.victronenergy.battery,/History/HighFusedVoltageAlarms,i,count,298,uint16,1,R +com.victronenergy.battery,/History/MinimumFusedVoltage,d,V DC,299,uint16,100,R +com.victronenergy.battery,/History/MaximumFusedVoltage,d,V DC,300,uint16,100,R +com.victronenergy.battery,/History/DischargedEnergy,d,kWh,301,uint16,10,R +com.victronenergy.battery,/History/ChargedEnergy,d,kWh,302,uint16,10,R +com.victronenergy.battery,/Capacity,d,Ah,309,uint16,10,R +com.victronenergy.battery,/State,y,0=Initializing (Wait start);1=Initializing (before boot);2=Initializing (Before boot delay);3=Initializing (Wait boot);4=Initializing;5=Initializing (Measure battery voltage);6=Initializing (Calculate battery voltage);7=Initializing (Wait bus voltage);8=Initializing (Wait for lynx shunt);9=Running;10=Error (10);11=Error (11),1282,uint16,1,R +com.victronenergy.battery,/ErrorCode,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1283,uint16,1,R +com.victronenergy.battery,/SystemSwitch,y,0=Disabled;1=Enabled,1284,uint16,1,R +com.victronenergy.battery,/Balancing,y,0=Inactive;1=Active,1285,uint16,1,R +com.victronenergy.battery,/System/NrOfBatteries,y,count,1286,uint16,1,R +com.victronenergy.battery,/System/BatteriesParallel,y,count,1287,uint16,1,R +com.victronenergy.battery,/System/BatteriesSeries,y,count,1288,uint16,1,R +com.victronenergy.battery,/System/NrOfCellsPerBattery,y,count,1289,uint16,1,R +com.victronenergy.battery,/System/MinCellVoltage,d,V DC,1290,uint16,100,R +com.victronenergy.battery,/System/MaxCellVoltage,d,V DC,1291,uint16,100,R +com.victronenergy.battery,/Diagnostics/ShutDownsDueError,q,count,1292,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1293,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1294,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1295,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1296,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Time,u,,310,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Time,u,,312,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Time,u,,314,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Time,u,,316,int32,1,R +com.victronenergy.battery,/System/MinCellTemperature,d,Degrees celsius,318,int16,10,R +com.victronenergy.battery,/System/MaxCellTemperature,d,Degrees celsius,319,int16,10,R +com.victronenergy.battery,/Io/AllowToCharge,y,0=No;1=Yes,1297,uint16,1,R +com.victronenergy.battery,/Io/AllowToDischarge,y,0=No;1=Yes,1298,uint16,1,R +com.victronenergy.battery,/Io/ExternalRelay,y,0=Inactive;1=Active,1299,uint16,1,R +com.victronenergy.battery,/History/MinimumCellVoltage,d,V DC,1300,uint16,100,R +com.victronenergy.battery,/History/MaximumCellVoltage,d,V DC,1301,uint16,100,R +com.victronenergy.solarcharger,/ProductId,u,,768,,,R +com.victronenergy.solarcharger,/FirmwareVersion,u,,769,,,R +com.victronenergy.solarcharger,/Serial,s,,770,,,R +com.victronenergy.solarcharger,/Dc/0/Voltage,d,V DC,771,uint16,100,R +com.victronenergy.solarcharger,/Dc/0/Current,d,A DC,772,int16,10,R +com.victronenergy.solarcharger,/Dc/0/Temperature,d,Degrees celsius,773,int16,10,R +com.victronenergy.solarcharger,/Mode,i,1=On;4=Off,774,uint16,1,W +com.victronenergy.solarcharger,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;11=Other (Hub-1);252=Hub-1,775,uint16,1,R +com.victronenergy.solarcharger,/Pv/V,d,V DC,776,uint16,100,R +com.victronenergy.solarcharger,/Yield/Power,d,W,789,uint16,10,R +com.victronenergy.solarcharger,/Equalization/Pending,i,0=No;1=Yes;2=Error;3=Unavailable- Unknown,778,uint16,1,R +com.victronenergy.solarcharger,/Equalization/TimeRemaining,d,seconds,779,uint16,10,R +com.victronenergy.solarcharger,/Relay/0/State,i,0=Open;1=Closed,780,uint16,1,R +com.victronenergy.solarcharger,/Alarms/Alarm,i,0=No alarm;2=Alarm,781,uint16,1,R +com.victronenergy.solarcharger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,782,uint16,1,R +com.victronenergy.solarcharger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,783,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Yield,d,kWh,784,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/MaxPower,d,W,785,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Yield,d,kWh,786,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/MaxPower,d,W,787,uint16,1,R +com.victronenergy.solarcharger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,788,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,790,uint16,10,R +com.victronenergy.solarcharger,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,791,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/V,d,V DC,3700,uint16,100,R +com.victronenergy.solarcharger,/Pv/1/V,d,V DC,3701,uint16,100,R +com.victronenergy.solarcharger,/Pv/2/V,d,V DC,3702,uint16,100,R +com.victronenergy.solarcharger,/Pv/3/V,d,V DC,3703,uint16,100,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/Yield,d,kWh,3708,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/Yield,d,kWh,3709,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/Yield,d,kWh,3710,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/Yield,d,kWh,3711,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/Yield,d,kWh,3712,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/Yield,d,kWh,3713,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/Yield,d,kWh,3714,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/Yield,d,kWh,3715,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/MaxPower,d,W,3716,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/MaxPower,d,W,3717,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/MaxPower,d,W,3718,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/MaxPower,d,W,3719,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/MaxPower,d,W,3720,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/MaxPower,d,W,3721,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/MaxPower,d,W,3722,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/MaxPower,d,W,3723,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/P,d,W,3724,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/P,d,W,3725,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/P,d,W,3726,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/P,d,W,3727,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L1/Power,d,W,808,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L2/Power,d,W,809,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L3/Power,d,W,810,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L1/Power,d,W,811,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L2/Power,d,W,812,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L3/Power,d,W,813,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L1/Power,d,W,814,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L2/Power,d,W,815,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L3/Power,d,W,816,uint16,1,R +com.victronenergy.system,/Dc/Pv/Power,d,W,850,uint16,1,R +com.victronenergy.system,/Dc/Pv/Current,d,A DC,851,int16,10,R +com.victronenergy.system,/Dc/Charger/Power,d,W,855,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L1/Power,d,W,817,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L2/Power,d,W,818,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L3/Power,d,W,819,uint16,1,R +com.victronenergy.system,/Ac/Grid/L1/Power,d,W,820,int16,1,R +com.victronenergy.system,/Ac/Grid/L2/Power,d,W,821,int16,1,R +com.victronenergy.system,/Ac/Grid/L3/Power,d,W,822,int16,1,R +com.victronenergy.system,/Ac/Genset/L1/Power,d,W,823,int16,1,R +com.victronenergy.system,/Ac/Genset/L2/Power,d,W,824,int16,1,R +com.victronenergy.system,/Ac/Genset/L3/Power,d,W,825,int16,1,R +com.victronenergy.system,/Ac/ActiveIn/Source,u,0=Not available;1=Grid;2=Generator;3=Shore power;240=Not connected,826,int16,1,R +com.victronenergy.system,/Dc/System/Power,d,W,860,int16,1,R +com.victronenergy.system,/Dc/Battery/Voltage,d,V DC,840,uint16,10,R +com.victronenergy.system,/Dc/Battery/Current,d,A DC,841,int16,10,R +com.victronenergy.system,/Dc/Battery/Power,d,W,842,int16,1,R +com.victronenergy.system,/Dc/Vebus/Current,d,A DC,865,int16,10,R +com.victronenergy.system,/Dc/Vebus/Power,d,W,866,int16,1,R +com.victronenergy.system,/Dc/Battery/Soc,d,%,843,uint16,1,R +com.victronenergy.system,/Dc/Battery/State,i,0=idle;1=charging;2=discharging,844,uint16,1,R +com.victronenergy.system,/Dc/Battery/ConsumedAmphours,d,Ah,845,uint16,-10,R +com.victronenergy.system,/Dc/Battery/TimeToGo,d,s,846,uint16,0.01,R +com.victronenergy.system,/Relay/0/State,i,0=Open;1=Closed,806,uint16,1,W +com.victronenergy.system,/Relay/1/State,i,0=Open;1=Closed,807,uint16,1,W +com.victronenergy.system,/Serial,s,,800,string[6],1,R +com.victronenergy.pvinverter,/ProductId,u,,1024,,,R +com.victronenergy.pvinverter,/FirmwareVersion,s,,1025,,,R +com.victronenergy.pvinverter,/Position,i,0=AC input 1;1=AC output;2=AC input 2,1026,uint16,1,R +com.victronenergy.pvinverter,/Serial,s,,1039,string[7],1,R +com.victronenergy.pvinverter,/Ac/L1/Voltage,d,V AC,1027,uint16,10,R +com.victronenergy.pvinverter,/Ac/L1/Current,d,A AC,1028,int16,10,R +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1029,uint16,1,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1030,uint16,100,R +com.victronenergy.pvinverter,/Ac/L2/Voltage,d,V AC,1031,uint16,10,R +com.victronenergy.pvinverter,/Ac/L2/Current,d,A AC,1032,int16,10,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1033,uint16,1,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1034,uint16,100,R +com.victronenergy.pvinverter,/Ac/L3/Voltage,d,V AC,1035,uint16,10,R +com.victronenergy.pvinverter,/Ac/L3/Current,d,A AC,1036,int16,10,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1037,uint16,1,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1038,uint16,100,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1046,uint32,100,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1048,uint32,100,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1050,uint32,100,R +com.victronenergy.pvinverter,/Ac/Power,i,kW,1052,int32,1,W +com.victronenergy.pvinverter,/Ac/MaxPower,u,kW,1054,uint32,1,W +com.victronenergy.pvinverter,/Ac/PowerLimit,u,kW,1056,uint32,1,W +com.victronenergy.motordrive,/Motor/RPM,d,RPM,2048,int16,1,R +com.victronenergy.motordrive,/Motor/Temperature,d,Degrees celsius,2049,int16,10,R +com.victronenergy.motordrive,/Dc/0/Voltage,d,V DC,2050,uint16,100,R +com.victronenergy.motordrive,/Dc/0/Current,d,A DC,2051,int16,10,R +com.victronenergy.motordrive,/Dc/0/Power,d,W,2052,int16,10,R +com.victronenergy.motordrive,/Controller/Temperature,d,Degrees celsius,2053,int16,10,R +com.victronenergy.charger,/ProductId,,,2304,,,R +com.victronenergy.charger,/FirmwareVersion,,,2305,,,R +com.victronenergy.charger,/Serial,,,2306,,,R +com.victronenergy.charger,/Dc/0/Voltage,d,V DC,2307,uint16,100,R +com.victronenergy.charger,/Dc/0/Current,d,A DC,2308,int16,10,R +com.victronenergy.charger,/Dc/0/Temperature,d,Degrees celsius,2309,int16,10,R +com.victronenergy.charger,/Dc/1/Voltage,d,V DC,2310,uint16,100,R +com.victronenergy.charger,/Dc/1/Current,d,A DC,2311,int16,10,R +com.victronenergy.charger,/Dc/2/Voltage,d,V DC,2312,uint16,100,R +com.victronenergy.charger,/Dc/2/Current,d,A DC,2313,int16,10,R +com.victronenergy.charger,/Ac/In/L1/I,d,A AC,2314,int16,10,R +com.victronenergy.charger,/Ac/In/L1/P,d,W DC,2315,uint16,1,R +com.victronenergy.charger,/Ac/In/CurrentLimit,d,A AC,2316,int16,10,W +com.victronenergy.charger,/Mode,i,0=Off;1=On;2=Error;3=Unavailable- Unknown,2317,uint16,1,W +com.victronenergy.charger,/State,i,0=Off;1=Low Power Mode;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply mode;252=Bulk protection,2318,uint16,1,R +com.victronenergy.charger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,2319,uint16,1,R +com.victronenergy.charger,/Relay/0/State,i,0=Open;1=Closed,2320,uint16,1,R +com.victronenergy.charger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,2321,uint16,1,R +com.victronenergy.charger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,2322,uint16,1,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2600,int16,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2601,int16,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2602,int16,1,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2603,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2604,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2605,uint16,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2606,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2607,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2608,uint16,100,R +com.victronenergy.grid,/Serial,s,,2609,string[7],,R +com.victronenergy.grid,/Ac/L1/Voltage,d,V AC,2616,uint16,10,R +com.victronenergy.grid,/Ac/L1/Current,d,A AC,2617,int16,10,R +com.victronenergy.grid,/Ac/L2/Voltage,d,V AC,2618,uint16,10,R +com.victronenergy.grid,/Ac/L2/Current,d,A AC,2619,int16,10,R +com.victronenergy.grid,/Ac/L3/Voltage,d,V AC,2620,uint16,10,R +com.victronenergy.grid,/Ac/L3/Current,d,A AC,2621,int16,10,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2622,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2624,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2626,uint32,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2628,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2630,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2632,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Forward,d,kWh,2634,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Reverse,d,kWh,2636,uint32,100,R +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2700,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2703,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/MaxChargePercentage,d,%,2701,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePercentage,d,%,2702,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePower,d,W,2704,uint16,0.1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeCurrent,d,A,2705,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxFeedInPower,d,W,2706,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/OvervoltageFeedIn,i,0=Don't feed excess DC-coupled PV into grid;1=Feed excess DC-coupled PV into the grid,2707,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/PreventFeedback,i,0=Feed excess AC-coupled PV into grid;1=Don't feed excess AC-coupled PV into the grid,2708,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeVoltage,d,V,2710,uint16,10,W +com.victronenergy.hub4,/PvPowerLimiterActive,i,0=Feed-in limiting inactive;1=Feed-in limiting active,2709,uint16,1,R +com.victronenergy.tank,/ProductId,u,,3000,uint16,1,R +com.victronenergy.tank,/Capacity,d,m3,3001,uint32,10000,R +com.victronenergy.tank,/FluidType,u,0=Fuel;1=Fresh water;2=Waste water;3=Live well;4=Oil;5=Black water (sewage),3003,uint16,1,R +com.victronenergy.tank,/Level,d,%,3004,uint16,10,R +com.victronenergy.tank,/Remaining,d,m3,3005,uint32,10000,R +com.victronenergy.tank,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3007,uint16,1,R +com.victronenergy.inverter,/ProductId,u,,3127,uint16,1,R +com.victronenergy.inverter,/FirmwareVersion,u,,3125,uint16,1,R +com.victronenergy.inverter,/Ac/Out/L1/I,d,A AC,3100,int16,10,R +com.victronenergy.inverter,/Ac/Out/L1/V,d,V AC,3101,uint16,10,R +com.victronenergy.inverter,/Ac/Out/L1/P,d,W AC,3102,int16,0.1,R +com.victronenergy.inverter,/Alarms/HighTemperature,u,0=No alarm;1=Warning;2=Alarm,3110,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltage,u,0=No alarm;1=Warning;2=Alarm,3111,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3112,uint16,1,R +com.victronenergy.inverter,/Alarms/LowTemperature,u,0=No alarm;1=Warning;2=Alarm,3113,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltage,u,0=No alarm;1=Warning;2=Alarm,3114,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3115,uint16,1,R +com.victronenergy.inverter,/Alarms/Overload,u,0=No alarm;1=Warning;2=Alarm,3116,uint16,1,R +com.victronenergy.inverter,/Alarms/Ripple,u,0=No alarm;1=Warning;2=Alarm,3117,uint16,1,R +com.victronenergy.inverter,/Dc/0/Voltage,d,V DC,3105,uint16,100,R +com.victronenergy.inverter,/Dc/0/Current,d,A DC,3106,int16,10,R +com.victronenergy.inverter,/Mode,u,2=On;4=Off;5=Eco,3126,uint16,1,W +com.victronenergy.inverter,/State,u,0=Off;1=Low power mode (search mode);2=Fault;9=Inverting (on),3128,uint16,1,R +com.victronenergy.inverter,/Energy/InverterToAcOut,d,kWh,3130,uint32,100,R +com.victronenergy.inverter,/Energy/OutToInverter,d,kWh,3132,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToAcOut,d,kWh,3134,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToBattery,d,kWh,3136,uint32,100,R +com.victronenergy.inverter,/Pv/V,d,V DC,3138,uint16,10,R +com.victronenergy.inverter,/Pv/0/V,d,V DC,3140,uint16,10,R +com.victronenergy.inverter,/Pv/1/V,d,V DC,3141,uint16,10,R +com.victronenergy.inverter,/Pv/2/V,d,V DC,3142,uint16,10,R +com.victronenergy.inverter,/Pv/3/V,d,V DC,3143,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/Yield,d,kWh,3148,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/Yield,d,kWh,3149,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/Yield,d,kWh,3150,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/Yield,d,kWh,3151,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/Yield,d,kWh,3152,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/Yield,d,kWh,3153,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/Yield,d,kWh,3154,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/Yield,d,kWh,3155,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/MaxPower,d,W,3156,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/MaxPower,d,W,3157,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/MaxPower,d,W,3158,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/MaxPower,d,W,3159,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/MaxPower,d,W,3160,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/MaxPower,d,W,3161,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/MaxPower,d,W,3162,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/MaxPower,d,W,3163,uint16,1,R +com.victronenergy.inverter,/Pv/0/P,d,W,3164,uint16,1,R +com.victronenergy.inverter,/Pv/1/P,d,W,3165,uint16,1,R +com.victronenergy.inverter,/Pv/2/P,d,W,3166,uint16,1,R +com.victronenergy.inverter,/Pv/3/P,d,W,3167,uint16,1,R +com.victronenergy.genset,/ProductId,u,,3212,uint16,1,R +com.victronenergy.genset,/StatusCode,u,0=Standby;1=Startup 1;2=Startup 2;3=Startup 3;4=Startup 4;5=Startup 5;6=Startup 6;7=Startup 7;8=Running;9=Stopping;10=Error,3213,uint16,1,R +com.victronenergy.genset,/ErrorCode,u,0=No error;1=AC voltage L1 too low;2=AC frequency L1 too low;3=AC current too low;4=AC power too low;5=Emergency stop;6=Servo current too low;7=Oil pressure too low;8=Engine temperature too low;9=Winding temperature too low;10=Exhaust temperature too low;13=Starter current too low;14=Glow current too low;15=Glow current too low;16=Fuel holding magnet current too low;17=Stop solenoid hold coil current too low;18=Stop solenoid pull coil current too low;19=Optional DC out current too low;20=5V output voltage too low;21=Boost output current too low;22=Panel supply current too high;25=Starter battery voltage too low;26=Startup aborted (rotation too low);28=Rotation too low;29=Power contactor current too low;30=AC voltage L2 too low;31=AC frequency L2 too low;32=AC current L2 too low;33=AC power L2 too low;34=AC voltage L3 too low;35=AC frequency L3 too low;36=AC current L3 too low;37=AC power L3 too low;62=Fuel temperature too low;63=Fuel level too low;65=AC voltage L1 too high;66=AC frequency too high;67=AC current too high;68=AC power too high;70=Servo current too high;71=Oil pressure too high;72=Engine temperature too high;73=Winding temperature too high;74=Exhaust temperature too low;77=Starter current too low;78=Glow current too high;79=Glow current too high;80=Fuel holding magnet current too high;81=Stop solenoid hold coil current too high;82=Stop solenoid pull coil current too high;83=Optional DC out current too high;84=5V output voltage too high;85=Boost output current too high;89=Starter battery voltage too high;90=Startup aborted (rotation too high);92=Rotation too high;93=Power contactor current too high;94=AC voltage L2 too high;95=AC frequency L2 too high;96=AC current L2 too high;97=AC power L2 too high;98=AC voltage L3 too high;99=AC frequency L3 too high;100=AC current L3 too high;101=AC power L3 too high;126=Fuel temperature too high;127=Fuel level too high;130=Lost control unit;131=Lost panel;132=Service needed;133=Lost 3-phase module;134=Lost AGT module;135=Synchronization failure;137=Intake airfilter;139=Lost sync. module;140=Load-balance failed;141=Sync-mode deactivated;142=Engine controller;148=Rotating field wrong;149=Fuel level sensor lost;150=Init failed;151=Watchdog;152=Out: winding;153=Out: exhaust;154=Out: Cyl. head;155=Inverter over temperature;156=Inverter overload;157=Inverter communication lost;158=Inverter sync failed;159=CAN communication lost;160=L1 overload;161=L2 overload;162=L3 overload;163=DC overload;164=DC overvoltage;165=Emergency stop;166=No connection,3214,uint16,1,R +com.victronenergy.genset,/AutoStart,u,0=Disabled;1=Enabled,3215,uint16,1,R +com.victronenergy.genset,/Start,u,0=Stop;1=Start,3223,uint16,1,W +com.victronenergy.genset,/Engine/Load,d,%,3216,uint16,1,R +com.victronenergy.genset,/Engine/Speed,d,RPM,3217,uint16,1,R +com.victronenergy.genset,/Engine/OperatingHours,d,s,3218,uint16,0.01,R +com.victronenergy.genset,/Engine/CoolantTemperature,d,Degrees celsius,3219,int16,10,R +com.victronenergy.genset,/Engine/WindingTemperature,d,Degrees celsius,3220,int16,10,R +com.victronenergy.genset,/Engine/ExaustTemperature,d,Degrees celsius,3221,int16,10,R +com.victronenergy.genset,/StarterVoltage,d,V DC,3222,uint16,100,R +com.victronenergy.genset,/Ac/L1/Voltage,d,V AC,3200,uint16,10,R +com.victronenergy.genset,/Ac/L1/Current,d,A AC,3203,int16,10,R +com.victronenergy.genset,/Ac/L1/Power,d,W,3206,int16,1,R +com.victronenergy.genset,/Ac/L1/Frequency,d,Hz,3209,uint16,100,R +com.victronenergy.genset,/Ac/L2/Voltage,d,V AC,3201,uint16,10,R +com.victronenergy.genset,/Ac/L2/Current,d,A AC,3204,int16,10,R +com.victronenergy.genset,/Ac/L2/Power,d,W,3207,int16,1,R +com.victronenergy.genset,/Ac/L2/Frequency,d,Hz,3210,uint16,100,R +com.victronenergy.genset,/Ac/L3/Voltage,d,V AC,3202,uint16,10,R +com.victronenergy.genset,/Ac/L3/Current,d,A AC,3205,int16,10,R +com.victronenergy.genset,/Ac/L3/Power,d,W,3208,int16,1,R +com.victronenergy.genset,/Ac/L3/Frequency,d,Hz,3211,uint16,100,R +com.victronenergy.temperature,/ProductId,u,,3300,uint16,1,R +com.victronenergy.temperature,/Scale,d,,3301,uint16,100,R +com.victronenergy.temperature,/Offset,d,,3302,int16,100,R +com.victronenergy.temperature,/TemperatureType,u,0=Battery;1=Fridge;2=Generic,3303,uint16,1,R +com.victronenergy.temperature,/Temperature,d,Degrees celsius,3304,int16,100,R +com.victronenergy.temperature,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3305,uint16,1,R +com.victronenergy.pulsemeter,/Aggregate,i,,3400,uint32,1,R +com.victronenergy.pulsemeter,/Count,i,,3402,uint32,1,R +com.victronenergy.digitalinput,/Count,i,,3420,uint32,1,R +com.victronenergy.digitalinput,/State,i,,3422,uint16,1,R +com.victronenergy.digitalinput,/Alarm,i,0=No alarm;2=Alarm,3423,uint16,1,R +com.victronenergy.digitalinput,/Type,i,2=Door;3=Bilge pump;4=Bilge alarm;5=Burglar alarm;6=Smoke alarm;7=Fire alarm;8=CO2 alarm;9=Generator;10=ExtTransferSwitch,3424,uint16,1,R +com.victronenergy.generator,/Generator0/ManualStart,i,0=Stop generator;1=Start generator,3500,uint16,1,W +com.victronenergy.generator,/Generator0/RunningByConditionCode,i,0=Stopped;1=Manual;2=TestRun;3=LossOfComms;4=Soc;5=AcLoad;6=BatteryCurrent;7=BatteryVoltage;8=InverterTemperatur;9=InverterOverload;10=StopOnAc1,3501,uint16,1,R +com.victronenergy.generator,/Generator0/Runtime,i,seconds,3502,uint16,1,R +com.victronenergy.generator,/Generator0/Runtime,u,seconds,3504,uint32,1,R +com.victronenergy.generator,/Generator0/State,i,0=Stopped;1=Running;10=Error,3506,uint16,1,R +com.victronenergy.generator,/Generator0/Error,i,0=No Error;1=Remote disabled;2=Remote fault,3507,uint16,1,R +com.victronenergy.generator,/Generator0/Alarms/NoGeneratorAtAcIn,i,0=No Alarm;2=Alarm,3508,uint16,1,R +com.victronenergy.meteo,/Irradiance,d,W/m^2,3600,uint16,10,R +com.victronenergy.meteo,/WindSpeed,d,m/s,3601,uint16,10,R +com.victronenergy.meteo,/CellTemperature,d,Degrees celsius,3602,int16,10,R +com.victronenergy.meteo,/ExternalTemperature,d,Degrees celsius,3603,int16,10,R +com.victronenergy.evcharger,/ProductId,u,,3800,uint16,1,R +com.victronenergy.evcharger,/FirmwareVersion,u,,3802,uint32,1,R +com.victronenergy.evcharger,/Serial,s,,3804,string[6],,R +com.victronenergy.evcharger,/Model,s,,3810,string[4],,R +com.victronenergy.evcharger,/MaxCurrent,d,A,3814,uint16,1,W +com.victronenergy.evcharger,/Mode,u,0=Manual;1=Auto,3815,uint16,1,W +com.victronenergy.evcharger,/Ac/Energy/Forward,d,kWh,3816,uint32,100,R +com.victronenergy.evcharger,/Ac/L1/Power,d,W,3818,uint16,1,R +com.victronenergy.evcharger,/Ac/L2/Power,d,W,3819,uint16,1,R +com.victronenergy.evcharger,/Ac/L3/Power,d,W,3820,uint16,1,R +com.victronenergy.evcharger,/Ac/Power,d,W,3821,uint16,1,R +com.victronenergy.evcharger,/ChargingTime,d,s,3822,uint16,0.01,R +com.victronenergy.evcharger,/Current,d,A,3823,uint16,1,W +com.victronenergy.evcharger,/Status,u,0=Disconnected; 1=Connected; 2=Charging; 3=Charged; 4=Waiting for sun; 5=Waiting for RFID; 6=Waiting for start; 7=Low SOC; 8=Ground fault; 9=Welded contacts; 10=CP Input shorted; 11=Residual current detected; 12=Under voltage detected; 13=Overvoltage detected; 14=Overheating detected,3824,uint16,1,R +com.victronenergy.evcharger,/SetCurrent,d,A,3825,uint16,1,W +com.victronenergy.evcharger,/StartStop,u,0=Stop;1=Start,3826,uint16,1,W +com.victronenergy.acload,/Ac/L1/Power,d,W,3900,int16,1,R +com.victronenergy.acload,/Ac/L2/Power,d,W,3901,int16,1,R +com.victronenergy.acload,/Ac/L3/Power,d,W,3902,int16,1,R +com.victronenergy.acload,/Serial,s,,3903,string[7],,R +com.victronenergy.acload,/Ac/L1/Voltage,d,V AC,3910,uint16,10,R +com.victronenergy.acload,/Ac/L1/Current,d,A AC,3911,int16,10,R +com.victronenergy.acload,/Ac/L2/Voltage,d,V AC,3912,uint16,10,R +com.victronenergy.acload,/Ac/L2/Current,d,A AC,3913,int16,10,R +com.victronenergy.acload,/Ac/L3/Voltage,d,V AC,3914,uint16,10,R +com.victronenergy.acload,/Ac/L3/Current,d,A AC,3915,int16,10,R +com.victronenergy.acload,/Ac/L1/Energy/Forward,d,kWh,3916,uint32,100,R +com.victronenergy.acload,/Ac/L2/Energy/Forward,d,kWh,3918,uint32,100,R +com.victronenergy.acload,/Ac/L3/Energy/Forward,d,kWh,3920,uint32,100,R +com.victronenergy.fuelcell,/Dc/0/Voltage,d,V DC,4000,uint16,100,R +com.victronenergy.fuelcell,/Dc/0/Current,d,A DC,4001,int16,10,R +com.victronenergy.fuelcell,/Dc/1/Voltage,d,V DC,4002,int16,10,R +com.victronenergy.fuelcell,/Dc/0/Temperature,d,Degrees celsius,4003,int16,10,R +com.victronenergy.fuelcell,/History/EnergyOut,d,kWh,4004,uint32,100,R +com.victronenergy.fuelcell,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4006,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4007,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4008,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4009,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4010,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4011,uint16,1,R +com.victronenergy.alternator,/Dc/0/Voltage,d,V DC,4100,uint16,100,R +com.victronenergy.alternator,/Dc/0/Current,d,A DC,4101,int16,10,R +com.victronenergy.alternator,/Dc/1/Voltage,d,V DC,4102,int16,10,R +com.victronenergy.alternator,/Dc/0/Temperature,d,Degrees celsius,4103,int16,10,R +com.victronenergy.alternator,/History/EnergyOut,d,kWh,4104,uint32,100,R +com.victronenergy.alternator,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4106,uint16,1,R +com.victronenergy.alternator,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4107,uint16,1,R +com.victronenergy.alternator,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4108,uint16,1,R +com.victronenergy.alternator,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4109,uint16,1,R +com.victronenergy.alternator,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4110,uint16,1,R +com.victronenergy.alternator,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4111,uint16,1,R +com.victronenergy.dcsource,/Dc/0/Voltage,d,V DC,4200,uint16,100,R +com.victronenergy.dcsource,/Dc/0/Current,d,A DC,4201,int16,10,R +com.victronenergy.dcsource,/Dc/1/Voltage,d,V DC,4202,int16,10,R +com.victronenergy.dcsource,/Dc/0/Temperature,d,Degrees centigrade,4203,int16,10,R +com.victronenergy.dcsource,/History/EnergyOut,d,kWh,4204,uint32,100,R +com.victronenergy.dcsource,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4206,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4207,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4208,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4209,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4210,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4211,uint16,1,R +com.victronenergy.dcload,/Dc/0/Voltage,d,V DC,4300,uint16,100,R +com.victronenergy.dcload,/Dc/0/Current,d,A DC,4301,int16,10,R +com.victronenergy.dcload,/Dc/1/Voltage,d,V DC,4302,int16,10,R +com.victronenergy.dcload,/Dc/0/Temperature,d,Degrees centigrade,4303,int16,10,R +com.victronenergy.dcload,/History/EnergyIn,d,kWh,4304,uint32,100,R +com.victronenergy.dcload,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4306,uint16,1,R +com.victronenergy.dcload,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4307,uint16,1,R +com.victronenergy.dcload,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4308,uint16,1,R +com.victronenergy.dcload,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4309,uint16,1,R +com.victronenergy.dcload,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4310,uint16,1,R +com.victronenergy.dcload,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4311,uint16,1,R +com.victronenergy.dcsystem,/Dc/0/Voltage,d,V DC,4400,uint16,100,R +com.victronenergy.dcsystem,/Dc/0/Current,d,A DC,4401,int16,10,R +com.victronenergy.dcsystem,/Dc/1/Voltage,d,V DC,4402,int16,10,R +com.victronenergy.dcsystem,/Dc/0/Temperature,d,Degrees centigrade,4403,int16,10,R +com.victronenergy.dcsystem,/History/EnergyOut,d,kWh,4404,uint32,100,R +com.victronenergy.dcsystem,/History/EnergyIn,d,kWh,4406,uint32,100,R +com.victronenergy.dcsystem,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4408,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4409,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4410,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4411,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4412,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4413,uint16,1,R +com.victronenergy.multi,/Ac/In/1/L1/V,d,V AC,4500,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/V,d,V AC,4501,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/V,d,V AC,4502,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/I,d,A AC,4503,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/I,d,A AC,4504,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/I,d,A AC,4505,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/P,d,W,4506,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L2/P,d,W,4507,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L3/P,d,W,4508,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L1/F,d,Hz,4509,uint16,100,R +com.victronenergy.multi,/Ac/Out/L1/V,d,V AC,4510,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/V,d,V AC,4511,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/V,d,V AC,4512,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/I,d,A AC,4513,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/I,d,A AC,4514,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/I,d,A AC,4515,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/P,d,W,4516,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L2/P,d,W,4517,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L3/P,d,W,4518,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L1/F,d,Hz,4519,uint16,100,R +com.victronenergy.multi,/Ac/In/1/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4520,uint16,1,R +com.victronenergy.multi,/Ac/In/2/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4521,uint16,1,R +com.victronenergy.multi,/Ac/In/1/CurrentLimit,d,A,4522,uint16,10,W +com.victronenergy.multi,/Ac/In/2/CurrentLimit,d,A,4523,uint16,10,W +com.victronenergy.multi,/Ac/NumberOfPhases,u,count,4524,uint16,1,R +com.victronenergy.multi,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,4525,uint16,1,R +com.victronenergy.multi,/Dc/0/Voltage,d,V DC,4526,uint16,100,R +com.victronenergy.multi,/Dc/0/Current,d,A DC,4527,int16,10,R +com.victronenergy.multi,/Dc/0/Temperature,d,Degrees celsius,4528,int16,10,R +com.victronenergy.multi,/Soc,d,%,4529,uint16,10,R +com.victronenergy.multi,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=Bulk protection,4530,uint16,1,R +com.victronenergy.multi,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,4531,uint16,1,W +com.victronenergy.multi,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,4532,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltage,u,0=Ok;1=Warning;2=Alarm,4533,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4534,uint16,1,R +com.victronenergy.multi,/Alarms/LowTemperature,u,0=Ok;1=Warning;2=Alarm,4535,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltage,u,0=Ok;1=Warning;2=Alarm,4536,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4537,uint16,1,R +com.victronenergy.multi,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,4538,uint16,1,R +com.victronenergy.multi,/Alarms/Ripple,u,0=Ok;1=Warning;2=Alarm,4539,uint16,1,R +com.victronenergy.multi,/Yield/Power,d,W,4540,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4541,uint16,10,R +com.victronenergy.multi,/Relay/0/State,i,0=Open;1=Closed,4542,uint16,1,R +com.victronenergy.multi,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4543,uint16,1,R +com.victronenergy.multi,/Pv/V,d,V DC,4544,uint16,10,R +com.victronenergy.multi,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,4545,uint16,1,R +com.victronenergy.multi,/Energy/AcIn1ToAcOut,d,kWh,4546,uint32,100,R +com.victronenergy.multi,/Energy/AcIn1ToInverter,d,kWh,4548,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToAcOut,d,kWh,4550,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToInverter,d,kWh,4552,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn1,d,kWh,4554,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn2,d,kWh,4556,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn1,d,kWh,4558,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn2,d,kWh,4560,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcOut,d,kWh,4562,uint32,100,R +com.victronenergy.multi,/Energy/OutToInverter,d,kWh,4564,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn1,d,kWh,4566,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn2,d,kWh,4568,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcOut,d,kWh,4570,uint32,100,R +com.victronenergy.multi,/Energy/SolarToBattery,d,kWh,4572,uint32,100,R diff --git a/FileSets/v2.89/attributes.csv.orig b/FileSets/v2.89/attributes.csv.orig new file mode 100644 index 00000000..6c6f4574 --- /dev/null +++ b/FileSets/v2.89/attributes.csv.orig @@ -0,0 +1,578 @@ +com.victronenergy.gps,/Position/Latitude,d,Decimal degrees,2800,int32,10000000,R +com.victronenergy.gps,/Position/Longitude,d,Decimal degrees,2802,int32,10000000,R +com.victronenergy.gps,/Course,d,Degrees,2804,uint16,100,R +com.victronenergy.gps,/Speed,d,m/s,2805,uint16,100,R +com.victronenergy.gps,/Fix,y,,2806,uint16,1,R +com.victronenergy.gps,/NrOfSatellites,y,,2807,uint16,1,R +com.victronenergy.gps,/Altitude,d,m,2808,int32,10,R +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/State,i,0=BL disabled;1=Restarting;2=Self-consumption;3=Self-consumption;4=Self-consumption;5=Discharge disabled;6=Force charge;7=Sustain;9=Keep batteries charged;10=BL Disabled;11=BL Disabled (Low SoC),2900,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/MinimumSocLimit,d,%,2901,uint16,10,W +com.victronenergy.settings,/Settings/CGwacs/Hub4Mode,i,1=ESS with Phase Compensation;2=ESS without phase compensation;3=Disabled/External Control,2902,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/SocLimit,d,%,2903,uint16,10,R +com.victronenergy.vebus,/Interfaces/Mk2/Version,u,,1,,,R +com.victronenergy.vebus,/Devices/0/Version,u,,2,,,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/V,d,V AC,3,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/V,d,V AC,4,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/V,d,V AC,5,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/I,d,A AC,6,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/I,d,A AC,7,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/I,d,A AC,8,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/F,d,Hz,9,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/F,d,Hz,10,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/F,d,Hz,11,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/P,i,VA or Watts,12,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/P,i,VA or Watts,13,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/P,i,VA or Watts,14,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L1/V,d,V AC,15,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L2/V,d,V AC,16,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L3/V,d,V AC,17,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L1/I,d,A AC,18,int16,10,R +com.victronenergy.vebus,/Ac/Out/L2/I,d,A AC,19,int16,10,R +com.victronenergy.vebus,/Ac/Out/L3/I,d,A AC,20,int16,10,R +com.victronenergy.vebus,/Ac/Out/L1/F,d,Hz,21,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/CurrentLimit,d,A,22,int16,10,W +com.victronenergy.vebus,/Ac/Out/L1/P,i,VA or Watts,23,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L2/P,i,VA or Watts,24,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L3/P,i,VA or Watts,25,int16,0.1,R +com.victronenergy.vebus,/Dc/0/Voltage,d,V DC,26,uint16,100,R +com.victronenergy.vebus,/Dc/0/Current,d,A DC,27,int16,10,R +com.victronenergy.vebus,/Ac/NumberOfPhases,u,count,28,uint16,1,R +com.victronenergy.vebus,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,29,uint16,1,R +com.victronenergy.vebus,/Soc,d,%,30,uint16,10,W +com.victronenergy.vebus,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=Bulk protection,31,uint16,1,R +com.victronenergy.vebus,/VebusError,u,0=No error;1=VE.Bus Error 1: Device is switched off because one of the other phases in the system has switched off;2=VE.Bus Error 2: New and old types MK2 are mixed in the system;3=VE.Bus Error 3: Not all- or more than- the expected devices were found in the system;4=VE.Bus Error 4: No other device whatsoever detected;5=VE.Bus Error 5: Overvoltage on AC-out;6=VE.Bus Error 6: Error in DDC Program;7=VE.Bus BMS connected- which requires an Assistant- but no assistant found;10=VE.Bus Error 10: System time synchronisation problem occurred;14=VE.Bus Error 14: Device cannot transmit data;16=VE.Bus Error 16: Dongle missing;17=VE.Bus Error 17: One of the devices assumed master status because the original master failed;18=VE.Bus Error 18: AC Overvoltage on the output of a slave has occurred while already switched off;22=VE.Bus Error 22: This device cannot function as slave;24=VE.Bus Error 24: Switch-over system protection initiated;25=VE.Bus Error 25: Firmware incompatibility. The firmware of one of the connected device is not sufficiently up to date to operate in conjunction with this device;26=VE.Bus Error 26: Internal error,32,uint16,1,R +com.victronenergy.vebus,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,33,uint16,1,W +com.victronenergy.vebus,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,34,uint16,1,R +com.victronenergy.vebus,/Alarms/LowBattery,u,0=Ok;1=Warning;2=Alarm,35,uint16,1,R +com.victronenergy.vebus,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,36,uint16,1,R +com.victronenergy.vebus,/Alarms/TemperatureSensor,u,0=Ok;1=Warning;2=Alarm,42,uint16,1,R +com.victronenergy.vebus,/Alarms/VoltageSensor,u,0=Ok;1=Warning;2=Alarm,43,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/HighTemperature,u,0=Ok;1=Warning;2=Alarm,44,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/LowBattery,u,0=Ok;1=Warning;2=Alarm,45,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Overload,u,0=Ok;1=Warning;2=Alarm,46,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Ripple,u,0=Ok;1=Warning;2=Alarm,47,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/HighTemperature,u,0=Ok;1=Warning;2=Alarm,48,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/LowBattery,u,0=Ok;1=Warning;2=Alarm,49,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Overload,u,0=Ok;1=Warning;2=Alarm,50,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Ripple,u,0=Ok;1=Warning;2=Alarm,51,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/HighTemperature,u,0=Ok;1=Warning;2=Alarm,52,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/LowBattery,u,0=Ok;1=Warning;2=Alarm,53,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Overload,u,0=Ok;1=Warning;2=Alarm,54,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Ripple,u,0=Ok;1=Warning;2=Alarm,55,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,37,int16,1,W +com.victronenergy.vebus,/Hub4/DisableCharge,u,0=Charge allowed;1=Charge disabled,38,uint16,1,W +com.victronenergy.vebus,/Hub4/DisableFeedIn,u,0=Feed in allowed;1=Feed in disabled,39,uint16,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,40,int16,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,41,int16,1,W +com.victronenergy.vebus,/PvInverter/Disable,u,0=PV enabled;1=PV disabled,56,uint16,1,W +com.victronenergy.vebus,/Bms/AllowToCharge,u,0=No;1=Yes,57,uint16,1,R +com.victronenergy.vebus,/Bms/AllowToDischarge,u,0=No;1=Yes,58,uint16,1,R +com.victronenergy.vebus,/Bms/BmsExpected,u,0=No;1=Yes,59,uint16,1,R +com.victronenergy.vebus,/Bms/Error,u,0=No;1=Yes,60,uint16,1,R +com.victronenergy.vebus,/Dc/0/Temperature,d,Degrees celsius,61,int16,10,R +com.victronenergy.vebus,/SystemReset,y,0=No action;1=VE.Bus Reset,62,uint16,1,W +com.victronenergy.vebus,/Alarms/PhaseRotation,u,0=Ok;1=Warning,63,uint16,1,R +com.victronenergy.vebus,/Alarms/GridLost,i,0=No alarm;2=Alarm,64,uint16,1,R +com.victronenergy.vebus,/Hub4/DoNotFeedInOvervoltage,i,0=Feed in overvoltage;1=Don't feed in overvoltage,65,uint16,1,W +com.victronenergy.vebus,/Hub4/L1/MaxFeedInPower,d,W,66,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L2/MaxFeedInPower,d,W,67,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L3/MaxFeedInPower,d,W,68,uint16,0.01,W +com.victronenergy.vebus,/Ac/State/IgnoreAcIn1,i,0=AC input not ignored; 1=AC input ignored,69,uint16,1,R +com.victronenergy.vebus,/Ac/State/IgnoreAcIn2,i,0=AC input not ignored; 1=AC input ignored,70,uint16,1,R +com.victronenergy.vebus,/Hub4/TargetPowerIsMaxFeedIn,i,0=AcPowerSetpoint interpreted normally; 1=AcPowerSetpoint as OvervoltageFeedIn limit,71,uint16,W +com.victronenergy.vebus,/Hub4/FixSolarOffsetTo100mV,i,0=OvervoltageFeedIn uses 1V offset; 1=OvervoltageFeedIn uses 0.1V offset,72,uint16,W +com.victronenergy.battery,/ProductId,u,,256,,,R +com.victronenergy.battery,/FirmwareVersion,u,,257,,,R +com.victronenergy.battery,/Serial,s,,258,,,R +com.victronenergy.battery,/Dc/0/Voltage,d,V DC,259,uint16,100,R +com.victronenergy.battery,/Dc/1/Voltage,d,V DC,260,uint16,100,R +com.victronenergy.battery,/Dc/0/Current,d,A DC,261,int16,10,R +com.victronenergy.battery,/Dc/0/Temperature,d,Degrees celsius,262,int16,10,R +com.victronenergy.battery,/Dc/0/MidVoltage,d,V DC,263,uint16,100,R +com.victronenergy.battery,/Dc/0/MidVoltageDeviation,d,%,264,uint16,100,R +com.victronenergy.battery,/ConsumedAmphours,d,Ah,265,uint16,-10,R +com.victronenergy.battery,/Soc,y,%,266,uint16,10,R +com.victronenergy.battery,/Soh,y,%,304,uint16,10,R +com.victronenergy.battery,/TimeToGo,q,seconds,303,uint16,0.01,R +com.victronenergy.battery,/Info/MaxChargeVoltage,u,V DC,305,uint16,10,R +com.victronenergy.battery,/Info/BatteryLowVoltage,u,V DC,306,uint16,10,R +com.victronenergy.battery,/Info/MaxChargeCurrent,u,A DC,307,uint16,10,R +com.victronenergy.battery,/Info/MaxDischargeCurrent,u,A DC,308,uint16,10,R +com.victronenergy.battery,/Alarms/Alarm,y,0=No alarm;2=Alarm,267,uint16,1,R +com.victronenergy.battery,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,268,uint16,1,R +com.victronenergy.battery,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,269,uint16,1,R +com.victronenergy.battery,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,270,uint16,1,R +com.victronenergy.battery,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,271,uint16,1,R +com.victronenergy.battery,/Alarms/LowSoc,u,0=No alarm;2=Alarm,272,uint16,1,R +com.victronenergy.battery,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,273,uint16,1,R +com.victronenergy.battery,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,274,uint16,1,R +com.victronenergy.battery,/Alarms/MidVoltage,u,0=No alarm;2=Alarm,275,uint16,1,R +com.victronenergy.battery,/Alarms/LowFusedVoltage,u,0=No alarm;2=Alarm,276,uint16,1,R +com.victronenergy.battery,/Alarms/HighFusedVoltage,u,0=No alarm;2=Alarm,277,uint16,1,R +com.victronenergy.battery,/Alarms/FuseBlown,u,0=No alarm;2=Alarm,278,uint16,1,R +com.victronenergy.battery,/Alarms/HighInternalTemperature,u,0=No alarm;2=Alarm,279,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeCurrent,u,0=No alarm;2=Alarm,320,uint16,1,R +com.victronenergy.battery,/Alarms/HighDischargeCurrent,u,0=No alarm;2=Alarm,321,uint16,1,R +com.victronenergy.battery,/Alarms/CellImbalance,u,0=No alarm;2=Alarm,322,uint16,1,R +com.victronenergy.battery,/Alarms/InternalFailure,u,0=No alarm;2=Alarm,323,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeTemperature,u,0=No alarm;2=Alarm,324,uint16,1,R +com.victronenergy.battery,/Alarms/LowChargeTemperature,u,0=No alarm;2=Alarm,325,uint16,1,R +com.victronenergy.battery,/Alarms/LowCellVoltage,u,0=No alarm;1=Almost discharged;2=Alarm,326,uint16,1,R +com.victronenergy.battery,/Relay/0/State,y,0=Open;1=Closed,280,uint16,1,W +com.victronenergy.battery,/History/DeepestDischarge,d,Ah,281,uint16,-10,R +com.victronenergy.battery,/History/LastDischarge,d,Ah,282,uint16,-10,R +com.victronenergy.battery,/History/AverageDischarge,d,Ah,283,uint16,-10,R +com.victronenergy.battery,/History/ChargeCycles,i,count,284,uint16,1,R +com.victronenergy.battery,/History/FullDischarges,i,count,285,uint16,1,R +com.victronenergy.battery,/History/TotalAhDrawn,d,Ah,286,uint16,-10,R +com.victronenergy.battery,/History/MinimumVoltage,d,V DC,287,uint16,100,R +com.victronenergy.battery,/History/MaximumVoltage,d,V DC,288,uint16,100,R +com.victronenergy.battery,/History/TimeSinceLastFullCharge,i,seconds,289,uint16,0.01,R +com.victronenergy.battery,/History/AutomaticSyncs,i,count,290,uint16,1,R +com.victronenergy.battery,/History/LowVoltageAlarms,i,count,291,uint16,1,R +com.victronenergy.battery,/History/HighVoltageAlarms,i,count,292,uint16,1,R +com.victronenergy.battery,/History/LowStarterVoltageAlarms,i,count,293,uint16,1,R +com.victronenergy.battery,/History/HighStarterVoltageAlarms,i,count,294,uint16,1,R +com.victronenergy.battery,/History/MinimumStarterVoltage,d,V DC,295,uint16,100,R +com.victronenergy.battery,/History/MaximumStarterVoltage,d,V DC,296,uint16,100,R +com.victronenergy.battery,/History/LowFusedVoltageAlarms,i,count,297,uint16,1,R +com.victronenergy.battery,/History/HighFusedVoltageAlarms,i,count,298,uint16,1,R +com.victronenergy.battery,/History/MinimumFusedVoltage,d,V DC,299,uint16,100,R +com.victronenergy.battery,/History/MaximumFusedVoltage,d,V DC,300,uint16,100,R +com.victronenergy.battery,/History/DischargedEnergy,d,kWh,301,uint16,10,R +com.victronenergy.battery,/History/ChargedEnergy,d,kWh,302,uint16,10,R +com.victronenergy.battery,/Capacity,d,Ah,309,uint16,10,R +com.victronenergy.battery,/State,y,0=Initializing (Wait start);1=Initializing (before boot);2=Initializing (Before boot delay);3=Initializing (Wait boot);4=Initializing;5=Initializing (Measure battery voltage);6=Initializing (Calculate battery voltage);7=Initializing (Wait bus voltage);8=Initializing (Wait for lynx shunt);9=Running;10=Error (10);11=Error (11),1282,uint16,1,R +com.victronenergy.battery,/ErrorCode,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1283,uint16,1,R +com.victronenergy.battery,/SystemSwitch,y,0=Disabled;1=Enabled,1284,uint16,1,R +com.victronenergy.battery,/Balancing,y,0=Inactive;1=Active,1285,uint16,1,R +com.victronenergy.battery,/System/NrOfBatteries,y,count,1286,uint16,1,R +com.victronenergy.battery,/System/BatteriesParallel,y,count,1287,uint16,1,R +com.victronenergy.battery,/System/BatteriesSeries,y,count,1288,uint16,1,R +com.victronenergy.battery,/System/NrOfCellsPerBattery,y,count,1289,uint16,1,R +com.victronenergy.battery,/System/MinCellVoltage,d,V DC,1290,uint16,100,R +com.victronenergy.battery,/System/MaxCellVoltage,d,V DC,1291,uint16,100,R +com.victronenergy.battery,/Diagnostics/ShutDownsDueError,q,count,1292,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1293,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1294,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1295,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1296,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Time,u,,310,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Time,u,,312,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Time,u,,314,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Time,u,,316,int32,1,R +com.victronenergy.battery,/System/MinCellTemperature,d,Degrees celsius,318,int16,10,R +com.victronenergy.battery,/System/MaxCellTemperature,d,Degrees celsius,319,int16,10,R +com.victronenergy.battery,/Io/AllowToCharge,y,0=No;1=Yes,1297,uint16,1,R +com.victronenergy.battery,/Io/AllowToDischarge,y,0=No;1=Yes,1298,uint16,1,R +com.victronenergy.battery,/Io/ExternalRelay,y,0=Inactive;1=Active,1299,uint16,1,R +com.victronenergy.battery,/History/MinimumCellVoltage,d,V DC,1300,uint16,100,R +com.victronenergy.battery,/History/MaximumCellVoltage,d,V DC,1301,uint16,100,R +com.victronenergy.solarcharger,/ProductId,u,,768,,,R +com.victronenergy.solarcharger,/FirmwareVersion,u,,769,,,R +com.victronenergy.solarcharger,/Serial,s,,770,,,R +com.victronenergy.solarcharger,/Dc/0/Voltage,d,V DC,771,uint16,100,R +com.victronenergy.solarcharger,/Dc/0/Current,d,A DC,772,int16,10,R +com.victronenergy.solarcharger,/Dc/0/Temperature,d,Degrees celsius,773,int16,10,R +com.victronenergy.solarcharger,/Mode,i,1=On;4=Off,774,uint16,1,W +com.victronenergy.solarcharger,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;11=Other (Hub-1);252=Hub-1,775,uint16,1,R +com.victronenergy.solarcharger,/Pv/V,d,V DC,776,uint16,100,R +com.victronenergy.solarcharger,/Yield/Power,d,W,789,uint16,10,R +com.victronenergy.solarcharger,/Equalization/Pending,i,0=No;1=Yes;2=Error;3=Unavailable- Unknown,778,uint16,1,R +com.victronenergy.solarcharger,/Equalization/TimeRemaining,d,seconds,779,uint16,10,R +com.victronenergy.solarcharger,/Relay/0/State,i,0=Open;1=Closed,780,uint16,1,R +com.victronenergy.solarcharger,/Alarms/Alarm,i,0=No alarm;2=Alarm,781,uint16,1,R +com.victronenergy.solarcharger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,782,uint16,1,R +com.victronenergy.solarcharger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,783,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Yield,d,kWh,784,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/MaxPower,d,W,785,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Yield,d,kWh,786,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/MaxPower,d,W,787,uint16,1,R +com.victronenergy.solarcharger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,788,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,790,uint16,10,R +com.victronenergy.solarcharger,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,791,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/V,d,V DC,3700,uint16,100,R +com.victronenergy.solarcharger,/Pv/1/V,d,V DC,3701,uint16,100,R +com.victronenergy.solarcharger,/Pv/2/V,d,V DC,3702,uint16,100,R +com.victronenergy.solarcharger,/Pv/3/V,d,V DC,3703,uint16,100,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/Yield,d,kWh,3708,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/Yield,d,kWh,3709,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/Yield,d,kWh,3710,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/Yield,d,kWh,3711,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/Yield,d,kWh,3712,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/Yield,d,kWh,3713,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/Yield,d,kWh,3714,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/Yield,d,kWh,3715,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/MaxPower,d,W,3716,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/MaxPower,d,W,3717,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/MaxPower,d,W,3718,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/MaxPower,d,W,3719,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/MaxPower,d,W,3720,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/MaxPower,d,W,3721,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/MaxPower,d,W,3722,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/MaxPower,d,W,3723,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/P,d,W,3724,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/P,d,W,3725,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/P,d,W,3726,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/P,d,W,3727,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L1/Power,d,W,808,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L2/Power,d,W,809,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L3/Power,d,W,810,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L1/Power,d,W,811,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L2/Power,d,W,812,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L3/Power,d,W,813,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L1/Power,d,W,814,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L2/Power,d,W,815,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L3/Power,d,W,816,uint16,1,R +com.victronenergy.system,/Dc/Pv/Power,d,W,850,uint16,1,R +com.victronenergy.system,/Dc/Pv/Current,d,A DC,851,int16,10,R +com.victronenergy.system,/Dc/Charger/Power,d,W,855,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L1/Power,d,W,817,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L2/Power,d,W,818,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L3/Power,d,W,819,uint16,1,R +com.victronenergy.system,/Ac/Grid/L1/Power,d,W,820,int16,1,R +com.victronenergy.system,/Ac/Grid/L2/Power,d,W,821,int16,1,R +com.victronenergy.system,/Ac/Grid/L3/Power,d,W,822,int16,1,R +com.victronenergy.system,/Ac/Genset/L1/Power,d,W,823,int16,1,R +com.victronenergy.system,/Ac/Genset/L2/Power,d,W,824,int16,1,R +com.victronenergy.system,/Ac/Genset/L3/Power,d,W,825,int16,1,R +com.victronenergy.system,/Ac/ActiveIn/Source,u,0=Not available;1=Grid;2=Generator;3=Shore power;240=Not connected,826,int16,1,R +com.victronenergy.system,/Dc/System/Power,d,W,860,int16,1,R +com.victronenergy.system,/Dc/Battery/Voltage,d,V DC,840,uint16,10,R +com.victronenergy.system,/Dc/Battery/Current,d,A DC,841,int16,10,R +com.victronenergy.system,/Dc/Battery/Power,d,W,842,int16,1,R +com.victronenergy.system,/Dc/Vebus/Current,d,A DC,865,int16,10,R +com.victronenergy.system,/Dc/Vebus/Power,d,W,866,int16,1,R +com.victronenergy.system,/Dc/Battery/Soc,d,%,843,uint16,1,R +com.victronenergy.system,/Dc/Battery/State,i,0=idle;1=charging;2=discharging,844,uint16,1,R +com.victronenergy.system,/Dc/Battery/ConsumedAmphours,d,Ah,845,uint16,-10,R +com.victronenergy.system,/Dc/Battery/TimeToGo,d,s,846,uint16,0.01,R +com.victronenergy.system,/Relay/0/State,i,0=Open;1=Closed,806,uint16,1,W +com.victronenergy.system,/Relay/1/State,i,0=Open;1=Closed,807,uint16,1,W +com.victronenergy.system,/Serial,s,,800,string[6],1,R +com.victronenergy.pvinverter,/ProductId,u,,1024,,,R +com.victronenergy.pvinverter,/FirmwareVersion,s,,1025,,,R +com.victronenergy.pvinverter,/Position,i,0=AC input 1;1=AC output;2=AC input 2,1026,uint16,1,R +com.victronenergy.pvinverter,/Serial,s,,1039,string[7],1,R +com.victronenergy.pvinverter,/Ac/L1/Voltage,d,V AC,1027,uint16,10,R +com.victronenergy.pvinverter,/Ac/L1/Current,d,A AC,1028,int16,10,R +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1029,uint16,1,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1030,uint16,100,R +com.victronenergy.pvinverter,/Ac/L2/Voltage,d,V AC,1031,uint16,10,R +com.victronenergy.pvinverter,/Ac/L2/Current,d,A AC,1032,int16,10,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1033,uint16,1,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1034,uint16,100,R +com.victronenergy.pvinverter,/Ac/L3/Voltage,d,V AC,1035,uint16,10,R +com.victronenergy.pvinverter,/Ac/L3/Current,d,A AC,1036,int16,10,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1037,uint16,1,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1038,uint16,100,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1046,uint32,100,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1048,uint32,100,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1050,uint32,100,R +com.victronenergy.pvinverter,/Ac/Power,i,kW,1052,int32,1,W +com.victronenergy.pvinverter,/Ac/MaxPower,u,kW,1054,uint32,1,W +com.victronenergy.pvinverter,/Ac/PowerLimit,u,kW,1056,uint32,1,W +com.victronenergy.motordrive,/Motor/RPM,d,RPM,2048,int16,1,R +com.victronenergy.motordrive,/Motor/Temperature,d,Degrees celsius,2049,int16,10,R +com.victronenergy.motordrive,/Dc/0/Voltage,d,V DC,2050,uint16,100,R +com.victronenergy.motordrive,/Dc/0/Current,d,A DC,2051,int16,10,R +com.victronenergy.motordrive,/Dc/0/Power,d,W,2052,int16,10,R +com.victronenergy.motordrive,/Controller/Temperature,d,Degrees celsius,2053,int16,10,R +com.victronenergy.charger,/ProductId,,,2304,,,R +com.victronenergy.charger,/FirmwareVersion,,,2305,,,R +com.victronenergy.charger,/Serial,,,2306,,,R +com.victronenergy.charger,/Dc/0/Voltage,d,V DC,2307,uint16,100,R +com.victronenergy.charger,/Dc/0/Current,d,A DC,2308,int16,10,R +com.victronenergy.charger,/Dc/0/Temperature,d,Degrees celsius,2309,int16,10,R +com.victronenergy.charger,/Dc/1/Voltage,d,V DC,2310,uint16,100,R +com.victronenergy.charger,/Dc/1/Current,d,A DC,2311,int16,10,R +com.victronenergy.charger,/Dc/2/Voltage,d,V DC,2312,uint16,100,R +com.victronenergy.charger,/Dc/2/Current,d,A DC,2313,int16,10,R +com.victronenergy.charger,/Ac/In/L1/I,d,A AC,2314,int16,10,R +com.victronenergy.charger,/Ac/In/L1/P,d,W DC,2315,uint16,1,R +com.victronenergy.charger,/Ac/In/CurrentLimit,d,A AC,2316,int16,10,W +com.victronenergy.charger,/Mode,i,0=Off;1=On;2=Error;3=Unavailable- Unknown,2317,uint16,1,W +com.victronenergy.charger,/State,i,0=Off;1=Low Power Mode;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply mode;252=Bulk protection,2318,uint16,1,R +com.victronenergy.charger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,2319,uint16,1,R +com.victronenergy.charger,/Relay/0/State,i,0=Open;1=Closed,2320,uint16,1,R +com.victronenergy.charger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,2321,uint16,1,R +com.victronenergy.charger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,2322,uint16,1,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2600,int16,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2601,int16,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2602,int16,1,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2603,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2604,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2605,uint16,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2606,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2607,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2608,uint16,100,R +com.victronenergy.grid,/Serial,s,,2609,string[7],,R +com.victronenergy.grid,/Ac/L1/Voltage,d,V AC,2616,uint16,10,R +com.victronenergy.grid,/Ac/L1/Current,d,A AC,2617,int16,10,R +com.victronenergy.grid,/Ac/L2/Voltage,d,V AC,2618,uint16,10,R +com.victronenergy.grid,/Ac/L2/Current,d,A AC,2619,int16,10,R +com.victronenergy.grid,/Ac/L3/Voltage,d,V AC,2620,uint16,10,R +com.victronenergy.grid,/Ac/L3/Current,d,A AC,2621,int16,10,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2622,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2624,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2626,uint32,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2628,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2630,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2632,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Forward,d,kWh,2634,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Reverse,d,kWh,2636,uint32,100,R +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2700,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2703,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/MaxChargePercentage,d,%,2701,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePercentage,d,%,2702,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePower,d,W,2704,uint16,0.1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeCurrent,d,A,2705,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxFeedInPower,d,W,2706,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/OvervoltageFeedIn,i,0=Don't feed excess DC-coupled PV into grid;1=Feed excess DC-coupled PV into the grid,2707,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/PreventFeedback,i,0=Feed excess AC-coupled PV into grid;1=Don't feed excess AC-coupled PV into the grid,2708,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeVoltage,d,V,2710,uint16,10,W +com.victronenergy.hub4,/PvPowerLimiterActive,i,0=Feed-in limiting inactive;1=Feed-in limiting active,2709,uint16,1,R +com.victronenergy.tank,/ProductId,u,,3000,uint16,1,R +com.victronenergy.tank,/Capacity,d,m3,3001,uint32,10000,R +com.victronenergy.tank,/FluidType,u,0=Fuel;1=Fresh water;2=Waste water;3=Live well;4=Oil;5=Black water (sewage),3003,uint16,1,R +com.victronenergy.tank,/Level,d,%,3004,uint16,10,R +com.victronenergy.tank,/Remaining,d,m3,3005,uint32,10000,R +com.victronenergy.tank,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3007,uint16,1,R +com.victronenergy.inverter,/ProductId,u,,3127,uint16,1,R +com.victronenergy.inverter,/FirmwareVersion,u,,3125,uint16,1,R +com.victronenergy.inverter,/Ac/Out/L1/I,d,A AC,3100,int16,10,R +com.victronenergy.inverter,/Ac/Out/L1/V,d,V AC,3101,uint16,10,R +com.victronenergy.inverter,/Ac/Out/L1/P,d,W AC,3102,int16,0.1,R +com.victronenergy.inverter,/Alarms/HighTemperature,u,0=No alarm;1=Warning;2=Alarm,3110,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltage,u,0=No alarm;1=Warning;2=Alarm,3111,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3112,uint16,1,R +com.victronenergy.inverter,/Alarms/LowTemperature,u,0=No alarm;1=Warning;2=Alarm,3113,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltage,u,0=No alarm;1=Warning;2=Alarm,3114,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3115,uint16,1,R +com.victronenergy.inverter,/Alarms/Overload,u,0=No alarm;1=Warning;2=Alarm,3116,uint16,1,R +com.victronenergy.inverter,/Alarms/Ripple,u,0=No alarm;1=Warning;2=Alarm,3117,uint16,1,R +com.victronenergy.inverter,/Dc/0/Voltage,d,V DC,3105,uint16,100,R +com.victronenergy.inverter,/Dc/0/Current,d,A DC,3106,int16,10,R +com.victronenergy.inverter,/Mode,u,2=On;4=Off;5=Eco,3126,uint16,1,W +com.victronenergy.inverter,/State,u,0=Off;1=Low power mode (search mode);2=Fault;9=Inverting (on),3128,uint16,1,R +com.victronenergy.inverter,/Energy/InverterToAcOut,d,kWh,3130,uint32,100,R +com.victronenergy.inverter,/Energy/OutToInverter,d,kWh,3132,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToAcOut,d,kWh,3134,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToBattery,d,kWh,3136,uint32,100,R +com.victronenergy.inverter,/Pv/V,d,V DC,3138,uint16,10,R +com.victronenergy.inverter,/Pv/0/V,d,V DC,3140,uint16,10,R +com.victronenergy.inverter,/Pv/1/V,d,V DC,3141,uint16,10,R +com.victronenergy.inverter,/Pv/2/V,d,V DC,3142,uint16,10,R +com.victronenergy.inverter,/Pv/3/V,d,V DC,3143,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/Yield,d,kWh,3148,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/Yield,d,kWh,3149,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/Yield,d,kWh,3150,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/Yield,d,kWh,3151,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/Yield,d,kWh,3152,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/Yield,d,kWh,3153,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/Yield,d,kWh,3154,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/Yield,d,kWh,3155,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/MaxPower,d,W,3156,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/MaxPower,d,W,3157,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/MaxPower,d,W,3158,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/MaxPower,d,W,3159,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/MaxPower,d,W,3160,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/MaxPower,d,W,3161,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/MaxPower,d,W,3162,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/MaxPower,d,W,3163,uint16,1,R +com.victronenergy.inverter,/Pv/0/P,d,W,3164,uint16,1,R +com.victronenergy.inverter,/Pv/1/P,d,W,3165,uint16,1,R +com.victronenergy.inverter,/Pv/2/P,d,W,3166,uint16,1,R +com.victronenergy.inverter,/Pv/3/P,d,W,3167,uint16,1,R +com.victronenergy.genset,/ProductId,u,,3212,uint16,1,R +com.victronenergy.genset,/StatusCode,u,0=Standby;1=Startup 1;2=Startup 2;3=Startup 3;4=Startup 4;5=Startup 5;6=Startup 6;7=Startup 7;8=Running;9=Stopping;10=Error,3213,uint16,1,R +com.victronenergy.genset,/ErrorCode,u,0=No error;1=AC voltage L1 too low;2=AC frequency L1 too low;3=AC current too low;4=AC power too low;5=Emergency stop;6=Servo current too low;7=Oil pressure too low;8=Engine temperature too low;9=Winding temperature too low;10=Exhaust temperature too low;13=Starter current too low;14=Glow current too low;15=Glow current too low;16=Fuel holding magnet current too low;17=Stop solenoid hold coil current too low;18=Stop solenoid pull coil current too low;19=Optional DC out current too low;20=5V output voltage too low;21=Boost output current too low;22=Panel supply current too high;25=Starter battery voltage too low;26=Startup aborted (rotation too low);28=Rotation too low;29=Power contactor current too low;30=AC voltage L2 too low;31=AC frequency L2 too low;32=AC current L2 too low;33=AC power L2 too low;34=AC voltage L3 too low;35=AC frequency L3 too low;36=AC current L3 too low;37=AC power L3 too low;62=Fuel temperature too low;63=Fuel level too low;65=AC voltage L1 too high;66=AC frequency too high;67=AC current too high;68=AC power too high;70=Servo current too high;71=Oil pressure too high;72=Engine temperature too high;73=Winding temperature too high;74=Exhaust temperature too low;77=Starter current too low;78=Glow current too high;79=Glow current too high;80=Fuel holding magnet current too high;81=Stop solenoid hold coil current too high;82=Stop solenoid pull coil current too high;83=Optional DC out current too high;84=5V output voltage too high;85=Boost output current too high;89=Starter battery voltage too high;90=Startup aborted (rotation too high);92=Rotation too high;93=Power contactor current too high;94=AC voltage L2 too high;95=AC frequency L2 too high;96=AC current L2 too high;97=AC power L2 too high;98=AC voltage L3 too high;99=AC frequency L3 too high;100=AC current L3 too high;101=AC power L3 too high;126=Fuel temperature too high;127=Fuel level too high;130=Lost control unit;131=Lost panel;132=Service needed;133=Lost 3-phase module;134=Lost AGT module;135=Synchronization failure;137=Intake airfilter;139=Lost sync. module;140=Load-balance failed;141=Sync-mode deactivated;142=Engine controller;148=Rotating field wrong;149=Fuel level sensor lost;150=Init failed;151=Watchdog;152=Out: winding;153=Out: exhaust;154=Out: Cyl. head;155=Inverter over temperature;156=Inverter overload;157=Inverter communication lost;158=Inverter sync failed;159=CAN communication lost;160=L1 overload;161=L2 overload;162=L3 overload;163=DC overload;164=DC overvoltage;165=Emergency stop;166=No connection,3214,uint16,1,R +com.victronenergy.genset,/AutoStart,u,0=Disabled;1=Enabled,3215,uint16,1,R +com.victronenergy.genset,/Start,u,0=Stop;1=Start,3223,uint16,1,W +com.victronenergy.genset,/Engine/Load,d,%,3216,uint16,1,R +com.victronenergy.genset,/Engine/Speed,d,RPM,3217,uint16,1,R +com.victronenergy.genset,/Engine/OperatingHours,d,s,3218,uint16,0.01,R +com.victronenergy.genset,/Engine/CoolantTemperature,d,Degrees celsius,3219,int16,10,R +com.victronenergy.genset,/Engine/WindingTemperature,d,Degrees celsius,3220,int16,10,R +com.victronenergy.genset,/Engine/ExaustTemperature,d,Degrees celsius,3221,int16,10,R +com.victronenergy.genset,/StarterVoltage,d,V DC,3222,uint16,100,R +com.victronenergy.genset,/Ac/L1/Voltage,d,V AC,3200,uint16,10,R +com.victronenergy.genset,/Ac/L1/Current,d,A AC,3203,int16,10,R +com.victronenergy.genset,/Ac/L1/Power,d,W,3206,int16,1,R +com.victronenergy.genset,/Ac/L1/Frequency,d,Hz,3209,uint16,100,R +com.victronenergy.genset,/Ac/L2/Voltage,d,V AC,3201,uint16,10,R +com.victronenergy.genset,/Ac/L2/Current,d,A AC,3204,int16,10,R +com.victronenergy.genset,/Ac/L2/Power,d,W,3207,int16,1,R +com.victronenergy.genset,/Ac/L2/Frequency,d,Hz,3210,uint16,100,R +com.victronenergy.genset,/Ac/L3/Voltage,d,V AC,3202,uint16,10,R +com.victronenergy.genset,/Ac/L3/Current,d,A AC,3205,int16,10,R +com.victronenergy.genset,/Ac/L3/Power,d,W,3208,int16,1,R +com.victronenergy.genset,/Ac/L3/Frequency,d,Hz,3211,uint16,100,R +com.victronenergy.temperature,/ProductId,u,,3300,uint16,1,R +com.victronenergy.temperature,/Scale,d,,3301,uint16,100,R +com.victronenergy.temperature,/Offset,d,,3302,int16,100,R +com.victronenergy.temperature,/TemperatureType,u,0=Battery;1=Fridge;2=Generic,3303,uint16,1,R +com.victronenergy.temperature,/Temperature,d,Degrees celsius,3304,int16,100,R +com.victronenergy.temperature,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3305,uint16,1,R +com.victronenergy.pulsemeter,/Aggregate,i,,3400,uint32,1,R +com.victronenergy.pulsemeter,/Count,i,,3402,uint32,1,R +com.victronenergy.digitalinput,/Count,i,,3420,uint32,1,R +com.victronenergy.digitalinput,/State,i,,3422,uint16,1,R +com.victronenergy.digitalinput,/Alarm,i,0=No alarm;2=Alarm,3423,uint16,1,R +com.victronenergy.digitalinput,/Type,i,2=Door;3=Bilge pump;4=Bilge alarm;5=Burglar alarm;6=Smoke alarm;7=Fire alarm;8=CO2 alarm,3424,uint16,1,R +com.victronenergy.generator,/Generator0/ManualStart,i,0=Stop generator;1=Start generator,3500,uint16,1,W +com.victronenergy.generator,/Generator0/RunningByConditionCode,i,0=Stopped;1=Manual;2=TestRun;3=LossOfComms;4=Soc;5=AcLoad;6=BatteryCurrent;7=BatteryVoltage;8=InverterTemperatur;9=InverterOverload;10=StopOnAc1,3501,uint16,1,R +com.victronenergy.generator,/Generator0/Runtime,i,seconds,3502,uint16,1,R +com.victronenergy.generator,/Generator0/Runtime,u,seconds,3504,uint32,1,R +com.victronenergy.generator,/Generator0/State,i,0=Stopped;1=Running;10=Error,3506,uint16,1,R +com.victronenergy.generator,/Generator0/Error,i,0=No Error;1=Remote disabled;2=Remote fault,3507,uint16,1,R +com.victronenergy.generator,/Generator0/Alarms/NoGeneratorAtAcIn,i,0=No Alarm;2=Alarm,3508,uint16,1,R +com.victronenergy.meteo,/Irradiance,d,W/m^2,3600,uint16,10,R +com.victronenergy.meteo,/WindSpeed,d,m/s,3601,uint16,10,R +com.victronenergy.meteo,/CellTemperature,d,Degrees celsius,3602,int16,10,R +com.victronenergy.meteo,/ExternalTemperature,d,Degrees celsius,3603,int16,10,R +com.victronenergy.evcharger,/ProductId,u,,3800,uint16,1,R +com.victronenergy.evcharger,/FirmwareVersion,u,,3802,uint32,1,R +com.victronenergy.evcharger,/Serial,s,,3804,string[6],,R +com.victronenergy.evcharger,/Model,s,,3810,string[4],,R +com.victronenergy.evcharger,/MaxCurrent,d,A,3814,uint16,1,W +com.victronenergy.evcharger,/Mode,u,0=Manual;1=Auto,3815,uint16,1,W +com.victronenergy.evcharger,/Ac/Energy/Forward,d,kWh,3816,uint32,100,R +com.victronenergy.evcharger,/Ac/L1/Power,d,W,3818,uint16,1,R +com.victronenergy.evcharger,/Ac/L2/Power,d,W,3819,uint16,1,R +com.victronenergy.evcharger,/Ac/L3/Power,d,W,3820,uint16,1,R +com.victronenergy.evcharger,/Ac/Power,d,W,3821,uint16,1,R +com.victronenergy.evcharger,/ChargingTime,d,s,3822,uint16,0.01,R +com.victronenergy.evcharger,/Current,d,A,3823,uint16,1,W +com.victronenergy.evcharger,/Status,u,0=Disconnected; 1=Connected; 2=Charging; 3=Charged; 4=Waiting for sun; 5=Waiting for RFID; 6=Waiting for start; 7=Low SOC; 8=Ground fault; 9=Welded contacts; 10=CP Input shorted; 11=Residual current detected; 12=Under voltage detected; 13=Overvoltage detected; 14=Overheating detected,3824,uint16,1,R +com.victronenergy.evcharger,/SetCurrent,d,A,3825,uint16,1,W +com.victronenergy.evcharger,/StartStop,u,0=Stop;1=Start,3826,uint16,1,W +com.victronenergy.acload,/Ac/L1/Power,d,W,3900,int16,1,R +com.victronenergy.acload,/Ac/L2/Power,d,W,3901,int16,1,R +com.victronenergy.acload,/Ac/L3/Power,d,W,3902,int16,1,R +com.victronenergy.acload,/Serial,s,,3903,string[7],,R +com.victronenergy.acload,/Ac/L1/Voltage,d,V AC,3910,uint16,10,R +com.victronenergy.acload,/Ac/L1/Current,d,A AC,3911,int16,10,R +com.victronenergy.acload,/Ac/L2/Voltage,d,V AC,3912,uint16,10,R +com.victronenergy.acload,/Ac/L2/Current,d,A AC,3913,int16,10,R +com.victronenergy.acload,/Ac/L3/Voltage,d,V AC,3914,uint16,10,R +com.victronenergy.acload,/Ac/L3/Current,d,A AC,3915,int16,10,R +com.victronenergy.acload,/Ac/L1/Energy/Forward,d,kWh,3916,uint32,100,R +com.victronenergy.acload,/Ac/L2/Energy/Forward,d,kWh,3918,uint32,100,R +com.victronenergy.acload,/Ac/L3/Energy/Forward,d,kWh,3920,uint32,100,R +com.victronenergy.fuelcell,/Dc/0/Voltage,d,V DC,4000,uint16,100,R +com.victronenergy.fuelcell,/Dc/0/Current,d,A DC,4001,int16,10,R +com.victronenergy.fuelcell,/Dc/1/Voltage,d,V DC,4002,int16,10,R +com.victronenergy.fuelcell,/Dc/0/Temperature,d,Degrees celsius,4003,int16,10,R +com.victronenergy.fuelcell,/History/EnergyOut,d,kWh,4004,uint32,100,R +com.victronenergy.fuelcell,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4006,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4007,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4008,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4009,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4010,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4011,uint16,1,R +com.victronenergy.alternator,/Dc/0/Voltage,d,V DC,4100,uint16,100,R +com.victronenergy.alternator,/Dc/0/Current,d,A DC,4101,int16,10,R +com.victronenergy.alternator,/Dc/1/Voltage,d,V DC,4102,int16,10,R +com.victronenergy.alternator,/Dc/0/Temperature,d,Degrees celsius,4103,int16,10,R +com.victronenergy.alternator,/History/EnergyOut,d,kWh,4104,uint32,100,R +com.victronenergy.alternator,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4106,uint16,1,R +com.victronenergy.alternator,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4107,uint16,1,R +com.victronenergy.alternator,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4108,uint16,1,R +com.victronenergy.alternator,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4109,uint16,1,R +com.victronenergy.alternator,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4110,uint16,1,R +com.victronenergy.alternator,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4111,uint16,1,R +com.victronenergy.dcsource,/Dc/0/Voltage,d,V DC,4200,uint16,100,R +com.victronenergy.dcsource,/Dc/0/Current,d,A DC,4201,int16,10,R +com.victronenergy.dcsource,/Dc/1/Voltage,d,V DC,4202,int16,10,R +com.victronenergy.dcsource,/Dc/0/Temperature,d,Degrees centigrade,4203,int16,10,R +com.victronenergy.dcsource,/History/EnergyOut,d,kWh,4204,uint32,100,R +com.victronenergy.dcsource,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4206,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4207,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4208,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4209,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4210,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4211,uint16,1,R +com.victronenergy.dcload,/Dc/0/Voltage,d,V DC,4300,uint16,100,R +com.victronenergy.dcload,/Dc/0/Current,d,A DC,4301,int16,10,R +com.victronenergy.dcload,/Dc/1/Voltage,d,V DC,4302,int16,10,R +com.victronenergy.dcload,/Dc/0/Temperature,d,Degrees centigrade,4303,int16,10,R +com.victronenergy.dcload,/History/EnergyIn,d,kWh,4304,uint32,100,R +com.victronenergy.dcload,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4306,uint16,1,R +com.victronenergy.dcload,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4307,uint16,1,R +com.victronenergy.dcload,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4308,uint16,1,R +com.victronenergy.dcload,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4309,uint16,1,R +com.victronenergy.dcload,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4310,uint16,1,R +com.victronenergy.dcload,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4311,uint16,1,R +com.victronenergy.dcsystem,/Dc/0/Voltage,d,V DC,4400,uint16,100,R +com.victronenergy.dcsystem,/Dc/0/Current,d,A DC,4401,int16,10,R +com.victronenergy.dcsystem,/Dc/1/Voltage,d,V DC,4402,int16,10,R +com.victronenergy.dcsystem,/Dc/0/Temperature,d,Degrees centigrade,4403,int16,10,R +com.victronenergy.dcsystem,/History/EnergyOut,d,kWh,4404,uint32,100,R +com.victronenergy.dcsystem,/History/EnergyIn,d,kWh,4406,uint32,100,R +com.victronenergy.dcsystem,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4408,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4409,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4410,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4411,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4412,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4413,uint16,1,R +com.victronenergy.multi,/Ac/In/1/L1/V,d,V AC,4500,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/V,d,V AC,4501,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/V,d,V AC,4502,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/I,d,A AC,4503,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/I,d,A AC,4504,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/I,d,A AC,4505,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/P,d,W,4506,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L2/P,d,W,4507,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L3/P,d,W,4508,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L1/F,d,Hz,4509,uint16,100,R +com.victronenergy.multi,/Ac/Out/L1/V,d,V AC,4510,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/V,d,V AC,4511,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/V,d,V AC,4512,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/I,d,A AC,4513,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/I,d,A AC,4514,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/I,d,A AC,4515,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/P,d,W,4516,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L2/P,d,W,4517,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L3/P,d,W,4518,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L1/F,d,Hz,4519,uint16,100,R +com.victronenergy.multi,/Ac/In/1/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4520,uint16,1,R +com.victronenergy.multi,/Ac/In/2/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4521,uint16,1,R +com.victronenergy.multi,/Ac/In/1/CurrentLimit,d,A,4522,uint16,10,W +com.victronenergy.multi,/Ac/In/2/CurrentLimit,d,A,4523,uint16,10,W +com.victronenergy.multi,/Ac/NumberOfPhases,u,count,4524,uint16,1,R +com.victronenergy.multi,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,4525,uint16,1,R +com.victronenergy.multi,/Dc/0/Voltage,d,V DC,4526,uint16,100,R +com.victronenergy.multi,/Dc/0/Current,d,A DC,4527,int16,10,R +com.victronenergy.multi,/Dc/0/Temperature,d,Degrees celsius,4528,int16,10,R +com.victronenergy.multi,/Soc,d,%,4529,uint16,10,R +com.victronenergy.multi,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=Bulk protection,4530,uint16,1,R +com.victronenergy.multi,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,4531,uint16,1,W +com.victronenergy.multi,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,4532,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltage,u,0=Ok;1=Warning;2=Alarm,4533,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4534,uint16,1,R +com.victronenergy.multi,/Alarms/LowTemperature,u,0=Ok;1=Warning;2=Alarm,4535,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltage,u,0=Ok;1=Warning;2=Alarm,4536,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4537,uint16,1,R +com.victronenergy.multi,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,4538,uint16,1,R +com.victronenergy.multi,/Alarms/Ripple,u,0=Ok;1=Warning;2=Alarm,4539,uint16,1,R +com.victronenergy.multi,/Yield/Power,d,W,4540,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4541,uint16,10,R +com.victronenergy.multi,/Relay/0/State,i,0=Open;1=Closed,4542,uint16,1,R +com.victronenergy.multi,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4543,uint16,1,R +com.victronenergy.multi,/Pv/V,d,V DC,4544,uint16,10,R +com.victronenergy.multi,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,4545,uint16,1,R +com.victronenergy.multi,/Energy/AcIn1ToAcOut,d,kWh,4546,uint32,100,R +com.victronenergy.multi,/Energy/AcIn1ToInverter,d,kWh,4548,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToAcOut,d,kWh,4550,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToInverter,d,kWh,4552,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn1,d,kWh,4554,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn2,d,kWh,4556,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn1,d,kWh,4558,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn2,d,kWh,4560,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcOut,d,kWh,4562,uint32,100,R +com.victronenergy.multi,/Energy/OutToInverter,d,kWh,4564,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn1,d,kWh,4566,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn2,d,kWh,4568,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcOut,d,kWh,4570,uint32,100,R +com.victronenergy.multi,/Energy/SolarToBattery,d,kWh,4572,uint32,100,R diff --git a/FileSets/v2.89/dbus_digitalinputs.py b/FileSets/v2.89/dbus_digitalinputs.py new file mode 100755 index 00000000..c43295bc --- /dev/null +++ b/FileSets/v2.89/dbus_digitalinputs.py @@ -0,0 +1,553 @@ +#!/usr/bin/python3 -u + +#### modified for ExtTransferSwitch package + +import sys, os +import signal +from threading import Thread +from select import select, epoll, EPOLLPRI +from functools import partial +from collections import namedtuple +from argparse import ArgumentParser +import traceback +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) + +from dbus.mainloop.glib import DBusGMainLoop +import dbus +from gi.repository import GLib +from vedbus import VeDbusService +from settingsdevice import SettingsDevice + +VERSION = '0.15' +MAXCOUNT = 2**31-1 +SAVEINTERVAL = 60000 + +INPUT_FUNCTION_COUNTER = 1 +INPUT_FUNCTION_INPUT = 2 + +Translation = namedtuple('Translation', ['no', 'yes']) + +# Only append at the end +INPUTTYPES = [ + 'Disabled', + 'Pulse meter', + 'Door', + 'Bilge pump', + 'Bilge alarm', + 'Burglar alarm', + 'Smoke alarm', + 'Fire alarm', + 'CO2 alarm', + 'Generator', +#### added for ExtTransferSwitch package + 'Generic I/O', #added to make following entry line up across versions +#### added for ExtTransferSwitch package -- must be LAST in the list + 'Transfer switch' +] + +# Translations. The text will be used only for GetText, it will be translated +# in the gui. +TRANSLATIONS = [ + Translation('low', 'high'), + Translation('off', 'on'), + Translation('no', 'yes'), + Translation('open', 'closed'), + Translation('ok', 'alarm'), + Translation('running', 'stopped'), +#### added for ExtTransferSwitch package + Translation('on generator', 'on grid') +] + +class SystemBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SYSTEM) + +class SessionBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SESSION) + +class BasePulseCounter(object): + pass + +class DebugPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + self.gpiomap[gpio] = None + return 0 + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + for level in cycle([0, 1]): + for gpio in list(self.gpiomap.keys()): + yield gpio, level + sleep(0.25/len(self.gpiomap)) + +class EpollPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + self.states = {} + self.ob = epoll() + + def register(self, path, gpio): + path = os.path.realpath(path) + + # Set up gpio for rising edge interrupts + with open(os.path.join(path, 'edge'), 'ab') as fp: + fp.write(b'both') + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) # flush it in case it's high at startup + self.gpiomap[gpio] = fp + self.states[gpio] = level + self.ob.register(fp, EPOLLPRI) + return level + + def unregister(self, gpio): + fp = self.gpiomap[gpio] + self.ob.unregister(fp) + del self.gpiomap[gpio] + del self.states[gpio] + fp.close() + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + while True: + # We have a timeout of 1 second on the poll, because poll() only + # looks at files in the epoll object at the time poll() was called. + # The timeout means we let other files (added via calls to + # register/unregister) into the loop at least that often. + self.ob.poll(1) + + # When coming out of the epoll call, we read all the gpios to make + # sure we didn't miss any edges. This is a safety fallback that + # ensures everything is up to date once a second, but + # edge-triggered results are handled immediately. + # NOTE: There has not been a report of a missed interrupt yet. + # Belts and suspenders. + for gpio, fp in list(self.gpiomap.items()): + os.lseek(fp.fileno(), 0, os.SEEK_SET) + v = int(os.read(fp.fileno(), 1)) + if v != self.states[gpio]: + self.states[gpio] = v + yield gpio, v + +class PollingPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + path = os.path.realpath(path) + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) + self.gpiomap[gpio] = [fp, level] + return level + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + while True: + for gpio, (fp, level) in list(self.gpiomap.items()): + fp.seek(0, os.SEEK_SET) + v = int(fp.read()) + if v != level: + self.gpiomap[gpio][1] = v + yield gpio, v + sleep(1) + +class HandlerMaker(type): + """ Meta-class for keeping track of all extended classes. """ + def __init__(cls, name, bases, attrs): + if not hasattr(cls, 'handlers'): + cls.handlers = {} + else: + cls.handlers[cls.type_id] = cls + +class PinHandler(object, metaclass=HandlerMaker): + product_id = 0xFFFF + _product_name = 'Generic GPIO' + dbus_name = "digital" + def __init__(self, bus, base, path, gpio, settings): + self.gpio = gpio + self.path = path + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + self.service = VeDbusService( + "{}.{}.input{:02d}".format(base, self.dbus_name, gpio), bus=bus) + + # Add objects required by ve-api + self.service.add_path('/Mgmt/ProcessName', __file__) + self.service.add_path('/Mgmt/ProcessVersion', VERSION) + self.service.add_path('/Mgmt/Connection', path) + self.service.add_path('/DeviceInstance', gpio) + self.service.add_path('/ProductId', self.product_id) + self.service.add_path('/ProductName', self.product_name) + self.service.add_path('/Connected', 1) + + # Custom name setting + def _change_name(p, v): + # This should fire a change event that will update product_name + # below. + settings['name'] = v + return True + + self.service.add_path('/CustomName', settings['name'], writeable=True, + onchangecallback=_change_name) + + # We'll count the pulses for all types of services + self.service.add_path('/Count', value=settings['count']) + + @property + def product_name(self): + return self.settings['name'] or self._product_name + + @product_name.setter + def product_name(self, v): + # Some pin types don't have an associated service (Disabled pins for + # example) + if self.service is not None: + self.service['/ProductName'] = v or self._product_name + + def deactivate(self): + self.save_count() + self.service.__del__() + del self.service + self.service = None + + @property + def level(self): + return self._level + + @level.setter + def level(self, l): + self._level = int(bool(l)) + + def toggle(self, level): + # Only increment Count on rising edge. + if level and level != self._level: + self.service['/Count'] = (self.service['/Count']+1) % MAXCOUNT + self._level = level + + def refresh(self): + """ Toggle state to last remembered state. This is called if settings + are changed so the Service can recalculate paths. """ + self.toggle(self._level) + + def save_count(self): + if self.service is not None: + self.settings['count'] = self.count + + @property + def active(self): + return self.service is not None + + @property + def count(self): + return self.service['/Count'] + + @count.setter + def count(self, v): + self.service['/Count'] = v + + @classmethod + def createHandler(cls, _type, *args, **kwargs): + if _type in cls.handlers: + return cls.handlers[_type](*args, **kwargs) + return None + + +class DisabledPin(PinHandler): + """ Place holder for a disabled pin. """ + _product_name = 'Disabled' + type_id = 0 + def __init__(self, bus, base, path, gpio, settings): + self.service = None + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + def deactivate(self): + pass + + def toggle(self, level): + self._level = level + + def save_count(self): + # Do nothing + pass + + @property + def count(self): + return self.settings['count'] + + @count.setter + def count(self, v): + pass + + def refresh(self): + pass + + +class VolumeCounter(PinHandler): + product_id = 0xA165 + _product_name = "Generic pulse meter" + dbus_name = "pulsemeter" + type_id = 1 + + def __init__(self, bus, base, path, gpio, settings): + super(VolumeCounter, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/Aggregate', value=self.count*self.rate, + gettextcallback=lambda p, v: (str(v) + ' cubic meter')) + + @property + def rate(self): + return self.settings['rate'] + + def toggle(self, level): + super(VolumeCounter, self).toggle(level) + self.service['/Aggregate'] = self.count * self.rate + +class PinAlarm(PinHandler): + product_id = 0xA166 + _product_name = "Generic digital input" + dbus_name = "digitalinput" + type_id = 0xFF + translation = 0 # low, high + + def __init__(self, bus, base, path, gpio, settings): + super(PinAlarm, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/InputState', value=0) + self.service.add_path('/State', value=self.get_state(0), + gettextcallback=lambda p, v: TRANSLATIONS[v//2][v%2]) + self.service.add_path('/Alarm', value=self.get_alarm_state(0)) + + # Also expose the type + self.service.add_path('/Type', value=self.type_id, + gettextcallback=lambda p, v: INPUTTYPES[v]) + + def toggle(self, level): + super(PinAlarm, self).toggle(level) + self.service['/InputState'] = bool(level)*1 + self.service['/State'] = self.get_state(level) + # Ensure that the alarm flag resets if the /AlarmSetting config option + # disappears. + self.service['/Alarm'] = self.get_alarm_state(level) + + def get_state(self, level): + state = level ^ self.settings['invert'] + return 2 * self.translation + state + + def get_alarm_state(self, level): + return 2 * bool( + (level ^ self.settings['invertalarm']) and self.settings['alarm']) + + +# Various types of things we might want to monitor +class DoorSensor(PinAlarm): + _product_name = "Door alarm" + type_id = 2 + translation = 3 # open, closed + +class BilgePump(PinAlarm): + _product_name = "Bilge pump" + type_id = 3 + translation = 1 # off, on + +class BilgeAlarm(PinAlarm): + _product_name = "Bilge alarm" + type_id = 4 + translation = 4 # ok, alarm + +class BurglarAlarm(PinAlarm): + _product_name = "Burglar alarm" + type_id = 5 + translation = 4 # ok, alarm + +class SmokeAlarm(PinAlarm): + _product_name = "Smoke alarm" + type_id = 6 + translation = 4 # ok, alarm + +class FireAlarm(PinAlarm): + _product_name = "Fire alarm" + type_id = 7 + translation = 4 # ok, alarm + +class CO2Alarm(PinAlarm): + _product_name = "CO2 alarm" + type_id = 8 + translation = 4 # ok, alarm + +class Generator(PinAlarm): + _product_name = "Generator" + type_id = 9 + translation = 5 # running, stopped + +#### added for ExtTransferSwitch package +class GenericIO(PinAlarm): + _product_name = "Generic I/O" + type_id = 10 + translation = 0 # low, high + +class TransferSwitch(PinAlarm): + _product_name = "External AC Input transfer switch" + type_id = 11 + translation = 5 # Grid In / Generator In + + +def dbusconnection(): + return SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else SystemBus() + + +def main(): + parser = ArgumentParser(description=sys.argv[0]) + parser.add_argument('--servicebase', + help='Base service name on dbus, default is com.victronenergy', + default='com.victronenergy') + parser.add_argument('--poll', + help='Use a different kind of polling. Options are epoll, dumb and debug', + default='epoll') + parser.add_argument('inputs', nargs='+', help='Path to digital input') + args = parser.parse_args() + + PulseCounter = { + 'debug': DebugPulseCounter, + 'poll': PollingPulseCounter, + }.get(args.poll, EpollPulseCounter) + + DBusGMainLoop(set_as_default=True) + + # Keep track of enabled services + services = {} + inputs = dict(enumerate(args.inputs, 1)) + pulses = PulseCounter() # callable that iterates over pulses + + def register_gpio(path, gpio, bus, settings): + _type = settings['inputtype'] + print ("Registering GPIO {} for type {}".format(gpio, _type)) + + handler = PinHandler.createHandler(_type, + bus, args.servicebase, path, gpio, settings) + services[gpio] = handler + + # Only monitor if enabled + if _type > 0: + handler.level = pulses.register(path, gpio) + handler.refresh() + + def unregister_gpio(gpio): + print ("unRegistering GPIO {}".format(gpio)) + pulses.unregister(gpio) + services[gpio].deactivate() + + def handle_setting_change(inp, setting, old, new): + if setting == 'inputtype': + if new: + # Get current bus and settings objects, to be reused + service = services[inp] + bus, settings = service.bus, service.settings + + # Input enabled. If already enabled, unregister the old one first. + if pulses.registered(inp): + unregister_gpio(inp) + + # Before registering the new input, reset its settings to defaults + settings['count'] = 0 + settings['invert'] = 0 + settings['invertalarm'] = 0 + settings['alarm'] = 0 + + # Register it + register_gpio(inputs[inp], inp, bus, settings) + elif old: + # Input disabled + unregister_gpio(inp) + elif setting in ('rate', 'invert', 'alarm', 'invertalarm'): + services[inp].refresh() + elif setting == 'name': + services[inp].product_name = new + elif setting == 'count': + # Don't want this triggered on a period save, so only execute + # if it has changed. + v = int(new) + s = services[inp] + if s.count != v: + s.count = v + s.refresh() + + for inp, pth in inputs.items(): + supported_settings = { + 'inputtype': ['/Settings/DigitalInput/{}/Type'.format(inp), 0, 0, len(INPUTTYPES)], + 'rate': ['/Settings/DigitalInput/{}/Multiplier'.format(inp), 0.001, 0, 1.0], + 'count': ['/Settings/DigitalInput/{}/Count'.format(inp), 0, 0, MAXCOUNT, 1], + 'invert': ['/Settings/DigitalInput/{}/InvertTranslation'.format(inp), 0, 0, 1], + 'invertalarm': ['/Settings/DigitalInput/{}/InvertAlarm'.format(inp), 0, 0, 1], + 'alarm': ['/Settings/DigitalInput/{}/AlarmSetting'.format(inp), 0, 0, 1], + 'name': ['/Settings/DigitalInput/{}/CustomName'.format(inp), '', '', ''], + } + bus = dbusconnection() + sd = SettingsDevice(bus, supported_settings, partial(handle_setting_change, inp), timeout=10) + register_gpio(pth, inp, bus, sd) + + def poll(mainloop): + from time import time + idx = 0 + + try: + for inp, level in pulses(): + # epoll object only resyncs once a second. We may receive + # a pulse for something that's been deregistered. + try: + services[inp].toggle(level) + except KeyError: + continue + except: + traceback.print_exc() + mainloop.quit() + + # Need to run the gpio polling in separate thread. Pass in the mainloop so + # the thread can kill us if there is an exception. + mainloop = GLib.MainLoop() + + poller = Thread(target=lambda: poll(mainloop)) + poller.daemon = True + poller.start() + + # Periodically save the counter + def save_counters(): + for inp in inputs: + services[inp].save_count() + return True + GLib.timeout_add(SAVEINTERVAL, save_counters) + + # Save counter on shutdown + signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) + + try: + mainloop.run() + except KeyboardInterrupt: + pass + finally: + save_counters() + +if __name__ == "__main__": + main() diff --git a/FileSets/v2.89/dbus_digitalinputs.py.orig b/FileSets/v2.89/dbus_digitalinputs.py.orig new file mode 100755 index 00000000..79b58848 --- /dev/null +++ b/FileSets/v2.89/dbus_digitalinputs.py.orig @@ -0,0 +1,534 @@ +#!/usr/bin/python3 -u + +import sys, os +import signal +from threading import Thread +from select import select, epoll, EPOLLPRI +from functools import partial +from collections import namedtuple +from argparse import ArgumentParser +import traceback +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) + +from dbus.mainloop.glib import DBusGMainLoop +import dbus +from gi.repository import GLib +from vedbus import VeDbusService +from settingsdevice import SettingsDevice + +VERSION = '0.15' +MAXCOUNT = 2**31-1 +SAVEINTERVAL = 60000 + +INPUT_FUNCTION_COUNTER = 1 +INPUT_FUNCTION_INPUT = 2 + +Translation = namedtuple('Translation', ['no', 'yes']) + +# Only append at the end +INPUTTYPES = [ + 'Disabled', + 'Pulse meter', + 'Door', + 'Bilge pump', + 'Bilge alarm', + 'Burglar alarm', + 'Smoke alarm', + 'Fire alarm', + 'CO2 alarm', + 'Generator' +] + +# Translations. The text will be used only for GetText, it will be translated +# in the gui. +TRANSLATIONS = [ + Translation('low', 'high'), + Translation('off', 'on'), + Translation('no', 'yes'), + Translation('open', 'closed'), + Translation('ok', 'alarm'), + Translation('running', 'stopped') +] + +class SystemBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SYSTEM) + +class SessionBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SESSION) + +class BasePulseCounter(object): + pass + +class DebugPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + self.gpiomap[gpio] = None + return 0 + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + for level in cycle([0, 1]): + for gpio in list(self.gpiomap.keys()): + yield gpio, level + sleep(0.25/len(self.gpiomap)) + +class EpollPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + self.states = {} + self.ob = epoll() + + def register(self, path, gpio): + path = os.path.realpath(path) + + # Set up gpio for rising edge interrupts + with open(os.path.join(path, 'edge'), 'ab') as fp: + fp.write(b'both') + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) # flush it in case it's high at startup + self.gpiomap[gpio] = fp + self.states[gpio] = level + self.ob.register(fp, EPOLLPRI) + return level + + def unregister(self, gpio): + fp = self.gpiomap[gpio] + self.ob.unregister(fp) + del self.gpiomap[gpio] + del self.states[gpio] + fp.close() + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + while True: + # We have a timeout of 1 second on the poll, because poll() only + # looks at files in the epoll object at the time poll() was called. + # The timeout means we let other files (added via calls to + # register/unregister) into the loop at least that often. + self.ob.poll(1) + + # When coming out of the epoll call, we read all the gpios to make + # sure we didn't miss any edges. This is a safety fallback that + # ensures everything is up to date once a second, but + # edge-triggered results are handled immediately. + # NOTE: There has not been a report of a missed interrupt yet. + # Belts and suspenders. + for gpio, fp in list(self.gpiomap.items()): + os.lseek(fp.fileno(), 0, os.SEEK_SET) + v = int(os.read(fp.fileno(), 1)) + if v != self.states[gpio]: + self.states[gpio] = v + yield gpio, v + +class PollingPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + path = os.path.realpath(path) + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) + self.gpiomap[gpio] = [fp, level] + return level + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + while True: + for gpio, (fp, level) in list(self.gpiomap.items()): + fp.seek(0, os.SEEK_SET) + v = int(fp.read()) + if v != level: + self.gpiomap[gpio][1] = v + yield gpio, v + sleep(1) + +class HandlerMaker(type): + """ Meta-class for keeping track of all extended classes. """ + def __init__(cls, name, bases, attrs): + if not hasattr(cls, 'handlers'): + cls.handlers = {} + else: + cls.handlers[cls.type_id] = cls + +class PinHandler(object, metaclass=HandlerMaker): + product_id = 0xFFFF + _product_name = 'Generic GPIO' + dbus_name = "digital" + def __init__(self, bus, base, path, gpio, settings): + self.gpio = gpio + self.path = path + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + self.service = VeDbusService( + "{}.{}.input{:02d}".format(base, self.dbus_name, gpio), bus=bus) + + # Add objects required by ve-api + self.service.add_path('/Mgmt/ProcessName', __file__) + self.service.add_path('/Mgmt/ProcessVersion', VERSION) + self.service.add_path('/Mgmt/Connection', path) + self.service.add_path('/DeviceInstance', gpio) + self.service.add_path('/ProductId', self.product_id) + self.service.add_path('/ProductName', self.product_name) + self.service.add_path('/Connected', 1) + + # Custom name setting + def _change_name(p, v): + # This should fire a change event that will update product_name + # below. + settings['name'] = v + return True + + self.service.add_path('/CustomName', settings['name'], writeable=True, + onchangecallback=_change_name) + + # We'll count the pulses for all types of services + self.service.add_path('/Count', value=settings['count']) + + @property + def product_name(self): + return self.settings['name'] or self._product_name + + @product_name.setter + def product_name(self, v): + # Some pin types don't have an associated service (Disabled pins for + # example) + if self.service is not None: + self.service['/ProductName'] = v or self._product_name + + def deactivate(self): + self.save_count() + self.service.__del__() + del self.service + self.service = None + + @property + def level(self): + return self._level + + @level.setter + def level(self, l): + self._level = int(bool(l)) + + def toggle(self, level): + # Only increment Count on rising edge. + if level and level != self._level: + self.service['/Count'] = (self.service['/Count']+1) % MAXCOUNT + self._level = level + + def refresh(self): + """ Toggle state to last remembered state. This is called if settings + are changed so the Service can recalculate paths. """ + self.toggle(self._level) + + def save_count(self): + if self.service is not None: + self.settings['count'] = self.count + + @property + def active(self): + return self.service is not None + + @property + def count(self): + return self.service['/Count'] + + @count.setter + def count(self, v): + self.service['/Count'] = v + + @classmethod + def createHandler(cls, _type, *args, **kwargs): + if _type in cls.handlers: + return cls.handlers[_type](*args, **kwargs) + return None + + +class DisabledPin(PinHandler): + """ Place holder for a disabled pin. """ + _product_name = 'Disabled' + type_id = 0 + def __init__(self, bus, base, path, gpio, settings): + self.service = None + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + def deactivate(self): + pass + + def toggle(self, level): + self._level = level + + def save_count(self): + # Do nothing + pass + + @property + def count(self): + return self.settings['count'] + + @count.setter + def count(self, v): + pass + + def refresh(self): + pass + + +class VolumeCounter(PinHandler): + product_id = 0xA165 + _product_name = "Generic pulse meter" + dbus_name = "pulsemeter" + type_id = 1 + + def __init__(self, bus, base, path, gpio, settings): + super(VolumeCounter, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/Aggregate', value=self.count*self.rate, + gettextcallback=lambda p, v: (str(v) + ' cubic meter')) + + @property + def rate(self): + return self.settings['rate'] + + def toggle(self, level): + super(VolumeCounter, self).toggle(level) + self.service['/Aggregate'] = self.count * self.rate + +class PinAlarm(PinHandler): + product_id = 0xA166 + _product_name = "Generic digital input" + dbus_name = "digitalinput" + type_id = 0xFF + translation = 0 # low, high + + def __init__(self, bus, base, path, gpio, settings): + super(PinAlarm, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/InputState', value=0) + self.service.add_path('/State', value=self.get_state(0), + gettextcallback=lambda p, v: TRANSLATIONS[v//2][v%2]) + self.service.add_path('/Alarm', value=self.get_alarm_state(0)) + + # Also expose the type + self.service.add_path('/Type', value=self.type_id, + gettextcallback=lambda p, v: INPUTTYPES[v]) + + def toggle(self, level): + super(PinAlarm, self).toggle(level) + self.service['/InputState'] = bool(level)*1 + self.service['/State'] = self.get_state(level) + # Ensure that the alarm flag resets if the /AlarmSetting config option + # disappears. + self.service['/Alarm'] = self.get_alarm_state(level) + + def get_state(self, level): + state = level ^ self.settings['invert'] + return 2 * self.translation + state + + def get_alarm_state(self, level): + return 2 * bool( + (level ^ self.settings['invertalarm']) and self.settings['alarm']) + + +# Various types of things we might want to monitor +class DoorSensor(PinAlarm): + _product_name = "Door alarm" + type_id = 2 + translation = 3 # open, closed + +class BilgePump(PinAlarm): + _product_name = "Bilge pump" + type_id = 3 + translation = 1 # off, on + +class BilgeAlarm(PinAlarm): + _product_name = "Bilge alarm" + type_id = 4 + translation = 4 # ok, alarm + +class BurglarAlarm(PinAlarm): + _product_name = "Burglar alarm" + type_id = 5 + translation = 4 # ok, alarm + +class SmokeAlarm(PinAlarm): + _product_name = "Smoke alarm" + type_id = 6 + translation = 4 # ok, alarm + +class FireAlarm(PinAlarm): + _product_name = "Fire alarm" + type_id = 7 + translation = 4 # ok, alarm + +class CO2Alarm(PinAlarm): + _product_name = "CO2 alarm" + type_id = 8 + translation = 4 # ok, alarm + +class Generator(PinAlarm): + _product_name = "Generator" + type_id = 9 + translation = 5 # running, stopped + + +def dbusconnection(): + return SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else SystemBus() + + +def main(): + parser = ArgumentParser(description=sys.argv[0]) + parser.add_argument('--servicebase', + help='Base service name on dbus, default is com.victronenergy', + default='com.victronenergy') + parser.add_argument('--poll', + help='Use a different kind of polling. Options are epoll, dumb and debug', + default='epoll') + parser.add_argument('inputs', nargs='+', help='Path to digital input') + args = parser.parse_args() + + PulseCounter = { + 'debug': DebugPulseCounter, + 'poll': PollingPulseCounter, + }.get(args.poll, EpollPulseCounter) + + DBusGMainLoop(set_as_default=True) + + # Keep track of enabled services + services = {} + inputs = dict(enumerate(args.inputs, 1)) + pulses = PulseCounter() # callable that iterates over pulses + + def register_gpio(path, gpio, bus, settings): + _type = settings['inputtype'] + print ("Registering GPIO {} for type {}".format(gpio, _type)) + + handler = PinHandler.createHandler(_type, + bus, args.servicebase, path, gpio, settings) + services[gpio] = handler + + # Only monitor if enabled + if _type > 0: + handler.level = pulses.register(path, gpio) + handler.refresh() + + def unregister_gpio(gpio): + print ("unRegistering GPIO {}".format(gpio)) + pulses.unregister(gpio) + services[gpio].deactivate() + + def handle_setting_change(inp, setting, old, new): + if setting == 'inputtype': + if new: + # Get current bus and settings objects, to be reused + service = services[inp] + bus, settings = service.bus, service.settings + + # Input enabled. If already enabled, unregister the old one first. + if pulses.registered(inp): + unregister_gpio(inp) + + # Before registering the new input, reset its settings to defaults + settings['count'] = 0 + settings['invert'] = 0 + settings['invertalarm'] = 0 + settings['alarm'] = 0 + + # Register it + register_gpio(inputs[inp], inp, bus, settings) + elif old: + # Input disabled + unregister_gpio(inp) + elif setting in ('rate', 'invert', 'alarm', 'invertalarm'): + services[inp].refresh() + elif setting == 'name': + services[inp].product_name = new + elif setting == 'count': + # Don't want this triggered on a period save, so only execute + # if it has changed. + v = int(new) + s = services[inp] + if s.count != v: + s.count = v + s.refresh() + + for inp, pth in inputs.items(): + supported_settings = { + 'inputtype': ['/Settings/DigitalInput/{}/Type'.format(inp), 0, 0, len(INPUTTYPES)], + 'rate': ['/Settings/DigitalInput/{}/Multiplier'.format(inp), 0.001, 0, 1.0], + 'count': ['/Settings/DigitalInput/{}/Count'.format(inp), 0, 0, MAXCOUNT, 1], + 'invert': ['/Settings/DigitalInput/{}/InvertTranslation'.format(inp), 0, 0, 1], + 'invertalarm': ['/Settings/DigitalInput/{}/InvertAlarm'.format(inp), 0, 0, 1], + 'alarm': ['/Settings/DigitalInput/{}/AlarmSetting'.format(inp), 0, 0, 1], + 'name': ['/Settings/DigitalInput/{}/CustomName'.format(inp), '', '', ''], + } + bus = dbusconnection() + sd = SettingsDevice(bus, supported_settings, partial(handle_setting_change, inp), timeout=10) + register_gpio(pth, inp, bus, sd) + + def poll(mainloop): + from time import time + idx = 0 + + try: + for inp, level in pulses(): + # epoll object only resyncs once a second. We may receive + # a pulse for something that's been deregistered. + try: + services[inp].toggle(level) + except KeyError: + continue + except: + traceback.print_exc() + mainloop.quit() + + # Need to run the gpio polling in separate thread. Pass in the mainloop so + # the thread can kill us if there is an exception. + mainloop = GLib.MainLoop() + + poller = Thread(target=lambda: poll(mainloop)) + poller.daemon = True + poller.start() + + # Periodically save the counter + def save_counters(): + for inp in inputs: + services[inp].save_count() + return True + GLib.timeout_add(SAVEINTERVAL, save_counters) + + # Save counter on shutdown + signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) + + try: + mainloop.run() + except KeyboardInterrupt: + pass + finally: + save_counters() + +if __name__ == "__main__": + main() diff --git a/FileSets/v2.89/styles.css b/FileSets/v2.89/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.89/styles.css +++ b/FileSets/v2.89/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.90/MbEditBox.qml b/FileSets/v2.90/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.90/MbEditBox.qml +++ b/FileSets/v2.90/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.90/MbEditBoxDateTime.qml b/FileSets/v2.90/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.90/MbEditBoxDateTime.qml +++ b/FileSets/v2.90/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.90/MbItemDigitalInput.qml b/FileSets/v2.90/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.90/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.90/MbSpinBox.qml b/FileSets/v2.90/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v2.90/MbSpinBox.qml +++ b/FileSets/v2.90/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v2.90/MbSubMenu.qml b/FileSets/v2.90/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.90/MbSubMenu.qml +++ b/FileSets/v2.90/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.90/Multi.qml b/FileSets/v2.90/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.90/Multi.qml +++ b/FileSets/v2.90/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.90/OverviewBox.qml b/FileSets/v2.90/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.90/OverviewBox.qml +++ b/FileSets/v2.90/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.90/OverviewConnection.qml b/FileSets/v2.90/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.90/OverviewConnection.qml +++ b/FileSets/v2.90/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.90/OverviewConnectionEnd.qml b/FileSets/v2.90/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.90/OverviewConnectionEnd.qml +++ b/FileSets/v2.90/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.90/OverviewSolarCharger.qml b/FileSets/v2.90/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.90/OverviewSolarCharger.qml +++ b/FileSets/v2.90/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.90/OverviewTankDelegate.qml b/FileSets/v2.90/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.90/OverviewTankDelegate.qml +++ b/FileSets/v2.90/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.90/OverviewTanks.qml b/FileSets/v2.90/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.90/OverviewTanks.qml +++ b/FileSets/v2.90/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.90/PageDigitalInput.qml b/FileSets/v2.90/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.90/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.90/TileText.qml b/FileSets/v2.90/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.90/TileText.qml +++ b/FileSets/v2.90/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.90/attributes.csv b/FileSets/v2.90/attributes.csv new file mode 120000 index 00000000..4c220b6a --- /dev/null +++ b/FileSets/v2.90/attributes.csv @@ -0,0 +1 @@ +../v2.94/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.90/dbus_digitalinputs.py b/FileSets/v2.90/dbus_digitalinputs.py new file mode 120000 index 00000000..1cc0e582 --- /dev/null +++ b/FileSets/v2.90/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.94/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.90/styles.css b/FileSets/v2.90/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.90/styles.css +++ b/FileSets/v2.90/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.91/MbEditBox.qml b/FileSets/v2.91/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.91/MbEditBox.qml +++ b/FileSets/v2.91/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.91/MbEditBoxDateTime.qml b/FileSets/v2.91/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.91/MbEditBoxDateTime.qml +++ b/FileSets/v2.91/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.91/MbItemDigitalInput.qml b/FileSets/v2.91/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.91/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.91/MbSpinBox.qml b/FileSets/v2.91/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v2.91/MbSpinBox.qml +++ b/FileSets/v2.91/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v2.91/MbSubMenu.qml b/FileSets/v2.91/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.91/MbSubMenu.qml +++ b/FileSets/v2.91/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.91/Multi.qml b/FileSets/v2.91/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.91/Multi.qml +++ b/FileSets/v2.91/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.91/OverviewBox.qml b/FileSets/v2.91/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.91/OverviewBox.qml +++ b/FileSets/v2.91/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.91/OverviewConnection.qml b/FileSets/v2.91/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.91/OverviewConnection.qml +++ b/FileSets/v2.91/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.91/OverviewConnectionEnd.qml b/FileSets/v2.91/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.91/OverviewConnectionEnd.qml +++ b/FileSets/v2.91/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.91/OverviewSolarCharger.qml b/FileSets/v2.91/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.91/OverviewSolarCharger.qml +++ b/FileSets/v2.91/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.91/OverviewTankDelegate.qml b/FileSets/v2.91/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.91/OverviewTankDelegate.qml +++ b/FileSets/v2.91/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.91/OverviewTanks.qml b/FileSets/v2.91/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.91/OverviewTanks.qml +++ b/FileSets/v2.91/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.91/PageDigitalInput.qml b/FileSets/v2.91/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.91/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.91/TileText.qml b/FileSets/v2.91/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.91/TileText.qml +++ b/FileSets/v2.91/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.91/attributes.csv b/FileSets/v2.91/attributes.csv new file mode 120000 index 00000000..4c220b6a --- /dev/null +++ b/FileSets/v2.91/attributes.csv @@ -0,0 +1 @@ +../v2.94/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.91/dbus_digitalinputs.py b/FileSets/v2.91/dbus_digitalinputs.py new file mode 120000 index 00000000..1cc0e582 --- /dev/null +++ b/FileSets/v2.91/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.94/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.91/styles.css b/FileSets/v2.91/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.91/styles.css +++ b/FileSets/v2.91/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.92/MbEditBox.qml b/FileSets/v2.92/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.92/MbEditBox.qml +++ b/FileSets/v2.92/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.92/MbEditBoxDateTime.qml b/FileSets/v2.92/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.92/MbEditBoxDateTime.qml +++ b/FileSets/v2.92/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.92/MbItemDigitalInput.qml b/FileSets/v2.92/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.92/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.92/MbSpinBox.qml b/FileSets/v2.92/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v2.92/MbSpinBox.qml +++ b/FileSets/v2.92/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v2.92/MbSubMenu.qml b/FileSets/v2.92/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.92/MbSubMenu.qml +++ b/FileSets/v2.92/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.92/Multi.qml b/FileSets/v2.92/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.92/Multi.qml +++ b/FileSets/v2.92/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.92/OverviewBox.qml b/FileSets/v2.92/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.92/OverviewBox.qml +++ b/FileSets/v2.92/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.92/OverviewConnection.qml b/FileSets/v2.92/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.92/OverviewConnection.qml +++ b/FileSets/v2.92/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.92/OverviewConnectionEnd.qml b/FileSets/v2.92/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.92/OverviewConnectionEnd.qml +++ b/FileSets/v2.92/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.92/OverviewSolarCharger.qml b/FileSets/v2.92/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.92/OverviewSolarCharger.qml +++ b/FileSets/v2.92/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.92/OverviewTankDelegate.qml b/FileSets/v2.92/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.92/OverviewTankDelegate.qml +++ b/FileSets/v2.92/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.92/OverviewTanks.qml b/FileSets/v2.92/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.92/OverviewTanks.qml +++ b/FileSets/v2.92/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.92/PageDigitalInput.qml b/FileSets/v2.92/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.92/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.92/TileText.qml b/FileSets/v2.92/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.92/TileText.qml +++ b/FileSets/v2.92/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.92/attributes.csv b/FileSets/v2.92/attributes.csv new file mode 120000 index 00000000..4c220b6a --- /dev/null +++ b/FileSets/v2.92/attributes.csv @@ -0,0 +1 @@ +../v2.94/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.92/dbus_digitalinputs.py b/FileSets/v2.92/dbus_digitalinputs.py new file mode 120000 index 00000000..1cc0e582 --- /dev/null +++ b/FileSets/v2.92/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.94/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.92/styles.css b/FileSets/v2.92/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.92/styles.css +++ b/FileSets/v2.92/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.93/MbEditBox.qml b/FileSets/v2.93/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.93/MbEditBox.qml +++ b/FileSets/v2.93/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.93/MbEditBoxDateTime.qml b/FileSets/v2.93/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.93/MbEditBoxDateTime.qml +++ b/FileSets/v2.93/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.93/MbItemDigitalInput.qml b/FileSets/v2.93/MbItemDigitalInput.qml new file mode 120000 index 00000000..63943a08 --- /dev/null +++ b/FileSets/v2.93/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.93/MbSpinBox.qml b/FileSets/v2.93/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v2.93/MbSpinBox.qml +++ b/FileSets/v2.93/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v2.93/MbSubMenu.qml b/FileSets/v2.93/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.93/MbSubMenu.qml +++ b/FileSets/v2.93/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.93/Multi.qml b/FileSets/v2.93/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.93/Multi.qml +++ b/FileSets/v2.93/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.93/OverviewBox.qml b/FileSets/v2.93/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.93/OverviewBox.qml +++ b/FileSets/v2.93/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.93/OverviewConnection.qml b/FileSets/v2.93/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.93/OverviewConnection.qml +++ b/FileSets/v2.93/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.93/OverviewConnectionEnd.qml b/FileSets/v2.93/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.93/OverviewConnectionEnd.qml +++ b/FileSets/v2.93/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.93/OverviewSolarCharger.qml b/FileSets/v2.93/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.93/OverviewSolarCharger.qml +++ b/FileSets/v2.93/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.93/OverviewTankDelegate.qml b/FileSets/v2.93/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.93/OverviewTankDelegate.qml +++ b/FileSets/v2.93/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.93/OverviewTanks.qml b/FileSets/v2.93/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.93/OverviewTanks.qml +++ b/FileSets/v2.93/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.93/PageDigitalInput.qml b/FileSets/v2.93/PageDigitalInput.qml new file mode 120000 index 00000000..839f7874 --- /dev/null +++ b/FileSets/v2.93/PageDigitalInput.qml @@ -0,0 +1 @@ +../v2.94/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v2.93/TileText.qml b/FileSets/v2.93/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.93/TileText.qml +++ b/FileSets/v2.93/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.93/attributes.csv b/FileSets/v2.93/attributes.csv new file mode 120000 index 00000000..4c220b6a --- /dev/null +++ b/FileSets/v2.93/attributes.csv @@ -0,0 +1 @@ +../v2.94/attributes.csv \ No newline at end of file diff --git a/FileSets/v2.93/dbus_digitalinputs.py b/FileSets/v2.93/dbus_digitalinputs.py new file mode 120000 index 00000000..1cc0e582 --- /dev/null +++ b/FileSets/v2.93/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v2.94/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v2.93/styles.css b/FileSets/v2.93/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.93/styles.css +++ b/FileSets/v2.93/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v2.94/MbEditBox.qml b/FileSets/v2.94/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v2.94/MbEditBox.qml +++ b/FileSets/v2.94/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v2.94/MbEditBoxDateTime.qml b/FileSets/v2.94/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v2.94/MbEditBoxDateTime.qml +++ b/FileSets/v2.94/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v2.94/MbItemDigitalInput.qml b/FileSets/v2.94/MbItemDigitalInput.qml new file mode 100644 index 00000000..a646c99c --- /dev/null +++ b/FileSets/v2.94/MbItemDigitalInput.qml @@ -0,0 +1,29 @@ +//// modified for ExtTransferSwitch package + +import QtQuick 1.1 + +MbItemOptions { + show: valid + signal disabled + property variant previousValue: undefined + possibleValues: [ + MbOption { description: qsTr("Disabled"); value: 0 }, + MbOption { description: qsTr("Pulse meter"); value: 1 }, + MbOption { description: qsTr("Door alarm"); value: 2 }, + MbOption { description: qsTr("Bilge pump"); value: 3 }, + MbOption { description: qsTr("Bilge alarm"); value: 4 }, + MbOption { description: qsTr("Burglar alarm"); value: 5 }, + MbOption { description: qsTr("Smoke alarm"); value: 6 }, + MbOption { description: qsTr("Fire alarm"); value: 7 }, + MbOption { description: qsTr("CO2 alarm"); value: 8 }, + MbOption { description: qsTr("Generator"); value: 9 }, +//// added for ExtTransferSwitch package + MbOption { description: qsTr("External transfer switch"); value: 11 } + ] + onValueChanged: { + if (valid) { + if (previousValue != undefined && value == 0) disabled() + previousValue = value + } + } +} diff --git a/FileSets/v2.94/MbItemDigitalInput.qml.orig b/FileSets/v2.94/MbItemDigitalInput.qml.orig new file mode 100644 index 00000000..2054a222 --- /dev/null +++ b/FileSets/v2.94/MbItemDigitalInput.qml.orig @@ -0,0 +1,25 @@ +import QtQuick 1.1 + +MbItemOptions { + show: valid + signal disabled + property variant previousValue: undefined + possibleValues: [ + MbOption { description: qsTr("Disabled"); value: 0 }, + MbOption { description: qsTr("Pulse meter"); value: 1 }, + MbOption { description: qsTr("Door alarm"); value: 2 }, + MbOption { description: qsTr("Bilge pump"); value: 3 }, + MbOption { description: qsTr("Bilge alarm"); value: 4 }, + MbOption { description: qsTr("Burglar alarm"); value: 5 }, + MbOption { description: qsTr("Smoke alarm"); value: 6 }, + MbOption { description: qsTr("Fire alarm"); value: 7 }, + MbOption { description: qsTr("CO2 alarm"); value: 8 }, + MbOption { description: qsTr("Generator"); value: 9 } + ] + onValueChanged: { + if (valid) { + if (previousValue != undefined && value == 0) disabled() + previousValue = value + } + } +} diff --git a/FileSets/v2.94/MbSpinBox.qml b/FileSets/v2.94/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v2.94/MbSpinBox.qml +++ b/FileSets/v2.94/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v2.94/MbSubMenu.qml b/FileSets/v2.94/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v2.94/MbSubMenu.qml +++ b/FileSets/v2.94/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v2.94/Multi.qml b/FileSets/v2.94/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v2.94/Multi.qml +++ b/FileSets/v2.94/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v2.94/OverviewBox.qml b/FileSets/v2.94/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v2.94/OverviewBox.qml +++ b/FileSets/v2.94/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v2.94/OverviewConnection.qml b/FileSets/v2.94/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v2.94/OverviewConnection.qml +++ b/FileSets/v2.94/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v2.94/OverviewConnectionEnd.qml b/FileSets/v2.94/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v2.94/OverviewConnectionEnd.qml +++ b/FileSets/v2.94/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v2.94/OverviewSolarCharger.qml b/FileSets/v2.94/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v2.94/OverviewSolarCharger.qml +++ b/FileSets/v2.94/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v2.94/OverviewTankDelegate.qml b/FileSets/v2.94/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v2.94/OverviewTankDelegate.qml +++ b/FileSets/v2.94/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v2.94/OverviewTanks.qml b/FileSets/v2.94/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v2.94/OverviewTanks.qml +++ b/FileSets/v2.94/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v2.94/PageDigitalInput.qml b/FileSets/v2.94/PageDigitalInput.qml new file mode 100644 index 00000000..8a1008ec --- /dev/null +++ b/FileSets/v2.94/PageDigitalInput.qml @@ -0,0 +1,152 @@ +//// modified for ExtTransferSwitch package + +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: root + + property variant service + property string bindPrefix + property string settingsBindPreffix: "com.victronenergy.settings/Settings/DigitalInput/" + inputNumber + property int inputNumber: instance.valid ? instance.value : 0 + + title: getType(service.description) + summary: getState(state.item.value) + + VBusItem { + id: instance + bind: service.path("/DeviceInstance") + } + + VBusItem { + id: unit + bind: Utils.path(settingsBindPreffix, "/Unit") + } + +//// added for ExtTransferSwitch package + VBusItem + { + id: ac2connectedItem + bind: Utils.path ("com.victronenergy.system", "/Ac/In/1/Connected") + } + property bool showTransferSwitchConnection: ac2connectedItem.valid + VBusItem + { + id: typeItem + bind: service.path("/Type") + } + property bool isTransferSwitch: typeItem.valid && typeItem.value == 12 + + // Handle translations + function getType(type){ + switch (type) { + case "Disabled": + return qsTr("Disabled") + case "Pulse meter": + return qsTr("Pulse meter") + case "Door alarm": + return qsTr("Door alarm") + case "Bilge pump": + return qsTr("Bilge pump") + case "Bilge alarm": + return qsTr("Bilge alarm") + case "Disabled": + return qsTr("Burglar alarm") + case "Smoke alarm": + return qsTr("Smoke alarm") + case "Fire alarm": + return qsTr("Fire alarm") + case "CO2 alarm": + return qsTr("CO2 alarm") + case "Generator": + return qsTr("Generator") +//// added for ExtTransferSwitch package + case "TransferSwitch": + return qsTr("External transfer switch") + } + return type; + } + + function getState(st) + { + switch (st) { + case 0: + return qsTr("Low") + case 1: + return qsTr("High") + case 2: + return qsTr("Off") + case 3: + return qsTr("On") + case 4: + return qsTr("No") + case 5: + return qsTr("Yes") + case 6: + return qsTr("Open") + case 7: + return qsTr("Closed") + case 8: + return qsTr("Ok") + case 9: + return qsTr("Alarm") + case 10: + return qsTr("Running") + case 11: + return qsTr("Stopped") +//// added for ExtTransferSwitch package + case 12: + return qsTr("On generator") + case 13: + return qsTr("On grid") + } + + return qsTr("Unknown") + } + + model: VisualItemModel { + MbItemValue { + id: state + description: qsTr("State") + item.bind: service.path("/State") + item.text: getState(item.value) + } + + MbSubMenu { + id: setupMenu + description: qsTr("Setup") + subpage: Component { + PageDigitalInputSetup { + bindPrefix: root.settingsBindPreffix + } + } + } + + MbSubMenu { + id: deviceMenu + description: qsTr("Device") + subpage: Component { + PageDeviceInfo { + title: deviceMenu.description + bindPrefix: root.bindPrefix + } + } + } + +//// added for ExtTransferSwitch package + MbItemOptions + { + id: extTransferSwitch + description: qsTr("External transfer switch connection") + bind: Utils.path ("com.victronenergy.settings/Settings", "/TransferSwitch/TransferSwitchOnAc2") + possibleValues: + [ + MbOption {description: qsTr("AC 1 in"); value: 0}, + MbOption {description: qsTr("AC 2 in"); value: 1} + ] + visible: root.isTransferSwitch && root.showTransferSwitchConnection + } + } +} diff --git a/FileSets/v2.94/PageDigitalInput.qml.orig b/FileSets/v2.94/PageDigitalInput.qml.orig new file mode 100644 index 00000000..69f495fa --- /dev/null +++ b/FileSets/v2.94/PageDigitalInput.qml.orig @@ -0,0 +1,114 @@ +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: root + + property variant service + property string bindPrefix + property string settingsBindPreffix: "com.victronenergy.settings/Settings/DigitalInput/" + inputNumber + property int inputNumber: instance.valid ? instance.value : 0 + + title: getType(service.description) + summary: getState(state.item.value) + + VBusItem { + id: instance + bind: service.path("/DeviceInstance") + } + + VBusItem { + id: unit + bind: Utils.path(settingsBindPreffix, "/Unit") + } + + // Handle translations + function getType(type){ + switch (type) { + case "Disabled": + return qsTr("Disabled") + case "Pulse meter": + return qsTr("Pulse meter") + case "Door alarm": + return qsTr("Door alarm") + case "Bilge pump": + return qsTr("Bilge pump") + case "Bilge alarm": + return qsTr("Bilge alarm") + case "Disabled": + return qsTr("Burglar alarm") + case "Smoke alarm": + return qsTr("Smoke alarm") + case "Fire alarm": + return qsTr("Fire alarm") + case "CO2 alarm": + return qsTr("CO2 alarm") + case "Generator": + return qsTr("Generator") + } + return type; + } + + function getState(st) + { + switch (st) { + case 0: + return qsTr("Low") + case 1: + return qsTr("High") + case 2: + return qsTr("Off") + case 3: + return qsTr("On") + case 4: + return qsTr("No") + case 5: + return qsTr("Yes") + case 6: + return qsTr("Open") + case 7: + return qsTr("Closed") + case 8: + return qsTr("Ok") + case 9: + return qsTr("Alarm") + case 10: + return qsTr("Running") + case 11: + return qsTr("Stopped") + } + + return qsTr("Unknown") + } + + model: VisualItemModel { + MbItemValue { + id: state + description: qsTr("State") + item.bind: service.path("/State") + item.text: getState(item.value) + } + + MbSubMenu { + id: setupMenu + description: qsTr("Setup") + subpage: Component { + PageDigitalInputSetup { + bindPrefix: root.settingsBindPreffix + } + } + } + + MbSubMenu { + id: deviceMenu + description: qsTr("Device") + subpage: Component { + PageDeviceInfo { + title: deviceMenu.description + bindPrefix: root.bindPrefix + } + } + } + } +} diff --git a/FileSets/v2.94/TileText.qml b/FileSets/v2.94/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v2.94/TileText.qml +++ b/FileSets/v2.94/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v2.94/attributes.csv b/FileSets/v2.94/attributes.csv new file mode 100644 index 00000000..6b6ea53e --- /dev/null +++ b/FileSets/v2.94/attributes.csv @@ -0,0 +1,626 @@ +com.victronenergy.gps,/Position/Latitude,d,Decimal degrees,2800,int32,10000000,R +com.victronenergy.gps,/Position/Longitude,d,Decimal degrees,2802,int32,10000000,R +com.victronenergy.gps,/Course,d,Degrees,2804,uint16,100,R +com.victronenergy.gps,/Speed,d,m/s,2805,uint16,100,R +com.victronenergy.gps,/Fix,y,,2806,uint16,1,R +com.victronenergy.gps,/NrOfSatellites,y,,2807,uint16,1,R +com.victronenergy.gps,/Altitude,d,m,2808,int32,10,R +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/State,i,0=BL disabled;1=Restarting;2=Self-consumption;3=Self-consumption;4=Self-consumption;5=Discharge disabled;6=Force charge;7=Sustain;9=Keep batteries charged;10=BL Disabled;11=BL Disabled (Low SoC),2900,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/MinimumSocLimit,d,%,2901,uint16,10,W +com.victronenergy.settings,/Settings/CGwacs/Hub4Mode,i,1=ESS with Phase Compensation;2=ESS without phase compensation;3=Disabled/External Control,2902,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/SocLimit,d,%,2903,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/V,d,V AC,3,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/V,d,V AC,4,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/V,d,V AC,5,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/I,d,A AC,6,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/I,d,A AC,7,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/I,d,A AC,8,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/F,d,Hz,9,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/F,d,Hz,10,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/F,d,Hz,11,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/P,i,VA or Watts,12,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/P,i,VA or Watts,13,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/P,i,VA or Watts,14,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L1/V,d,V AC,15,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L2/V,d,V AC,16,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L3/V,d,V AC,17,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L1/I,d,A AC,18,int16,10,R +com.victronenergy.vebus,/Ac/Out/L2/I,d,A AC,19,int16,10,R +com.victronenergy.vebus,/Ac/Out/L3/I,d,A AC,20,int16,10,R +com.victronenergy.vebus,/Ac/Out/L1/F,d,Hz,21,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/CurrentLimit,d,A,22,int16,10,W +com.victronenergy.vebus,/Ac/Out/L1/P,i,VA or Watts,23,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L2/P,i,VA or Watts,24,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L3/P,i,VA or Watts,25,int16,0.1,R +com.victronenergy.vebus,/Dc/0/Voltage,d,V DC,26,uint16,100,R +com.victronenergy.vebus,/Dc/0/Current,d,A DC,27,int16,10,R +com.victronenergy.vebus,/Ac/NumberOfPhases,u,count,28,uint16,1,R +com.victronenergy.vebus,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,29,uint16,1,R +com.victronenergy.vebus,/Soc,d,%,30,uint16,10,W +com.victronenergy.vebus,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=Bulk protection,31,uint16,1,R +com.victronenergy.vebus,/VebusError,u,0=No error;1=VE.Bus Error 1: Device is switched off because one of the other phases in the system has switched off;2=VE.Bus Error 2: New and old types MK2 are mixed in the system;3=VE.Bus Error 3: Not all- or more than- the expected devices were found in the system;4=VE.Bus Error 4: No other device whatsoever detected;5=VE.Bus Error 5: Overvoltage on AC-out;6=VE.Bus Error 6: Error in DDC Program;7=VE.Bus BMS connected- which requires an Assistant- but no assistant found;10=VE.Bus Error 10: System time synchronisation problem occurred;14=VE.Bus Error 14: Device cannot transmit data;16=VE.Bus Error 16: Dongle missing;17=VE.Bus Error 17: One of the devices assumed master status because the original master failed;18=VE.Bus Error 18: AC Overvoltage on the output of a slave has occurred while already switched off;22=VE.Bus Error 22: This device cannot function as slave;24=VE.Bus Error 24: Switch-over system protection initiated;25=VE.Bus Error 25: Firmware incompatibility. The firmware of one of the connected device is not sufficiently up to date to operate in conjunction with this device;26=VE.Bus Error 26: Internal error,32,uint16,1,R +com.victronenergy.vebus,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,33,uint16,1,W +com.victronenergy.vebus,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,34,uint16,1,R +com.victronenergy.vebus,/Alarms/LowBattery,u,0=Ok;1=Warning;2=Alarm,35,uint16,1,R +com.victronenergy.vebus,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,36,uint16,1,R +com.victronenergy.vebus,/Alarms/TemperatureSensor,u,0=Ok;1=Warning;2=Alarm,42,uint16,1,R +com.victronenergy.vebus,/Alarms/VoltageSensor,u,0=Ok;1=Warning;2=Alarm,43,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/HighTemperature,u,0=Ok;1=Warning;2=Alarm,44,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/LowBattery,u,0=Ok;1=Warning;2=Alarm,45,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Overload,u,0=Ok;1=Warning;2=Alarm,46,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Ripple,u,0=Ok;1=Warning;2=Alarm,47,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/HighTemperature,u,0=Ok;1=Warning;2=Alarm,48,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/LowBattery,u,0=Ok;1=Warning;2=Alarm,49,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Overload,u,0=Ok;1=Warning;2=Alarm,50,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Ripple,u,0=Ok;1=Warning;2=Alarm,51,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/HighTemperature,u,0=Ok;1=Warning;2=Alarm,52,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/LowBattery,u,0=Ok;1=Warning;2=Alarm,53,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Overload,u,0=Ok;1=Warning;2=Alarm,54,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Ripple,u,0=Ok;1=Warning;2=Alarm,55,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,37,int16,1,W +com.victronenergy.vebus,/Hub4/DisableCharge,u,0=Charge allowed;1=Charge disabled,38,uint16,1,W +com.victronenergy.vebus,/Hub4/DisableFeedIn,u,0=Feed in allowed;1=Feed in disabled,39,uint16,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,40,int16,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,41,int16,1,W +com.victronenergy.vebus,/PvInverter/Disable,u,0=PV enabled;1=PV disabled,56,uint16,1,W +com.victronenergy.vebus,/Bms/AllowToCharge,u,0=No;1=Yes,57,uint16,1,R +com.victronenergy.vebus,/Bms/AllowToDischarge,u,0=No;1=Yes,58,uint16,1,R +com.victronenergy.vebus,/Bms/BmsExpected,u,0=No;1=Yes,59,uint16,1,R +com.victronenergy.vebus,/Bms/Error,u,0=No;1=Yes,60,uint16,1,R +com.victronenergy.vebus,/Dc/0/Temperature,d,Degrees celsius,61,int16,10,R +com.victronenergy.vebus,/SystemReset,y,0=No action;1=VE.Bus Reset,62,uint16,1,W +com.victronenergy.vebus,/Alarms/PhaseRotation,u,0=Ok;1=Warning,63,uint16,1,R +com.victronenergy.vebus,/Alarms/GridLost,i,0=No alarm;2=Alarm,64,uint16,1,R +com.victronenergy.vebus,/Hub4/DoNotFeedInOvervoltage,i,0=Feed in overvoltage;1=Don't feed in overvoltage,65,uint16,1,W +com.victronenergy.vebus,/Hub4/L1/MaxFeedInPower,d,W,66,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L2/MaxFeedInPower,d,W,67,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L3/MaxFeedInPower,d,W,68,uint16,0.01,W +com.victronenergy.vebus,/Ac/State/IgnoreAcIn1,i,0=AC input not ignored; 1=AC input ignored,69,uint16,1,R +com.victronenergy.vebus,/Ac/State/IgnoreAcIn2,i,0=AC input not ignored; 1=AC input ignored,70,uint16,1,R +com.victronenergy.vebus,/Hub4/TargetPowerIsMaxFeedIn,i,0=AcPowerSetpoint interpreted normally; 1=AcPowerSetpoint as OvervoltageFeedIn limit,71,uint16,,W +com.victronenergy.vebus,/Hub4/FixSolarOffsetTo100mV,i,0=OvervoltageFeedIn uses 1V offset; 1=OvervoltageFeedIn uses 0.1V offset,72,uint16,,W +com.victronenergy.vebus,/Hub4/Sustain,i,0=Sustain inactive; 1=Sustain active,73,uint16,1,R +com.victronenergy.vebus,/Energy/AcIn1ToAcOut,d,kWh,74,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn1ToInverter,d,kWh,76,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToAcOut,d,kWh,78,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToInverter,d,kWh,80,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn1,d,kWh,82,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn2,d,kWh,84,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn1,d,kWh,86,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn2,d,kWh,88,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcOut,d,kWh,90,uint32,100,R +com.victronenergy.vebus,/Energy/OutToInverter,d,kWh,92,uint32,100,R +com.victronenergy.battery,/Dc/0/Voltage,d,V DC,259,uint16,100,R +com.victronenergy.battery,/Dc/1/Voltage,d,V DC,260,uint16,100,R +com.victronenergy.battery,/Dc/0/Current,d,A DC,261,int16,10,R +com.victronenergy.battery,/Dc/0/Temperature,d,Degrees celsius,262,int16,10,R +com.victronenergy.battery,/Dc/0/MidVoltage,d,V DC,263,uint16,100,R +com.victronenergy.battery,/Dc/0/MidVoltageDeviation,d,%,264,uint16,100,R +com.victronenergy.battery,/ConsumedAmphours,d,Ah,265,uint16,-10,R +com.victronenergy.battery,/Soc,y,%,266,uint16,10,R +com.victronenergy.battery,/Soh,y,%,304,uint16,10,R +com.victronenergy.battery,/TimeToGo,q,seconds,303,uint16,0.01,R +com.victronenergy.battery,/Info/MaxChargeVoltage,u,V DC,305,uint16,10,R +com.victronenergy.battery,/Info/BatteryLowVoltage,u,V DC,306,uint16,10,R +com.victronenergy.battery,/Info/MaxChargeCurrent,u,A DC,307,uint16,10,R +com.victronenergy.battery,/Info/MaxDischargeCurrent,u,A DC,308,uint16,10,R +com.victronenergy.battery,/Alarms/Alarm,y,0=No alarm;2=Alarm,267,uint16,1,R +com.victronenergy.battery,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,268,uint16,1,R +com.victronenergy.battery,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,269,uint16,1,R +com.victronenergy.battery,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,270,uint16,1,R +com.victronenergy.battery,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,271,uint16,1,R +com.victronenergy.battery,/Alarms/LowSoc,u,0=No alarm;2=Alarm,272,uint16,1,R +com.victronenergy.battery,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,273,uint16,1,R +com.victronenergy.battery,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,274,uint16,1,R +com.victronenergy.battery,/Alarms/MidVoltage,u,0=No alarm;2=Alarm,275,uint16,1,R +com.victronenergy.battery,/Alarms/LowFusedVoltage,u,0=No alarm;2=Alarm,276,uint16,1,R +com.victronenergy.battery,/Alarms/HighFusedVoltage,u,0=No alarm;2=Alarm,277,uint16,1,R +com.victronenergy.battery,/Alarms/FuseBlown,u,0=No alarm;2=Alarm,278,uint16,1,R +com.victronenergy.battery,/Alarms/HighInternalTemperature,u,0=No alarm;2=Alarm,279,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeCurrent,u,0=No alarm;2=Alarm,320,uint16,1,R +com.victronenergy.battery,/Alarms/HighDischargeCurrent,u,0=No alarm;2=Alarm,321,uint16,1,R +com.victronenergy.battery,/Alarms/CellImbalance,u,0=No alarm;2=Alarm,322,uint16,1,R +com.victronenergy.battery,/Alarms/InternalFailure,u,0=No alarm;2=Alarm,323,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeTemperature,u,0=No alarm;2=Alarm,324,uint16,1,R +com.victronenergy.battery,/Alarms/LowChargeTemperature,u,0=No alarm;2=Alarm,325,uint16,1,R +com.victronenergy.battery,/Alarms/LowCellVoltage,u,0=No alarm;1=Almost discharged;2=Alarm,326,uint16,1,R +com.victronenergy.battery,/Relay/0/State,y,0=Open;1=Closed,280,uint16,1,W +com.victronenergy.battery,/History/DeepestDischarge,d,Ah,281,uint16,-10,R +com.victronenergy.battery,/History/LastDischarge,d,Ah,282,uint16,-10,R +com.victronenergy.battery,/History/AverageDischarge,d,Ah,283,uint16,-10,R +com.victronenergy.battery,/History/ChargeCycles,i,count,284,uint16,1,R +com.victronenergy.battery,/History/FullDischarges,i,count,285,uint16,1,R +com.victronenergy.battery,/History/TotalAhDrawn,d,Ah,286,uint16,-10,R +com.victronenergy.battery,/History/MinimumVoltage,d,V DC,287,uint16,100,R +com.victronenergy.battery,/History/MaximumVoltage,d,V DC,288,uint16,100,R +com.victronenergy.battery,/History/TimeSinceLastFullCharge,i,seconds,289,uint16,0.01,R +com.victronenergy.battery,/History/AutomaticSyncs,i,count,290,uint16,1,R +com.victronenergy.battery,/History/LowVoltageAlarms,i,count,291,uint16,1,R +com.victronenergy.battery,/History/HighVoltageAlarms,i,count,292,uint16,1,R +com.victronenergy.battery,/History/LowStarterVoltageAlarms,i,count,293,uint16,1,R +com.victronenergy.battery,/History/HighStarterVoltageAlarms,i,count,294,uint16,1,R +com.victronenergy.battery,/History/MinimumStarterVoltage,d,V DC,295,uint16,100,R +com.victronenergy.battery,/History/MaximumStarterVoltage,d,V DC,296,uint16,100,R +com.victronenergy.battery,/History/LowFusedVoltageAlarms,i,count,297,uint16,1,R +com.victronenergy.battery,/History/HighFusedVoltageAlarms,i,count,298,uint16,1,R +com.victronenergy.battery,/History/MinimumFusedVoltage,d,V DC,299,uint16,100,R +com.victronenergy.battery,/History/MaximumFusedVoltage,d,V DC,300,uint16,100,R +com.victronenergy.battery,/History/DischargedEnergy,d,kWh,301,uint16,10,R +com.victronenergy.battery,/History/ChargedEnergy,d,kWh,302,uint16,10,R +com.victronenergy.battery,/Capacity,d,Ah,309,uint16,10,R +com.victronenergy.battery,/State,y,0=Initializing (Wait start);1=Initializing (before boot);2=Initializing (Before boot delay);3=Initializing (Wait boot);4=Initializing;5=Initializing (Measure battery voltage);6=Initializing (Calculate battery voltage);7=Initializing (Wait bus voltage);8=Initializing (Wait for lynx shunt);9=Running;10=Error (10);11=Error (11),1282,uint16,1,R +com.victronenergy.battery,/ErrorCode,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1283,uint16,1,R +com.victronenergy.battery,/SystemSwitch,y,0=Disabled;1=Enabled,1284,uint16,1,R +com.victronenergy.battery,/Balancing,y,0=Inactive;1=Active,1285,uint16,1,R +com.victronenergy.battery,/System/NrOfBatteries,y,count,1286,uint16,1,R +com.victronenergy.battery,/System/BatteriesParallel,y,count,1287,uint16,1,R +com.victronenergy.battery,/System/BatteriesSeries,y,count,1288,uint16,1,R +com.victronenergy.battery,/System/NrOfCellsPerBattery,y,count,1289,uint16,1,R +com.victronenergy.battery,/System/MinCellVoltage,d,V DC,1290,uint16,100,R +com.victronenergy.battery,/System/MaxCellVoltage,d,V DC,1291,uint16,100,R +com.victronenergy.battery,/Diagnostics/ShutDownsDueError,q,count,1292,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1293,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1294,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1295,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1296,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Time,u,,310,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Time,u,,312,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Time,u,,314,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Time,u,,316,int32,1,R +com.victronenergy.battery,/System/MinCellTemperature,d,Degrees celsius,318,int16,10,R +com.victronenergy.battery,/System/MaxCellTemperature,d,Degrees celsius,319,int16,10,R +com.victronenergy.battery,/Io/AllowToCharge,y,0=No;1=Yes,1297,uint16,1,R +com.victronenergy.battery,/Io/AllowToDischarge,y,0=No;1=Yes,1298,uint16,1,R +com.victronenergy.battery,/Io/ExternalRelay,y,0=Inactive;1=Active,1299,uint16,1,R +com.victronenergy.battery,/History/MinimumCellVoltage,d,V DC,1300,uint16,100,R +com.victronenergy.battery,/History/MaximumCellVoltage,d,V DC,1301,uint16,100,R +com.victronenergy.battery,/System/NrOfModulesOffline,u,,1302,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesOnline,u,,1303,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingCharge,u,,1304,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingDischarge,u,,1305,uint16,1,R +com.victronenergy.battery,/System/MinVoltageCellId,s,,1306,string[4],1,R +com.victronenergy.battery,/System/MaxVoltageCellId,s,,1310,string[4],1,R +com.victronenergy.battery,/System/MinTemperatureCellId,s,,1314,string[4],1,R +com.victronenergy.battery,/System/MaxTemperatureCellId,s,,1318,string[4],1,R +com.victronenergy.solarcharger,/Dc/0/Voltage,d,V DC,771,uint16,100,R +com.victronenergy.solarcharger,/Dc/0/Current,d,A DC,772,int16,10,R +com.victronenergy.solarcharger,/Dc/0/Temperature,d,Degrees celsius,773,int16,10,R +com.victronenergy.solarcharger,/Mode,i,1=On;4=Off,774,uint16,1,W +com.victronenergy.solarcharger,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;11=Other (Hub-1);252=Hub-1,775,uint16,1,R +com.victronenergy.solarcharger,/Pv/V,d,V DC,776,uint16,100,R +com.victronenergy.solarcharger,/Pv/I,d,A DC,777,,10,R,HANDLED IN mappings.c +com.victronenergy.solarcharger,/Yield/Power,d,W,789,uint16,10,R +com.victronenergy.solarcharger,/Equalization/Pending,i,0=No;1=Yes;2=Error;3=Unavailable- Unknown,778,uint16,1,R +com.victronenergy.solarcharger,/Equalization/TimeRemaining,d,seconds,779,uint16,10,R +com.victronenergy.solarcharger,/Relay/0/State,i,0=Open;1=Closed,780,uint16,1,R +com.victronenergy.solarcharger,/Alarms/Alarm,i,0=No alarm;2=Alarm,781,uint16,1,R +com.victronenergy.solarcharger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,782,uint16,1,R +com.victronenergy.solarcharger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,783,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Yield,d,kWh,784,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/MaxPower,d,W,785,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Yield,d,kWh,786,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/MaxPower,d,W,787,uint16,1,R +com.victronenergy.solarcharger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,788,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,790,uint16,10,R +com.victronenergy.solarcharger,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,791,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/V,d,V DC,3700,uint16,100,R +com.victronenergy.solarcharger,/Pv/1/V,d,V DC,3701,uint16,100,R +com.victronenergy.solarcharger,/Pv/2/V,d,V DC,3702,uint16,100,R +com.victronenergy.solarcharger,/Pv/3/V,d,V DC,3703,uint16,100,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/Yield,d,kWh,3708,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/Yield,d,kWh,3709,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/Yield,d,kWh,3710,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/Yield,d,kWh,3711,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/Yield,d,kWh,3712,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/Yield,d,kWh,3713,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/Yield,d,kWh,3714,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/Yield,d,kWh,3715,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/MaxPower,d,W,3716,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/MaxPower,d,W,3717,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/MaxPower,d,W,3718,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/MaxPower,d,W,3719,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/MaxPower,d,W,3720,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/MaxPower,d,W,3721,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/MaxPower,d,W,3722,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/MaxPower,d,W,3723,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/P,d,W,3724,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/P,d,W,3725,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/P,d,W,3726,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/P,d,W,3727,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L1/Power,d,W,808,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L2/Power,d,W,809,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L3/Power,d,W,810,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L1/Power,d,W,811,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L2/Power,d,W,812,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L3/Power,d,W,813,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L1/Power,d,W,814,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L2/Power,d,W,815,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L3/Power,d,W,816,uint16,1,R +com.victronenergy.system,/Dc/Pv/Power,d,W,850,uint16,1,R +com.victronenergy.system,/Dc/Pv/Current,d,A DC,851,int16,10,R +com.victronenergy.system,/Dc/Charger/Power,d,W,855,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L1/Power,d,W,817,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L2/Power,d,W,818,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L3/Power,d,W,819,uint16,1,R +com.victronenergy.system,/Ac/Grid/L1/Power,d,W,820,int16,1,R +com.victronenergy.system,/Ac/Grid/L2/Power,d,W,821,int16,1,R +com.victronenergy.system,/Ac/Grid/L3/Power,d,W,822,int16,1,R +com.victronenergy.system,/Ac/Genset/L1/Power,d,W,823,int16,1,R +com.victronenergy.system,/Ac/Genset/L2/Power,d,W,824,int16,1,R +com.victronenergy.system,/Ac/Genset/L3/Power,d,W,825,int16,1,R +com.victronenergy.system,/Ac/ActiveIn/Source,u,0=Not available;1=Grid;2=Generator;3=Shore power;240=Not connected,826,int16,1,R +com.victronenergy.system,/Dc/System/Power,d,W,860,int16,1,R +com.victronenergy.system,/Dc/Battery/Voltage,d,V DC,840,uint16,10,R +com.victronenergy.system,/Dc/Battery/Current,d,A DC,841,int16,10,R +com.victronenergy.system,/Dc/Battery/Power,d,W,842,int16,1,R +com.victronenergy.system,/Dc/Vebus/Current,d,A DC,865,int16,10,R +com.victronenergy.system,/Dc/Vebus/Power,d,W,866,int16,1,R +com.victronenergy.system,/Dc/Battery/Soc,d,%,843,uint16,1,R +com.victronenergy.system,/Dc/Battery/State,i,0=idle;1=charging;2=discharging,844,uint16,1,R +com.victronenergy.system,/Dc/Battery/ConsumedAmphours,d,Ah,845,uint16,-10,R +com.victronenergy.system,/Dc/Battery/TimeToGo,d,s,846,uint16,0.01,R +com.victronenergy.system,/Relay/0/State,i,0=Open;1=Closed,806,uint16,1,W +com.victronenergy.system,/Relay/1/State,i,0=Open;1=Closed,807,uint16,1,W +com.victronenergy.system,/Serial,s,,800,string[6],1,R +com.victronenergy.pvinverter,/Position,i,0=AC input 1;1=AC output;2=AC input 2,1026,uint16,1,R +com.victronenergy.pvinverter,/Serial,s,,1039,string[7],1,R +com.victronenergy.pvinverter,/Ac/L1/Voltage,d,V AC,1027,uint16,10,R +com.victronenergy.pvinverter,/Ac/L1/Current,d,A AC,1028,int16,10,R +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1029,uint16,1,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1030,uint16,100,R +com.victronenergy.pvinverter,/Ac/L2/Voltage,d,V AC,1031,uint16,10,R +com.victronenergy.pvinverter,/Ac/L2/Current,d,A AC,1032,int16,10,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1033,uint16,1,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1034,uint16,100,R +com.victronenergy.pvinverter,/Ac/L3/Voltage,d,V AC,1035,uint16,10,R +com.victronenergy.pvinverter,/Ac/L3/Current,d,A AC,1036,int16,10,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1037,uint16,1,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1038,uint16,100,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1046,uint32,100,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1048,uint32,100,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1050,uint32,100,R +com.victronenergy.pvinverter,/Ac/Power,i,kW,1052,int32,1,W +com.victronenergy.pvinverter,/Ac/MaxPower,u,kW,1054,uint32,1,W +com.victronenergy.pvinverter,/Ac/PowerLimit,u,kW,1056,uint32,1,W +com.victronenergy.motordrive,/Motor/RPM,d,RPM,2048,int16,1,R +com.victronenergy.motordrive,/Motor/Temperature,d,Degrees celsius,2049,int16,10,R +com.victronenergy.motordrive,/Dc/0/Voltage,d,V DC,2050,uint16,100,R +com.victronenergy.motordrive,/Dc/0/Current,d,A DC,2051,int16,10,R +com.victronenergy.motordrive,/Dc/0/Power,d,W,2052,int16,10,R +com.victronenergy.motordrive,/Controller/Temperature,d,Degrees celsius,2053,int16,10,R +com.victronenergy.charger,/Dc/0/Voltage,d,V DC,2307,uint16,100,R +com.victronenergy.charger,/Dc/0/Current,d,A DC,2308,int16,10,R +com.victronenergy.charger,/Dc/0/Temperature,d,Degrees celsius,2309,int16,10,R +com.victronenergy.charger,/Dc/1/Voltage,d,V DC,2310,uint16,100,R +com.victronenergy.charger,/Dc/1/Current,d,A DC,2311,int16,10,R +com.victronenergy.charger,/Dc/2/Voltage,d,V DC,2312,uint16,100,R +com.victronenergy.charger,/Dc/2/Current,d,A DC,2313,int16,10,R +com.victronenergy.charger,/Ac/In/L1/I,d,A AC,2314,int16,10,R +com.victronenergy.charger,/Ac/In/L1/P,d,W DC,2315,uint16,1,R +com.victronenergy.charger,/Ac/In/CurrentLimit,d,A AC,2316,int16,10,W +com.victronenergy.charger,/Mode,i,0=Off;1=On;2=Error;3=Unavailable- Unknown,2317,uint16,1,W +com.victronenergy.charger,/State,i,0=Off;1=Low Power Mode;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply mode;252=Bulk protection,2318,uint16,1,R +com.victronenergy.charger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,2319,uint16,1,R +com.victronenergy.charger,/Relay/0/State,i,0=Open;1=Closed,2320,uint16,1,R +com.victronenergy.charger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,2321,uint16,1,R +com.victronenergy.charger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,2322,uint16,1,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2600,int16,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2601,int16,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2602,int16,1,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2603,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2604,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2605,uint16,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2606,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2607,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2608,uint16,100,R +com.victronenergy.grid,/Serial,s,,2609,string[7],,R +com.victronenergy.grid,/Ac/L1/Voltage,d,V AC,2616,uint16,10,R +com.victronenergy.grid,/Ac/L1/Current,d,A AC,2617,int16,10,R +com.victronenergy.grid,/Ac/L2/Voltage,d,V AC,2618,uint16,10,R +com.victronenergy.grid,/Ac/L2/Current,d,A AC,2619,int16,10,R +com.victronenergy.grid,/Ac/L3/Voltage,d,V AC,2620,uint16,10,R +com.victronenergy.grid,/Ac/L3/Current,d,A AC,2621,int16,10,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2622,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2624,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2626,uint32,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2628,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2630,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2632,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Forward,d,kWh,2634,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Reverse,d,kWh,2636,uint32,100,R +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2700,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2703,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/MaxChargePercentage,d,%,2701,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePercentage,d,%,2702,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePower,d,W,2704,uint16,0.1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeCurrent,d,A,2705,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxFeedInPower,d,W,2706,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/OvervoltageFeedIn,i,0=Don't feed excess DC-coupled PV into grid;1=Feed excess DC-coupled PV into the grid,2707,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/PreventFeedback,i,0=Feed excess AC-coupled PV into grid;1=Don't feed excess AC-coupled PV into the grid,2708,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeVoltage,d,V,2710,uint16,10,W +com.victronenergy.hub4,/PvPowerLimiterActive,i,0=Feed-in limiting inactive;1=Feed-in limiting active,2709,uint16,1,R +com.victronenergy.tank,/ProductId,u,,3000,uint16,1,R +com.victronenergy.tank,/Capacity,d,m3,3001,uint32,10000,R +com.victronenergy.tank,/FluidType,u,0=Fuel;1=Fresh water;2=Waste water;3=Live well;4=Oil;5=Black water (sewage);6=Gasoline;7=Diesel;8=LPG;9=LNG;10=Hydraulic oil;11=Raw water,3003,uint16,1,R +com.victronenergy.tank,/Level,d,%,3004,uint16,10,R +com.victronenergy.tank,/Remaining,d,m3,3005,uint32,10000,R +com.victronenergy.tank,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3007,uint16,1,R +com.victronenergy.inverter,/ProductId,u,,3127,uint16,1,R +com.victronenergy.inverter,/FirmwareVersion,u,,3125,uint16,1,R +com.victronenergy.inverter,/Ac/Out/L1/I,d,A AC,3100,int16,10,R +com.victronenergy.inverter,/Ac/Out/L1/V,d,V AC,3101,uint16,10,R +com.victronenergy.inverter,/Ac/Out/L1/P,d,W AC,3102,int16,0.1,R +com.victronenergy.inverter,/Alarms/HighTemperature,u,0=No alarm;1=Warning;2=Alarm,3110,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltage,u,0=No alarm;1=Warning;2=Alarm,3111,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3112,uint16,1,R +com.victronenergy.inverter,/Alarms/LowTemperature,u,0=No alarm;1=Warning;2=Alarm,3113,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltage,u,0=No alarm;1=Warning;2=Alarm,3114,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3115,uint16,1,R +com.victronenergy.inverter,/Alarms/Overload,u,0=No alarm;1=Warning;2=Alarm,3116,uint16,1,R +com.victronenergy.inverter,/Alarms/Ripple,u,0=No alarm;1=Warning;2=Alarm,3117,uint16,1,R +com.victronenergy.inverter,/Dc/0/Voltage,d,V DC,3105,uint16,100,R +com.victronenergy.inverter,/Dc/0/Current,d,A DC,3106,int16,10,R +com.victronenergy.inverter,/Mode,u,2=On;4=Off;5=Eco,3126,uint16,1,W +com.victronenergy.inverter,/State,u,0=Off;1=Low power mode (search mode);2=Fault;9=Inverting (on),3128,uint16,1,R +com.victronenergy.inverter,/Energy/InverterToAcOut,d,kWh,3130,uint32,100,R +com.victronenergy.inverter,/Energy/OutToInverter,d,kWh,3132,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToAcOut,d,kWh,3134,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToBattery,d,kWh,3136,uint32,100,R +com.victronenergy.inverter,/Pv/V,d,V DC,3138,uint16,10,R +com.victronenergy.inverter,/Pv/0/V,d,V DC,3140,uint16,10,R +com.victronenergy.inverter,/Pv/1/V,d,V DC,3141,uint16,10,R +com.victronenergy.inverter,/Pv/2/V,d,V DC,3142,uint16,10,R +com.victronenergy.inverter,/Pv/3/V,d,V DC,3143,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/Yield,d,kWh,3148,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/Yield,d,kWh,3149,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/Yield,d,kWh,3150,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/Yield,d,kWh,3151,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/Yield,d,kWh,3152,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/Yield,d,kWh,3153,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/Yield,d,kWh,3154,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/Yield,d,kWh,3155,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/MaxPower,d,W,3156,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/MaxPower,d,W,3157,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/MaxPower,d,W,3158,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/MaxPower,d,W,3159,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/MaxPower,d,W,3160,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/MaxPower,d,W,3161,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/MaxPower,d,W,3162,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/MaxPower,d,W,3163,uint16,1,R +com.victronenergy.inverter,/Pv/0/P,d,W,3164,uint16,1,R +com.victronenergy.inverter,/Pv/1/P,d,W,3165,uint16,1,R +com.victronenergy.inverter,/Pv/2/P,d,W,3166,uint16,1,R +com.victronenergy.inverter,/Pv/3/P,d,W,3167,uint16,1,R +com.victronenergy.inverter,/Alarms/LowSoc,u,,3168,uint16,1,R +com.victronenergy.genset,/ProductId,u,,3212,uint16,1,R +com.victronenergy.genset,/StatusCode,u,0=Standby;1=Startup 1;2=Startup 2;3=Startup 3;4=Startup 4;5=Startup 5;6=Startup 6;7=Startup 7;8=Running;9=Stopping;10=Error,3213,uint16,1,R +com.victronenergy.genset,/ErrorCode,u,0=No error;1=AC voltage L1 too low;2=AC frequency L1 too low;3=AC current too low;4=AC power too low;5=Emergency stop;6=Servo current too low;7=Oil pressure too low;8=Engine temperature too low;9=Winding temperature too low;10=Exhaust temperature too low;13=Starter current too low;14=Glow current too low;15=Glow current too low;16=Fuel holding magnet current too low;17=Stop solenoid hold coil current too low;18=Stop solenoid pull coil current too low;19=Optional DC out current too low;20=5V output voltage too low;21=Boost output current too low;22=Panel supply current too high;25=Starter battery voltage too low;26=Startup aborted (rotation too low);28=Rotation too low;29=Power contactor current too low;30=AC voltage L2 too low;31=AC frequency L2 too low;32=AC current L2 too low;33=AC power L2 too low;34=AC voltage L3 too low;35=AC frequency L3 too low;36=AC current L3 too low;37=AC power L3 too low;62=Fuel temperature too low;63=Fuel level too low;65=AC voltage L1 too high;66=AC frequency too high;67=AC current too high;68=AC power too high;70=Servo current too high;71=Oil pressure too high;72=Engine temperature too high;73=Winding temperature too high;74=Exhaust temperature too low;77=Starter current too low;78=Glow current too high;79=Glow current too high;80=Fuel holding magnet current too high;81=Stop solenoid hold coil current too high;82=Stop solenoid pull coil current too high;83=Optional DC out current too high;84=5V output voltage too high;85=Boost output current too high;89=Starter battery voltage too high;90=Startup aborted (rotation too high);92=Rotation too high;93=Power contactor current too high;94=AC voltage L2 too high;95=AC frequency L2 too high;96=AC current L2 too high;97=AC power L2 too high;98=AC voltage L3 too high;99=AC frequency L3 too high;100=AC current L3 too high;101=AC power L3 too high;126=Fuel temperature too high;127=Fuel level too high;130=Lost control unit;131=Lost panel;132=Service needed;133=Lost 3-phase module;134=Lost AGT module;135=Synchronization failure;137=Intake airfilter;139=Lost sync. module;140=Load-balance failed;141=Sync-mode deactivated;142=Engine controller;148=Rotating field wrong;149=Fuel level sensor lost;150=Init failed;151=Watchdog;152=Out: winding;153=Out: exhaust;154=Out: Cyl. head;155=Inverter over temperature;156=Inverter overload;157=Inverter communication lost;158=Inverter sync failed;159=CAN communication lost;160=L1 overload;161=L2 overload;162=L3 overload;163=DC overload;164=DC overvoltage;165=Emergency stop;166=No connection,3214,uint16,1,R +com.victronenergy.genset,/AutoStart,u,0=Disabled;1=Enabled,3215,uint16,1,R +com.victronenergy.genset,/Start,u,0=Stop;1=Start,3223,uint16,1,W +com.victronenergy.genset,/Engine/Load,d,%,3216,uint16,1,R +com.victronenergy.genset,/Engine/Speed,d,RPM,3217,uint16,1,R +com.victronenergy.genset,/Engine/OperatingHours,d,s,3218,uint16,0.01,R +com.victronenergy.genset,/Engine/CoolantTemperature,d,Degrees celsius,3219,int16,10,R +com.victronenergy.genset,/Engine/WindingTemperature,d,Degrees celsius,3220,int16,10,R +com.victronenergy.genset,/Engine/ExaustTemperature,d,Degrees celsius,3221,int16,10,R +com.victronenergy.genset,/StarterVoltage,d,V DC,3222,uint16,100,R +com.victronenergy.genset,/Ac/L1/Voltage,d,V AC,3200,uint16,10,R +com.victronenergy.genset,/Ac/L1/Current,d,A AC,3203,int16,10,R +com.victronenergy.genset,/Ac/L1/Power,d,W,3206,int16,1,R +com.victronenergy.genset,/Ac/L1/Frequency,d,Hz,3209,uint16,100,R +com.victronenergy.genset,/Ac/L2/Voltage,d,V AC,3201,uint16,10,R +com.victronenergy.genset,/Ac/L2/Current,d,A AC,3204,int16,10,R +com.victronenergy.genset,/Ac/L2/Power,d,W,3207,int16,1,R +com.victronenergy.genset,/Ac/L2/Frequency,d,Hz,3210,uint16,100,R +com.victronenergy.genset,/Ac/L3/Voltage,d,V AC,3202,uint16,10,R +com.victronenergy.genset,/Ac/L3/Current,d,A AC,3205,int16,10,R +com.victronenergy.genset,/Ac/L3/Power,d,W,3208,int16,1,R +com.victronenergy.genset,/Ac/L3/Frequency,d,Hz,3211,uint16,100,R +com.victronenergy.temperature,/ProductId,u,,3300,uint16,1,R +com.victronenergy.temperature,/Scale,d,,3301,uint16,100,R +com.victronenergy.temperature,/Offset,d,,3302,int16,100,R +com.victronenergy.temperature,/TemperatureType,u,0=Battery;1=Fridge;2=Generic,3303,uint16,1,R +com.victronenergy.temperature,/Temperature,d,Degrees celsius,3304,int16,100,R +com.victronenergy.temperature,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3305,uint16,1,R +com.victronenergy.temperature,/Humidity,u,%,3306,uint16,10,R +com.victronenergy.temperature,/BatteryVoltage,d,V,3307,uint16,100,R +com.victronenergy.temperature,/Pressure,u,hPa,3308,uint16,1,R +com.victronenergy.pulsemeter,/Aggregate,i,,3400,uint32,1,R +com.victronenergy.pulsemeter,/Count,i,,3402,uint32,1,R +com.victronenergy.digitalinput,/Count,i,,3420,uint32,1,R +com.victronenergy.digitalinput,/State,i,,3422,uint16,1,R +com.victronenergy.digitalinput,/Alarm,i,0=No alarm;2=Alarm,3423,uint16,1,R +com.victronenergy.digitalinput,/Type,i,2=Door;3=Bilge pump;4=Bilge alarm;5=Burglar alarm;6=Smoke alarm;7=Fire alarm;8=CO2 alarm;9=Generator;10=ExtTransferSwitch,3424,uint16,1,R +com.victronenergy.generator,/ManualStart,i,0=Stop generator;1=Start generator,3500,uint16,1,W +com.victronenergy.generator,/RunningByConditionCode,i,0=Stopped;1=Manual;2=TestRun;3=LossOfComms;4=Soc;5=AcLoad;6=BatteryCurrent;7=BatteryVoltage;8=InverterTemperatur;9=InverterOverload;10=StopOnAc1,3501,uint16,1,R +com.victronenergy.generator,/Runtime,i,seconds,3502,uint16,1,R +com.victronenergy.generator,/QuietHours,i,0=Quiet hours inactive; 1=Quiet hours active,3503,uint16,1,R +com.victronenergy.generator,/Runtime,u,seconds,3504,uint32,1,R +com.victronenergy.generator,/State,i,0=Stopped;1=Running;10=Error,3506,uint16,1,R +com.victronenergy.generator,/Error,i,0=No Error;1=Remote disabled;2=Remote fault,3507,uint16,1,R +com.victronenergy.generator,/Alarms/NoGeneratorAtAcIn,i,0=No Alarm;2=Alarm,3508,uint16,1,R +com.victronenergy.generator,/AutoStartEnabled,i,0=Autostart disabled;1=Autostart enabled,3509,uint16,1,W +com.victronenergy.meteo,/Irradiance,d,W/m^2,3600,uint16,10,R +com.victronenergy.meteo,/WindSpeed,d,m/s,3601,uint16,10,R +com.victronenergy.meteo,/CellTemperature,d,Degrees celsius,3602,int16,10,R +com.victronenergy.meteo,/ExternalTemperature,d,Degrees celsius,3603,int16,10,R +com.victronenergy.evcharger,/ProductId,u,,3800,uint16,1,R +com.victronenergy.evcharger,/FirmwareVersion,u,,3802,uint32,1,R +com.victronenergy.evcharger,/Serial,s,,3804,string[6],,R +com.victronenergy.evcharger,/Model,s,,3810,string[4],,R +com.victronenergy.evcharger,/MaxCurrent,d,A,3814,uint16,1,W +com.victronenergy.evcharger,/Mode,u,0=Manual;1=Auto,3815,uint16,1,W +com.victronenergy.evcharger,/Ac/Energy/Forward,d,kWh,3816,uint32,100,R +com.victronenergy.evcharger,/Ac/L1/Power,d,W,3818,uint16,1,R +com.victronenergy.evcharger,/Ac/L2/Power,d,W,3819,uint16,1,R +com.victronenergy.evcharger,/Ac/L3/Power,d,W,3820,uint16,1,R +com.victronenergy.evcharger,/Ac/Power,d,W,3821,uint16,1,R +com.victronenergy.evcharger,/ChargingTime,d,s,3822,uint16,0.01,R +com.victronenergy.evcharger,/Current,d,A,3823,uint16,1,W +com.victronenergy.evcharger,/Status,u,0=Disconnected; 1=Connected; 2=Charging; 3=Charged; 4=Waiting for sun; 5=Waiting for RFID; 6=Waiting for start; 7=Low SOC; 8=Ground fault; 9=Welded contacts; 10=CP Input shorted; 11=Residual current detected; 12=Under voltage detected; 13=Overvoltage detected; 14=Overheating detected,3824,uint16,1,R +com.victronenergy.evcharger,/SetCurrent,d,A,3825,uint16,1,W +com.victronenergy.evcharger,/StartStop,u,0=Stop;1=Start,3826,uint16,1,W +com.victronenergy.evcharger,/Position,i,0=AC input 1;1=AC output;2=AC input 2,3827,uint16,1,W +com.victronenergy.acload,/Ac/L1/Power,d,W,3900,int16,1,R +com.victronenergy.acload,/Ac/L2/Power,d,W,3901,int16,1,R +com.victronenergy.acload,/Ac/L3/Power,d,W,3902,int16,1,R +com.victronenergy.acload,/Serial,s,,3903,string[7],,R +com.victronenergy.acload,/Ac/L1/Voltage,d,V AC,3910,uint16,10,R +com.victronenergy.acload,/Ac/L1/Current,d,A AC,3911,int16,10,R +com.victronenergy.acload,/Ac/L2/Voltage,d,V AC,3912,uint16,10,R +com.victronenergy.acload,/Ac/L2/Current,d,A AC,3913,int16,10,R +com.victronenergy.acload,/Ac/L3/Voltage,d,V AC,3914,uint16,10,R +com.victronenergy.acload,/Ac/L3/Current,d,A AC,3915,int16,10,R +com.victronenergy.acload,/Ac/L1/Energy/Forward,d,kWh,3916,uint32,100,R +com.victronenergy.acload,/Ac/L2/Energy/Forward,d,kWh,3918,uint32,100,R +com.victronenergy.acload,/Ac/L3/Energy/Forward,d,kWh,3920,uint32,100,R +com.victronenergy.fuelcell,/Dc/0/Voltage,d,V DC,4000,uint16,100,R +com.victronenergy.fuelcell,/Dc/0/Current,d,A DC,4001,int16,10,R +com.victronenergy.fuelcell,/Dc/1/Voltage,d,V DC,4002,int16,10,R +com.victronenergy.fuelcell,/Dc/0/Temperature,d,Degrees celsius,4003,int16,10,R +com.victronenergy.fuelcell,/History/EnergyOut,d,kWh,4004,uint32,100,R +com.victronenergy.fuelcell,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4006,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4007,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4008,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4009,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4010,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4011,uint16,1,R +com.victronenergy.alternator,/Dc/0/Voltage,d,V DC,4100,uint16,100,R +com.victronenergy.alternator,/Dc/0/Current,d,A DC,4101,int16,10,R +com.victronenergy.alternator,/Dc/1/Voltage,d,V DC,4102,int16,10,R +com.victronenergy.alternator,/Dc/0/Temperature,d,Degrees celsius,4103,int16,10,R +com.victronenergy.alternator,/History/EnergyOut,d,kWh,4104,uint32,100,R +com.victronenergy.alternator,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4106,uint16,1,R +com.victronenergy.alternator,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4107,uint16,1,R +com.victronenergy.alternator,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4108,uint16,1,R +com.victronenergy.alternator,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4109,uint16,1,R +com.victronenergy.alternator,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4110,uint16,1,R +com.victronenergy.alternator,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4111,uint16,1,R +com.victronenergy.alternator,/State,u,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;252=External control,4112,uint16,1,R +com.victronenergy.alternator,/ErrorCode,u,12=High battery temperature;13=High battery voltage;14=Low battery voltage;15=VBat exceeds $CPB;21=High alternator temperature;22=Alternator overspeed;24=Internal error;41=High field FET temperature;42=Sensor missing;43=Low VAlt;44=High Voltage offset;45=VAlt exceeds $CPB;51-52=Battery disconnect request;53=Battery instance out of range;54=Too many BMSes;55=AEBus fault;56=Too many Victron devices;58-61=Battery requested disconnection;91=BMS lost;92=Forced idle;201=DCDC converter fail;201-207=DCDC error,4113,uint16,1,R +com.victronenergy.alternator,/Engine/Speed,d,RPM,4114,uint16,1,R +com.victronenergy.alternator,/Speed,d,RPM,4115,uint16,1,R +com.victronenergy.alternator,/FieldDrive,q,%,4116,uint16,1,R +com.victronenergy.dcsource,/Dc/0/Voltage,d,V DC,4200,uint16,100,R +com.victronenergy.dcsource,/Dc/0/Current,d,A DC,4201,int16,10,R +com.victronenergy.dcsource,/Dc/1/Voltage,d,V DC,4202,int16,10,R +com.victronenergy.dcsource,/Dc/0/Temperature,d,Degrees centigrade,4203,int16,10,R +com.victronenergy.dcsource,/History/EnergyOut,d,kWh,4204,uint32,100,R +com.victronenergy.dcsource,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4206,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4207,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4208,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4209,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4210,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4211,uint16,1,R +com.victronenergy.dcload,/Dc/0/Voltage,d,V DC,4300,uint16,100,R +com.victronenergy.dcload,/Dc/0/Current,d,A DC,4301,int16,10,R +com.victronenergy.dcload,/Dc/1/Voltage,d,V DC,4302,int16,10,R +com.victronenergy.dcload,/Dc/0/Temperature,d,Degrees centigrade,4303,int16,10,R +com.victronenergy.dcload,/History/EnergyIn,d,kWh,4304,uint32,100,R +com.victronenergy.dcload,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4306,uint16,1,R +com.victronenergy.dcload,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4307,uint16,1,R +com.victronenergy.dcload,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4308,uint16,1,R +com.victronenergy.dcload,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4309,uint16,1,R +com.victronenergy.dcload,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4310,uint16,1,R +com.victronenergy.dcload,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4311,uint16,1,R +com.victronenergy.dcsystem,/Dc/0/Voltage,d,V DC,4400,uint16,100,R +com.victronenergy.dcsystem,/Dc/0/Current,d,A DC,4401,int16,10,R +com.victronenergy.dcsystem,/Dc/1/Voltage,d,V DC,4402,int16,10,R +com.victronenergy.dcsystem,/Dc/0/Temperature,d,Degrees centigrade,4403,int16,10,R +com.victronenergy.dcsystem,/History/EnergyOut,d,kWh,4404,uint32,100,R +com.victronenergy.dcsystem,/History/EnergyIn,d,kWh,4406,uint32,100,R +com.victronenergy.dcsystem,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4408,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4409,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4410,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4411,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4412,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4413,uint16,1,R +com.victronenergy.multi,/Ac/In/1/L1/V,d,V AC,4500,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/V,d,V AC,4501,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/V,d,V AC,4502,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/I,d,A AC,4503,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/I,d,A AC,4504,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/I,d,A AC,4505,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/P,d,W,4506,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L2/P,d,W,4507,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L3/P,d,W,4508,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L1/F,d,Hz,4509,uint16,100,R +com.victronenergy.multi,/Ac/Out/L1/V,d,V AC,4510,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/V,d,V AC,4511,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/V,d,V AC,4512,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/I,d,A AC,4513,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/I,d,A AC,4514,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/I,d,A AC,4515,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/P,d,W,4516,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L2/P,d,W,4517,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L3/P,d,W,4518,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L1/F,d,Hz,4519,uint16,100,R +com.victronenergy.multi,/Ac/In/1/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4520,uint16,1,R +com.victronenergy.multi,/Ac/In/2/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4521,uint16,1,R +com.victronenergy.multi,/Ac/In/1/CurrentLimit,d,A,4522,uint16,10,W +com.victronenergy.multi,/Ac/In/2/CurrentLimit,d,A,4523,uint16,10,W +com.victronenergy.multi,/Ac/NumberOfPhases,u,count,4524,uint16,1,R +com.victronenergy.multi,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,4525,uint16,1,R +com.victronenergy.multi,/Dc/0/Voltage,d,V DC,4526,uint16,100,R +com.victronenergy.multi,/Dc/0/Current,d,A DC,4527,int16,10,R +com.victronenergy.multi,/Dc/0/Temperature,d,Degrees celsius,4528,int16,10,R +com.victronenergy.multi,/Soc,d,%,4529,uint16,10,R +com.victronenergy.multi,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=Bulk protection,4530,uint16,1,R +com.victronenergy.multi,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,4531,uint16,1,W +com.victronenergy.multi,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,4532,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltage,u,0=Ok;1=Warning;2=Alarm,4533,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4534,uint16,1,R +com.victronenergy.multi,/Alarms/LowTemperature,u,0=Ok;1=Warning;2=Alarm,4535,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltage,u,0=Ok;1=Warning;2=Alarm,4536,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4537,uint16,1,R +com.victronenergy.multi,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,4538,uint16,1,R +com.victronenergy.multi,/Alarms/Ripple,u,0=Ok;1=Warning;2=Alarm,4539,uint16,1,R +com.victronenergy.multi,/Yield/Power,d,W,4540,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4541,uint16,10,R +com.victronenergy.multi,/Relay/0/State,i,0=Open;1=Closed,4542,uint16,1,R +com.victronenergy.multi,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4543,uint16,1,R +com.victronenergy.multi,/Pv/V,d,V DC,4544,uint16,10,R +com.victronenergy.multi,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,4545,uint16,1,R +com.victronenergy.multi,/Energy/AcIn1ToAcOut,d,kWh,4546,uint32,100,R +com.victronenergy.multi,/Energy/AcIn1ToInverter,d,kWh,4548,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToAcOut,d,kWh,4550,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToInverter,d,kWh,4552,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn1,d,kWh,4554,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn2,d,kWh,4556,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn1,d,kWh,4558,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn2,d,kWh,4560,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcOut,d,kWh,4562,uint32,100,R +com.victronenergy.multi,/Energy/OutToInverter,d,kWh,4564,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn1,d,kWh,4566,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn2,d,kWh,4568,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcOut,d,kWh,4570,uint32,100,R +com.victronenergy.multi,/Energy/SolarToBattery,d,kWh,4572,uint32,100,R +com.victronenergy.multi,/History/Daily/0/Yield,d,kWh,4574,uint16,10,R +com.victronenergy.multi,/History/Daily/0/MaxPower,d,W,4575,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Yield,d,kWh,4576,uint16,10,R +com.victronenergy.multi,/History/Daily/1/MaxPower,d,W,4577,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/0/Yield,d,kWh,4578,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/1/Yield,d,kWh,4579,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/2/Yield,d,kWh,4580,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/3/Yield,d,kWh,4581,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/0/Yield,d,kWh,4582,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/1/Yield,d,kWh,4583,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/2/Yield,d,kWh,4584,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/3/Yield,d,kWh,4585,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/0/MaxPower,d,W,4586,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/1/MaxPower,d,W,4587,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/2/MaxPower,d,W,4588,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/3/MaxPower,d,W,4589,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/0/MaxPower,d,W,4590,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/1/MaxPower,d,W,4591,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/2/MaxPower,d,W,4592,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/3/MaxPower,d,W,4593,uint16,1,R +com.victronenergy.multi,/Pv/0/V,d,V DC,4594,uint16,10,R +com.victronenergy.multi,/Pv/1/V,d,V DC,4595,uint16,10,R +com.victronenergy.multi,/Pv/2/V,d,V DC,4596,uint16,10,R +com.victronenergy.multi,/Pv/3/V,d,V DC,4597,uint16,10,R +com.victronenergy.multi,/Pv/0/P,d,W,4598,uint16,1,R +com.victronenergy.multi,/Pv/1/P,d,W,4599,uint16,1,R +com.victronenergy.multi,/Pv/2/P,d,W,4600,uint16,1,R +com.victronenergy.multi,/Pv/3/P,d,W,4601,uint16,1,R +com.victronenergy.multi,/Alarms/LowSoc,u,,4602,uint16,1,R diff --git a/FileSets/v2.94/attributes.csv.orig b/FileSets/v2.94/attributes.csv.orig new file mode 100644 index 00000000..b5f1097c --- /dev/null +++ b/FileSets/v2.94/attributes.csv.orig @@ -0,0 +1,626 @@ +com.victronenergy.gps,/Position/Latitude,d,Decimal degrees,2800,int32,10000000,R +com.victronenergy.gps,/Position/Longitude,d,Decimal degrees,2802,int32,10000000,R +com.victronenergy.gps,/Course,d,Degrees,2804,uint16,100,R +com.victronenergy.gps,/Speed,d,m/s,2805,uint16,100,R +com.victronenergy.gps,/Fix,y,,2806,uint16,1,R +com.victronenergy.gps,/NrOfSatellites,y,,2807,uint16,1,R +com.victronenergy.gps,/Altitude,d,m,2808,int32,10,R +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/State,i,0=BL disabled;1=Restarting;2=Self-consumption;3=Self-consumption;4=Self-consumption;5=Discharge disabled;6=Force charge;7=Sustain;9=Keep batteries charged;10=BL Disabled;11=BL Disabled (Low SoC),2900,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/MinimumSocLimit,d,%,2901,uint16,10,W +com.victronenergy.settings,/Settings/CGwacs/Hub4Mode,i,1=ESS with Phase Compensation;2=ESS without phase compensation;3=Disabled/External Control,2902,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/SocLimit,d,%,2903,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/V,d,V AC,3,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/V,d,V AC,4,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/V,d,V AC,5,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/I,d,A AC,6,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/I,d,A AC,7,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/I,d,A AC,8,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/F,d,Hz,9,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/F,d,Hz,10,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/F,d,Hz,11,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/P,i,VA or Watts,12,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/P,i,VA or Watts,13,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/P,i,VA or Watts,14,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L1/V,d,V AC,15,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L2/V,d,V AC,16,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L3/V,d,V AC,17,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L1/I,d,A AC,18,int16,10,R +com.victronenergy.vebus,/Ac/Out/L2/I,d,A AC,19,int16,10,R +com.victronenergy.vebus,/Ac/Out/L3/I,d,A AC,20,int16,10,R +com.victronenergy.vebus,/Ac/Out/L1/F,d,Hz,21,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/CurrentLimit,d,A,22,int16,10,W +com.victronenergy.vebus,/Ac/Out/L1/P,i,VA or Watts,23,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L2/P,i,VA or Watts,24,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L3/P,i,VA or Watts,25,int16,0.1,R +com.victronenergy.vebus,/Dc/0/Voltage,d,V DC,26,uint16,100,R +com.victronenergy.vebus,/Dc/0/Current,d,A DC,27,int16,10,R +com.victronenergy.vebus,/Ac/NumberOfPhases,u,count,28,uint16,1,R +com.victronenergy.vebus,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,29,uint16,1,R +com.victronenergy.vebus,/Soc,d,%,30,uint16,10,W +com.victronenergy.vebus,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=Bulk protection,31,uint16,1,R +com.victronenergy.vebus,/VebusError,u,0=No error;1=VE.Bus Error 1: Device is switched off because one of the other phases in the system has switched off;2=VE.Bus Error 2: New and old types MK2 are mixed in the system;3=VE.Bus Error 3: Not all- or more than- the expected devices were found in the system;4=VE.Bus Error 4: No other device whatsoever detected;5=VE.Bus Error 5: Overvoltage on AC-out;6=VE.Bus Error 6: Error in DDC Program;7=VE.Bus BMS connected- which requires an Assistant- but no assistant found;10=VE.Bus Error 10: System time synchronisation problem occurred;14=VE.Bus Error 14: Device cannot transmit data;16=VE.Bus Error 16: Dongle missing;17=VE.Bus Error 17: One of the devices assumed master status because the original master failed;18=VE.Bus Error 18: AC Overvoltage on the output of a slave has occurred while already switched off;22=VE.Bus Error 22: This device cannot function as slave;24=VE.Bus Error 24: Switch-over system protection initiated;25=VE.Bus Error 25: Firmware incompatibility. The firmware of one of the connected device is not sufficiently up to date to operate in conjunction with this device;26=VE.Bus Error 26: Internal error,32,uint16,1,R +com.victronenergy.vebus,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,33,uint16,1,W +com.victronenergy.vebus,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,34,uint16,1,R +com.victronenergy.vebus,/Alarms/LowBattery,u,0=Ok;1=Warning;2=Alarm,35,uint16,1,R +com.victronenergy.vebus,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,36,uint16,1,R +com.victronenergy.vebus,/Alarms/TemperatureSensor,u,0=Ok;1=Warning;2=Alarm,42,uint16,1,R +com.victronenergy.vebus,/Alarms/VoltageSensor,u,0=Ok;1=Warning;2=Alarm,43,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/HighTemperature,u,0=Ok;1=Warning;2=Alarm,44,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/LowBattery,u,0=Ok;1=Warning;2=Alarm,45,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Overload,u,0=Ok;1=Warning;2=Alarm,46,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Ripple,u,0=Ok;1=Warning;2=Alarm,47,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/HighTemperature,u,0=Ok;1=Warning;2=Alarm,48,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/LowBattery,u,0=Ok;1=Warning;2=Alarm,49,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Overload,u,0=Ok;1=Warning;2=Alarm,50,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Ripple,u,0=Ok;1=Warning;2=Alarm,51,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/HighTemperature,u,0=Ok;1=Warning;2=Alarm,52,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/LowBattery,u,0=Ok;1=Warning;2=Alarm,53,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Overload,u,0=Ok;1=Warning;2=Alarm,54,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Ripple,u,0=Ok;1=Warning;2=Alarm,55,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,37,int16,1,W +com.victronenergy.vebus,/Hub4/DisableCharge,u,0=Charge allowed;1=Charge disabled,38,uint16,1,W +com.victronenergy.vebus,/Hub4/DisableFeedIn,u,0=Feed in allowed;1=Feed in disabled,39,uint16,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,40,int16,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,41,int16,1,W +com.victronenergy.vebus,/PvInverter/Disable,u,0=PV enabled;1=PV disabled,56,uint16,1,W +com.victronenergy.vebus,/Bms/AllowToCharge,u,0=No;1=Yes,57,uint16,1,R +com.victronenergy.vebus,/Bms/AllowToDischarge,u,0=No;1=Yes,58,uint16,1,R +com.victronenergy.vebus,/Bms/BmsExpected,u,0=No;1=Yes,59,uint16,1,R +com.victronenergy.vebus,/Bms/Error,u,0=No;1=Yes,60,uint16,1,R +com.victronenergy.vebus,/Dc/0/Temperature,d,Degrees celsius,61,int16,10,R +com.victronenergy.vebus,/SystemReset,y,0=No action;1=VE.Bus Reset,62,uint16,1,W +com.victronenergy.vebus,/Alarms/PhaseRotation,u,0=Ok;1=Warning,63,uint16,1,R +com.victronenergy.vebus,/Alarms/GridLost,i,0=No alarm;2=Alarm,64,uint16,1,R +com.victronenergy.vebus,/Hub4/DoNotFeedInOvervoltage,i,0=Feed in overvoltage;1=Don't feed in overvoltage,65,uint16,1,W +com.victronenergy.vebus,/Hub4/L1/MaxFeedInPower,d,W,66,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L2/MaxFeedInPower,d,W,67,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L3/MaxFeedInPower,d,W,68,uint16,0.01,W +com.victronenergy.vebus,/Ac/State/IgnoreAcIn1,i,0=AC input not ignored; 1=AC input ignored,69,uint16,1,R +com.victronenergy.vebus,/Ac/State/IgnoreAcIn2,i,0=AC input not ignored; 1=AC input ignored,70,uint16,1,R +com.victronenergy.vebus,/Hub4/TargetPowerIsMaxFeedIn,i,0=AcPowerSetpoint interpreted normally; 1=AcPowerSetpoint as OvervoltageFeedIn limit,71,uint16,,W +com.victronenergy.vebus,/Hub4/FixSolarOffsetTo100mV,i,0=OvervoltageFeedIn uses 1V offset; 1=OvervoltageFeedIn uses 0.1V offset,72,uint16,,W +com.victronenergy.vebus,/Hub4/Sustain,i,0=Sustain inactive; 1=Sustain active,73,uint16,1,R +com.victronenergy.vebus,/Energy/AcIn1ToAcOut,d,kWh,74,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn1ToInverter,d,kWh,76,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToAcOut,d,kWh,78,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToInverter,d,kWh,80,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn1,d,kWh,82,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn2,d,kWh,84,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn1,d,kWh,86,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn2,d,kWh,88,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcOut,d,kWh,90,uint32,100,R +com.victronenergy.vebus,/Energy/OutToInverter,d,kWh,92,uint32,100,R +com.victronenergy.battery,/Dc/0/Voltage,d,V DC,259,uint16,100,R +com.victronenergy.battery,/Dc/1/Voltage,d,V DC,260,uint16,100,R +com.victronenergy.battery,/Dc/0/Current,d,A DC,261,int16,10,R +com.victronenergy.battery,/Dc/0/Temperature,d,Degrees celsius,262,int16,10,R +com.victronenergy.battery,/Dc/0/MidVoltage,d,V DC,263,uint16,100,R +com.victronenergy.battery,/Dc/0/MidVoltageDeviation,d,%,264,uint16,100,R +com.victronenergy.battery,/ConsumedAmphours,d,Ah,265,uint16,-10,R +com.victronenergy.battery,/Soc,y,%,266,uint16,10,R +com.victronenergy.battery,/Soh,y,%,304,uint16,10,R +com.victronenergy.battery,/TimeToGo,q,seconds,303,uint16,0.01,R +com.victronenergy.battery,/Info/MaxChargeVoltage,u,V DC,305,uint16,10,R +com.victronenergy.battery,/Info/BatteryLowVoltage,u,V DC,306,uint16,10,R +com.victronenergy.battery,/Info/MaxChargeCurrent,u,A DC,307,uint16,10,R +com.victronenergy.battery,/Info/MaxDischargeCurrent,u,A DC,308,uint16,10,R +com.victronenergy.battery,/Alarms/Alarm,y,0=No alarm;2=Alarm,267,uint16,1,R +com.victronenergy.battery,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,268,uint16,1,R +com.victronenergy.battery,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,269,uint16,1,R +com.victronenergy.battery,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,270,uint16,1,R +com.victronenergy.battery,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,271,uint16,1,R +com.victronenergy.battery,/Alarms/LowSoc,u,0=No alarm;2=Alarm,272,uint16,1,R +com.victronenergy.battery,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,273,uint16,1,R +com.victronenergy.battery,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,274,uint16,1,R +com.victronenergy.battery,/Alarms/MidVoltage,u,0=No alarm;2=Alarm,275,uint16,1,R +com.victronenergy.battery,/Alarms/LowFusedVoltage,u,0=No alarm;2=Alarm,276,uint16,1,R +com.victronenergy.battery,/Alarms/HighFusedVoltage,u,0=No alarm;2=Alarm,277,uint16,1,R +com.victronenergy.battery,/Alarms/FuseBlown,u,0=No alarm;2=Alarm,278,uint16,1,R +com.victronenergy.battery,/Alarms/HighInternalTemperature,u,0=No alarm;2=Alarm,279,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeCurrent,u,0=No alarm;2=Alarm,320,uint16,1,R +com.victronenergy.battery,/Alarms/HighDischargeCurrent,u,0=No alarm;2=Alarm,321,uint16,1,R +com.victronenergy.battery,/Alarms/CellImbalance,u,0=No alarm;2=Alarm,322,uint16,1,R +com.victronenergy.battery,/Alarms/InternalFailure,u,0=No alarm;2=Alarm,323,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeTemperature,u,0=No alarm;2=Alarm,324,uint16,1,R +com.victronenergy.battery,/Alarms/LowChargeTemperature,u,0=No alarm;2=Alarm,325,uint16,1,R +com.victronenergy.battery,/Alarms/LowCellVoltage,u,0=No alarm;1=Almost discharged;2=Alarm,326,uint16,1,R +com.victronenergy.battery,/Relay/0/State,y,0=Open;1=Closed,280,uint16,1,W +com.victronenergy.battery,/History/DeepestDischarge,d,Ah,281,uint16,-10,R +com.victronenergy.battery,/History/LastDischarge,d,Ah,282,uint16,-10,R +com.victronenergy.battery,/History/AverageDischarge,d,Ah,283,uint16,-10,R +com.victronenergy.battery,/History/ChargeCycles,i,count,284,uint16,1,R +com.victronenergy.battery,/History/FullDischarges,i,count,285,uint16,1,R +com.victronenergy.battery,/History/TotalAhDrawn,d,Ah,286,uint16,-10,R +com.victronenergy.battery,/History/MinimumVoltage,d,V DC,287,uint16,100,R +com.victronenergy.battery,/History/MaximumVoltage,d,V DC,288,uint16,100,R +com.victronenergy.battery,/History/TimeSinceLastFullCharge,i,seconds,289,uint16,0.01,R +com.victronenergy.battery,/History/AutomaticSyncs,i,count,290,uint16,1,R +com.victronenergy.battery,/History/LowVoltageAlarms,i,count,291,uint16,1,R +com.victronenergy.battery,/History/HighVoltageAlarms,i,count,292,uint16,1,R +com.victronenergy.battery,/History/LowStarterVoltageAlarms,i,count,293,uint16,1,R +com.victronenergy.battery,/History/HighStarterVoltageAlarms,i,count,294,uint16,1,R +com.victronenergy.battery,/History/MinimumStarterVoltage,d,V DC,295,uint16,100,R +com.victronenergy.battery,/History/MaximumStarterVoltage,d,V DC,296,uint16,100,R +com.victronenergy.battery,/History/LowFusedVoltageAlarms,i,count,297,uint16,1,R +com.victronenergy.battery,/History/HighFusedVoltageAlarms,i,count,298,uint16,1,R +com.victronenergy.battery,/History/MinimumFusedVoltage,d,V DC,299,uint16,100,R +com.victronenergy.battery,/History/MaximumFusedVoltage,d,V DC,300,uint16,100,R +com.victronenergy.battery,/History/DischargedEnergy,d,kWh,301,uint16,10,R +com.victronenergy.battery,/History/ChargedEnergy,d,kWh,302,uint16,10,R +com.victronenergy.battery,/Capacity,d,Ah,309,uint16,10,R +com.victronenergy.battery,/State,y,0=Initializing (Wait start);1=Initializing (before boot);2=Initializing (Before boot delay);3=Initializing (Wait boot);4=Initializing;5=Initializing (Measure battery voltage);6=Initializing (Calculate battery voltage);7=Initializing (Wait bus voltage);8=Initializing (Wait for lynx shunt);9=Running;10=Error (10);11=Error (11),1282,uint16,1,R +com.victronenergy.battery,/ErrorCode,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1283,uint16,1,R +com.victronenergy.battery,/SystemSwitch,y,0=Disabled;1=Enabled,1284,uint16,1,R +com.victronenergy.battery,/Balancing,y,0=Inactive;1=Active,1285,uint16,1,R +com.victronenergy.battery,/System/NrOfBatteries,y,count,1286,uint16,1,R +com.victronenergy.battery,/System/BatteriesParallel,y,count,1287,uint16,1,R +com.victronenergy.battery,/System/BatteriesSeries,y,count,1288,uint16,1,R +com.victronenergy.battery,/System/NrOfCellsPerBattery,y,count,1289,uint16,1,R +com.victronenergy.battery,/System/MinCellVoltage,d,V DC,1290,uint16,100,R +com.victronenergy.battery,/System/MaxCellVoltage,d,V DC,1291,uint16,100,R +com.victronenergy.battery,/Diagnostics/ShutDownsDueError,q,count,1292,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1293,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1294,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1295,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1296,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Time,u,,310,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Time,u,,312,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Time,u,,314,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Time,u,,316,int32,1,R +com.victronenergy.battery,/System/MinCellTemperature,d,Degrees celsius,318,int16,10,R +com.victronenergy.battery,/System/MaxCellTemperature,d,Degrees celsius,319,int16,10,R +com.victronenergy.battery,/Io/AllowToCharge,y,0=No;1=Yes,1297,uint16,1,R +com.victronenergy.battery,/Io/AllowToDischarge,y,0=No;1=Yes,1298,uint16,1,R +com.victronenergy.battery,/Io/ExternalRelay,y,0=Inactive;1=Active,1299,uint16,1,R +com.victronenergy.battery,/History/MinimumCellVoltage,d,V DC,1300,uint16,100,R +com.victronenergy.battery,/History/MaximumCellVoltage,d,V DC,1301,uint16,100,R +com.victronenergy.battery,/System/NrOfModulesOffline,u,,1302,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesOnline,u,,1303,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingCharge,u,,1304,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingDischarge,u,,1305,uint16,1,R +com.victronenergy.battery,/System/MinVoltageCellId,s,,1306,string[4],1,R +com.victronenergy.battery,/System/MaxVoltageCellId,s,,1310,string[4],1,R +com.victronenergy.battery,/System/MinTemperatureCellId,s,,1314,string[4],1,R +com.victronenergy.battery,/System/MaxTemperatureCellId,s,,1318,string[4],1,R +com.victronenergy.solarcharger,/Dc/0/Voltage,d,V DC,771,uint16,100,R +com.victronenergy.solarcharger,/Dc/0/Current,d,A DC,772,int16,10,R +com.victronenergy.solarcharger,/Dc/0/Temperature,d,Degrees celsius,773,int16,10,R +com.victronenergy.solarcharger,/Mode,i,1=On;4=Off,774,uint16,1,W +com.victronenergy.solarcharger,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;11=Other (Hub-1);252=Hub-1,775,uint16,1,R +com.victronenergy.solarcharger,/Pv/V,d,V DC,776,uint16,100,R +com.victronenergy.solarcharger,/Pv/I,d,A DC,777,,10,R,HANDLED IN mappings.c +com.victronenergy.solarcharger,/Yield/Power,d,W,789,uint16,10,R +com.victronenergy.solarcharger,/Equalization/Pending,i,0=No;1=Yes;2=Error;3=Unavailable- Unknown,778,uint16,1,R +com.victronenergy.solarcharger,/Equalization/TimeRemaining,d,seconds,779,uint16,10,R +com.victronenergy.solarcharger,/Relay/0/State,i,0=Open;1=Closed,780,uint16,1,R +com.victronenergy.solarcharger,/Alarms/Alarm,i,0=No alarm;2=Alarm,781,uint16,1,R +com.victronenergy.solarcharger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,782,uint16,1,R +com.victronenergy.solarcharger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,783,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Yield,d,kWh,784,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/MaxPower,d,W,785,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Yield,d,kWh,786,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/MaxPower,d,W,787,uint16,1,R +com.victronenergy.solarcharger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,788,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,790,uint16,10,R +com.victronenergy.solarcharger,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,791,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/V,d,V DC,3700,uint16,100,R +com.victronenergy.solarcharger,/Pv/1/V,d,V DC,3701,uint16,100,R +com.victronenergy.solarcharger,/Pv/2/V,d,V DC,3702,uint16,100,R +com.victronenergy.solarcharger,/Pv/3/V,d,V DC,3703,uint16,100,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/Yield,d,kWh,3708,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/Yield,d,kWh,3709,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/Yield,d,kWh,3710,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/Yield,d,kWh,3711,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/Yield,d,kWh,3712,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/Yield,d,kWh,3713,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/Yield,d,kWh,3714,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/Yield,d,kWh,3715,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/MaxPower,d,W,3716,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/MaxPower,d,W,3717,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/MaxPower,d,W,3718,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/MaxPower,d,W,3719,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/MaxPower,d,W,3720,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/MaxPower,d,W,3721,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/MaxPower,d,W,3722,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/MaxPower,d,W,3723,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/P,d,W,3724,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/P,d,W,3725,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/P,d,W,3726,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/P,d,W,3727,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L1/Power,d,W,808,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L2/Power,d,W,809,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L3/Power,d,W,810,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L1/Power,d,W,811,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L2/Power,d,W,812,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L3/Power,d,W,813,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L1/Power,d,W,814,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L2/Power,d,W,815,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L3/Power,d,W,816,uint16,1,R +com.victronenergy.system,/Dc/Pv/Power,d,W,850,uint16,1,R +com.victronenergy.system,/Dc/Pv/Current,d,A DC,851,int16,10,R +com.victronenergy.system,/Dc/Charger/Power,d,W,855,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L1/Power,d,W,817,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L2/Power,d,W,818,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L3/Power,d,W,819,uint16,1,R +com.victronenergy.system,/Ac/Grid/L1/Power,d,W,820,int16,1,R +com.victronenergy.system,/Ac/Grid/L2/Power,d,W,821,int16,1,R +com.victronenergy.system,/Ac/Grid/L3/Power,d,W,822,int16,1,R +com.victronenergy.system,/Ac/Genset/L1/Power,d,W,823,int16,1,R +com.victronenergy.system,/Ac/Genset/L2/Power,d,W,824,int16,1,R +com.victronenergy.system,/Ac/Genset/L3/Power,d,W,825,int16,1,R +com.victronenergy.system,/Ac/ActiveIn/Source,u,0=Not available;1=Grid;2=Generator;3=Shore power;240=Not connected,826,int16,1,R +com.victronenergy.system,/Dc/System/Power,d,W,860,int16,1,R +com.victronenergy.system,/Dc/Battery/Voltage,d,V DC,840,uint16,10,R +com.victronenergy.system,/Dc/Battery/Current,d,A DC,841,int16,10,R +com.victronenergy.system,/Dc/Battery/Power,d,W,842,int16,1,R +com.victronenergy.system,/Dc/Vebus/Current,d,A DC,865,int16,10,R +com.victronenergy.system,/Dc/Vebus/Power,d,W,866,int16,1,R +com.victronenergy.system,/Dc/Battery/Soc,d,%,843,uint16,1,R +com.victronenergy.system,/Dc/Battery/State,i,0=idle;1=charging;2=discharging,844,uint16,1,R +com.victronenergy.system,/Dc/Battery/ConsumedAmphours,d,Ah,845,uint16,-10,R +com.victronenergy.system,/Dc/Battery/TimeToGo,d,s,846,uint16,0.01,R +com.victronenergy.system,/Relay/0/State,i,0=Open;1=Closed,806,uint16,1,W +com.victronenergy.system,/Relay/1/State,i,0=Open;1=Closed,807,uint16,1,W +com.victronenergy.system,/Serial,s,,800,string[6],1,R +com.victronenergy.pvinverter,/Position,i,0=AC input 1;1=AC output;2=AC input 2,1026,uint16,1,R +com.victronenergy.pvinverter,/Serial,s,,1039,string[7],1,R +com.victronenergy.pvinverter,/Ac/L1/Voltage,d,V AC,1027,uint16,10,R +com.victronenergy.pvinverter,/Ac/L1/Current,d,A AC,1028,int16,10,R +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1029,uint16,1,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1030,uint16,100,R +com.victronenergy.pvinverter,/Ac/L2/Voltage,d,V AC,1031,uint16,10,R +com.victronenergy.pvinverter,/Ac/L2/Current,d,A AC,1032,int16,10,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1033,uint16,1,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1034,uint16,100,R +com.victronenergy.pvinverter,/Ac/L3/Voltage,d,V AC,1035,uint16,10,R +com.victronenergy.pvinverter,/Ac/L3/Current,d,A AC,1036,int16,10,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1037,uint16,1,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1038,uint16,100,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1046,uint32,100,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1048,uint32,100,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1050,uint32,100,R +com.victronenergy.pvinverter,/Ac/Power,i,kW,1052,int32,1,W +com.victronenergy.pvinverter,/Ac/MaxPower,u,kW,1054,uint32,1,W +com.victronenergy.pvinverter,/Ac/PowerLimit,u,kW,1056,uint32,1,W +com.victronenergy.motordrive,/Motor/RPM,d,RPM,2048,int16,1,R +com.victronenergy.motordrive,/Motor/Temperature,d,Degrees celsius,2049,int16,10,R +com.victronenergy.motordrive,/Dc/0/Voltage,d,V DC,2050,uint16,100,R +com.victronenergy.motordrive,/Dc/0/Current,d,A DC,2051,int16,10,R +com.victronenergy.motordrive,/Dc/0/Power,d,W,2052,int16,10,R +com.victronenergy.motordrive,/Controller/Temperature,d,Degrees celsius,2053,int16,10,R +com.victronenergy.charger,/Dc/0/Voltage,d,V DC,2307,uint16,100,R +com.victronenergy.charger,/Dc/0/Current,d,A DC,2308,int16,10,R +com.victronenergy.charger,/Dc/0/Temperature,d,Degrees celsius,2309,int16,10,R +com.victronenergy.charger,/Dc/1/Voltage,d,V DC,2310,uint16,100,R +com.victronenergy.charger,/Dc/1/Current,d,A DC,2311,int16,10,R +com.victronenergy.charger,/Dc/2/Voltage,d,V DC,2312,uint16,100,R +com.victronenergy.charger,/Dc/2/Current,d,A DC,2313,int16,10,R +com.victronenergy.charger,/Ac/In/L1/I,d,A AC,2314,int16,10,R +com.victronenergy.charger,/Ac/In/L1/P,d,W DC,2315,uint16,1,R +com.victronenergy.charger,/Ac/In/CurrentLimit,d,A AC,2316,int16,10,W +com.victronenergy.charger,/Mode,i,0=Off;1=On;2=Error;3=Unavailable- Unknown,2317,uint16,1,W +com.victronenergy.charger,/State,i,0=Off;1=Low Power Mode;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply mode;252=Bulk protection,2318,uint16,1,R +com.victronenergy.charger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,2319,uint16,1,R +com.victronenergy.charger,/Relay/0/State,i,0=Open;1=Closed,2320,uint16,1,R +com.victronenergy.charger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,2321,uint16,1,R +com.victronenergy.charger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,2322,uint16,1,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2600,int16,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2601,int16,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2602,int16,1,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2603,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2604,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2605,uint16,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2606,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2607,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2608,uint16,100,R +com.victronenergy.grid,/Serial,s,,2609,string[7],,R +com.victronenergy.grid,/Ac/L1/Voltage,d,V AC,2616,uint16,10,R +com.victronenergy.grid,/Ac/L1/Current,d,A AC,2617,int16,10,R +com.victronenergy.grid,/Ac/L2/Voltage,d,V AC,2618,uint16,10,R +com.victronenergy.grid,/Ac/L2/Current,d,A AC,2619,int16,10,R +com.victronenergy.grid,/Ac/L3/Voltage,d,V AC,2620,uint16,10,R +com.victronenergy.grid,/Ac/L3/Current,d,A AC,2621,int16,10,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2622,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2624,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2626,uint32,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2628,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2630,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2632,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Forward,d,kWh,2634,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Reverse,d,kWh,2636,uint32,100,R +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2700,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2703,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/MaxChargePercentage,d,%,2701,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePercentage,d,%,2702,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePower,d,W,2704,uint16,0.1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeCurrent,d,A,2705,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxFeedInPower,d,W,2706,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/OvervoltageFeedIn,i,0=Don't feed excess DC-coupled PV into grid;1=Feed excess DC-coupled PV into the grid,2707,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/PreventFeedback,i,0=Feed excess AC-coupled PV into grid;1=Don't feed excess AC-coupled PV into the grid,2708,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeVoltage,d,V,2710,uint16,10,W +com.victronenergy.hub4,/PvPowerLimiterActive,i,0=Feed-in limiting inactive;1=Feed-in limiting active,2709,uint16,1,R +com.victronenergy.tank,/ProductId,u,,3000,uint16,1,R +com.victronenergy.tank,/Capacity,d,m3,3001,uint32,10000,R +com.victronenergy.tank,/FluidType,u,0=Fuel;1=Fresh water;2=Waste water;3=Live well;4=Oil;5=Black water (sewage);6=Gasoline;7=Diesel;8=LPG;9=LNG;10=Hydraulic oil;11=Raw water,3003,uint16,1,R +com.victronenergy.tank,/Level,d,%,3004,uint16,10,R +com.victronenergy.tank,/Remaining,d,m3,3005,uint32,10000,R +com.victronenergy.tank,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3007,uint16,1,R +com.victronenergy.inverter,/ProductId,u,,3127,uint16,1,R +com.victronenergy.inverter,/FirmwareVersion,u,,3125,uint16,1,R +com.victronenergy.inverter,/Ac/Out/L1/I,d,A AC,3100,int16,10,R +com.victronenergy.inverter,/Ac/Out/L1/V,d,V AC,3101,uint16,10,R +com.victronenergy.inverter,/Ac/Out/L1/P,d,W AC,3102,int16,0.1,R +com.victronenergy.inverter,/Alarms/HighTemperature,u,0=No alarm;1=Warning;2=Alarm,3110,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltage,u,0=No alarm;1=Warning;2=Alarm,3111,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3112,uint16,1,R +com.victronenergy.inverter,/Alarms/LowTemperature,u,0=No alarm;1=Warning;2=Alarm,3113,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltage,u,0=No alarm;1=Warning;2=Alarm,3114,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3115,uint16,1,R +com.victronenergy.inverter,/Alarms/Overload,u,0=No alarm;1=Warning;2=Alarm,3116,uint16,1,R +com.victronenergy.inverter,/Alarms/Ripple,u,0=No alarm;1=Warning;2=Alarm,3117,uint16,1,R +com.victronenergy.inverter,/Dc/0/Voltage,d,V DC,3105,uint16,100,R +com.victronenergy.inverter,/Dc/0/Current,d,A DC,3106,int16,10,R +com.victronenergy.inverter,/Mode,u,2=On;4=Off;5=Eco,3126,uint16,1,W +com.victronenergy.inverter,/State,u,0=Off;1=Low power mode (search mode);2=Fault;9=Inverting (on),3128,uint16,1,R +com.victronenergy.inverter,/Energy/InverterToAcOut,d,kWh,3130,uint32,100,R +com.victronenergy.inverter,/Energy/OutToInverter,d,kWh,3132,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToAcOut,d,kWh,3134,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToBattery,d,kWh,3136,uint32,100,R +com.victronenergy.inverter,/Pv/V,d,V DC,3138,uint16,10,R +com.victronenergy.inverter,/Pv/0/V,d,V DC,3140,uint16,10,R +com.victronenergy.inverter,/Pv/1/V,d,V DC,3141,uint16,10,R +com.victronenergy.inverter,/Pv/2/V,d,V DC,3142,uint16,10,R +com.victronenergy.inverter,/Pv/3/V,d,V DC,3143,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/Yield,d,kWh,3148,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/Yield,d,kWh,3149,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/Yield,d,kWh,3150,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/Yield,d,kWh,3151,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/Yield,d,kWh,3152,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/Yield,d,kWh,3153,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/Yield,d,kWh,3154,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/Yield,d,kWh,3155,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/MaxPower,d,W,3156,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/MaxPower,d,W,3157,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/MaxPower,d,W,3158,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/MaxPower,d,W,3159,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/MaxPower,d,W,3160,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/MaxPower,d,W,3161,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/MaxPower,d,W,3162,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/MaxPower,d,W,3163,uint16,1,R +com.victronenergy.inverter,/Pv/0/P,d,W,3164,uint16,1,R +com.victronenergy.inverter,/Pv/1/P,d,W,3165,uint16,1,R +com.victronenergy.inverter,/Pv/2/P,d,W,3166,uint16,1,R +com.victronenergy.inverter,/Pv/3/P,d,W,3167,uint16,1,R +com.victronenergy.inverter,/Alarms/LowSoc,u,,3168,uint16,1,R +com.victronenergy.genset,/ProductId,u,,3212,uint16,1,R +com.victronenergy.genset,/StatusCode,u,0=Standby;1=Startup 1;2=Startup 2;3=Startup 3;4=Startup 4;5=Startup 5;6=Startup 6;7=Startup 7;8=Running;9=Stopping;10=Error,3213,uint16,1,R +com.victronenergy.genset,/ErrorCode,u,0=No error;1=AC voltage L1 too low;2=AC frequency L1 too low;3=AC current too low;4=AC power too low;5=Emergency stop;6=Servo current too low;7=Oil pressure too low;8=Engine temperature too low;9=Winding temperature too low;10=Exhaust temperature too low;13=Starter current too low;14=Glow current too low;15=Glow current too low;16=Fuel holding magnet current too low;17=Stop solenoid hold coil current too low;18=Stop solenoid pull coil current too low;19=Optional DC out current too low;20=5V output voltage too low;21=Boost output current too low;22=Panel supply current too high;25=Starter battery voltage too low;26=Startup aborted (rotation too low);28=Rotation too low;29=Power contactor current too low;30=AC voltage L2 too low;31=AC frequency L2 too low;32=AC current L2 too low;33=AC power L2 too low;34=AC voltage L3 too low;35=AC frequency L3 too low;36=AC current L3 too low;37=AC power L3 too low;62=Fuel temperature too low;63=Fuel level too low;65=AC voltage L1 too high;66=AC frequency too high;67=AC current too high;68=AC power too high;70=Servo current too high;71=Oil pressure too high;72=Engine temperature too high;73=Winding temperature too high;74=Exhaust temperature too low;77=Starter current too low;78=Glow current too high;79=Glow current too high;80=Fuel holding magnet current too high;81=Stop solenoid hold coil current too high;82=Stop solenoid pull coil current too high;83=Optional DC out current too high;84=5V output voltage too high;85=Boost output current too high;89=Starter battery voltage too high;90=Startup aborted (rotation too high);92=Rotation too high;93=Power contactor current too high;94=AC voltage L2 too high;95=AC frequency L2 too high;96=AC current L2 too high;97=AC power L2 too high;98=AC voltage L3 too high;99=AC frequency L3 too high;100=AC current L3 too high;101=AC power L3 too high;126=Fuel temperature too high;127=Fuel level too high;130=Lost control unit;131=Lost panel;132=Service needed;133=Lost 3-phase module;134=Lost AGT module;135=Synchronization failure;137=Intake airfilter;139=Lost sync. module;140=Load-balance failed;141=Sync-mode deactivated;142=Engine controller;148=Rotating field wrong;149=Fuel level sensor lost;150=Init failed;151=Watchdog;152=Out: winding;153=Out: exhaust;154=Out: Cyl. head;155=Inverter over temperature;156=Inverter overload;157=Inverter communication lost;158=Inverter sync failed;159=CAN communication lost;160=L1 overload;161=L2 overload;162=L3 overload;163=DC overload;164=DC overvoltage;165=Emergency stop;166=No connection,3214,uint16,1,R +com.victronenergy.genset,/AutoStart,u,0=Disabled;1=Enabled,3215,uint16,1,R +com.victronenergy.genset,/Start,u,0=Stop;1=Start,3223,uint16,1,W +com.victronenergy.genset,/Engine/Load,d,%,3216,uint16,1,R +com.victronenergy.genset,/Engine/Speed,d,RPM,3217,uint16,1,R +com.victronenergy.genset,/Engine/OperatingHours,d,s,3218,uint16,0.01,R +com.victronenergy.genset,/Engine/CoolantTemperature,d,Degrees celsius,3219,int16,10,R +com.victronenergy.genset,/Engine/WindingTemperature,d,Degrees celsius,3220,int16,10,R +com.victronenergy.genset,/Engine/ExaustTemperature,d,Degrees celsius,3221,int16,10,R +com.victronenergy.genset,/StarterVoltage,d,V DC,3222,uint16,100,R +com.victronenergy.genset,/Ac/L1/Voltage,d,V AC,3200,uint16,10,R +com.victronenergy.genset,/Ac/L1/Current,d,A AC,3203,int16,10,R +com.victronenergy.genset,/Ac/L1/Power,d,W,3206,int16,1,R +com.victronenergy.genset,/Ac/L1/Frequency,d,Hz,3209,uint16,100,R +com.victronenergy.genset,/Ac/L2/Voltage,d,V AC,3201,uint16,10,R +com.victronenergy.genset,/Ac/L2/Current,d,A AC,3204,int16,10,R +com.victronenergy.genset,/Ac/L2/Power,d,W,3207,int16,1,R +com.victronenergy.genset,/Ac/L2/Frequency,d,Hz,3210,uint16,100,R +com.victronenergy.genset,/Ac/L3/Voltage,d,V AC,3202,uint16,10,R +com.victronenergy.genset,/Ac/L3/Current,d,A AC,3205,int16,10,R +com.victronenergy.genset,/Ac/L3/Power,d,W,3208,int16,1,R +com.victronenergy.genset,/Ac/L3/Frequency,d,Hz,3211,uint16,100,R +com.victronenergy.temperature,/ProductId,u,,3300,uint16,1,R +com.victronenergy.temperature,/Scale,d,,3301,uint16,100,R +com.victronenergy.temperature,/Offset,d,,3302,int16,100,R +com.victronenergy.temperature,/TemperatureType,u,0=Battery;1=Fridge;2=Generic,3303,uint16,1,R +com.victronenergy.temperature,/Temperature,d,Degrees celsius,3304,int16,100,R +com.victronenergy.temperature,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3305,uint16,1,R +com.victronenergy.temperature,/Humidity,u,%,3306,uint16,10,R +com.victronenergy.temperature,/BatteryVoltage,d,V,3307,uint16,100,R +com.victronenergy.temperature,/Pressure,u,hPa,3308,uint16,1,R +com.victronenergy.pulsemeter,/Aggregate,i,,3400,uint32,1,R +com.victronenergy.pulsemeter,/Count,i,,3402,uint32,1,R +com.victronenergy.digitalinput,/Count,i,,3420,uint32,1,R +com.victronenergy.digitalinput,/State,i,,3422,uint16,1,R +com.victronenergy.digitalinput,/Alarm,i,0=No alarm;2=Alarm,3423,uint16,1,R +com.victronenergy.digitalinput,/Type,i,2=Door;3=Bilge pump;4=Bilge alarm;5=Burglar alarm;6=Smoke alarm;7=Fire alarm;8=CO2 alarm,3424,uint16,1,R +com.victronenergy.generator,/ManualStart,i,0=Stop generator;1=Start generator,3500,uint16,1,W +com.victronenergy.generator,/RunningByConditionCode,i,0=Stopped;1=Manual;2=TestRun;3=LossOfComms;4=Soc;5=AcLoad;6=BatteryCurrent;7=BatteryVoltage;8=InverterTemperatur;9=InverterOverload;10=StopOnAc1,3501,uint16,1,R +com.victronenergy.generator,/Runtime,i,seconds,3502,uint16,1,R +com.victronenergy.generator,/QuietHours,i,0=Quiet hours inactive; 1=Quiet hours active,3503,uint16,1,R +com.victronenergy.generator,/Runtime,u,seconds,3504,uint32,1,R +com.victronenergy.generator,/State,i,0=Stopped;1=Running;10=Error,3506,uint16,1,R +com.victronenergy.generator,/Error,i,0=No Error;1=Remote disabled;2=Remote fault,3507,uint16,1,R +com.victronenergy.generator,/Alarms/NoGeneratorAtAcIn,i,0=No Alarm;2=Alarm,3508,uint16,1,R +com.victronenergy.generator,/AutoStartEnabled,i,0=Autostart disabled;1=Autostart enabled,3509,uint16,1,W +com.victronenergy.meteo,/Irradiance,d,W/m^2,3600,uint16,10,R +com.victronenergy.meteo,/WindSpeed,d,m/s,3601,uint16,10,R +com.victronenergy.meteo,/CellTemperature,d,Degrees celsius,3602,int16,10,R +com.victronenergy.meteo,/ExternalTemperature,d,Degrees celsius,3603,int16,10,R +com.victronenergy.evcharger,/ProductId,u,,3800,uint16,1,R +com.victronenergy.evcharger,/FirmwareVersion,u,,3802,uint32,1,R +com.victronenergy.evcharger,/Serial,s,,3804,string[6],,R +com.victronenergy.evcharger,/Model,s,,3810,string[4],,R +com.victronenergy.evcharger,/MaxCurrent,d,A,3814,uint16,1,W +com.victronenergy.evcharger,/Mode,u,0=Manual;1=Auto,3815,uint16,1,W +com.victronenergy.evcharger,/Ac/Energy/Forward,d,kWh,3816,uint32,100,R +com.victronenergy.evcharger,/Ac/L1/Power,d,W,3818,uint16,1,R +com.victronenergy.evcharger,/Ac/L2/Power,d,W,3819,uint16,1,R +com.victronenergy.evcharger,/Ac/L3/Power,d,W,3820,uint16,1,R +com.victronenergy.evcharger,/Ac/Power,d,W,3821,uint16,1,R +com.victronenergy.evcharger,/ChargingTime,d,s,3822,uint16,0.01,R +com.victronenergy.evcharger,/Current,d,A,3823,uint16,1,W +com.victronenergy.evcharger,/Status,u,0=Disconnected; 1=Connected; 2=Charging; 3=Charged; 4=Waiting for sun; 5=Waiting for RFID; 6=Waiting for start; 7=Low SOC; 8=Ground fault; 9=Welded contacts; 10=CP Input shorted; 11=Residual current detected; 12=Under voltage detected; 13=Overvoltage detected; 14=Overheating detected,3824,uint16,1,R +com.victronenergy.evcharger,/SetCurrent,d,A,3825,uint16,1,W +com.victronenergy.evcharger,/StartStop,u,0=Stop;1=Start,3826,uint16,1,W +com.victronenergy.evcharger,/Position,i,0=AC input 1;1=AC output;2=AC input 2,3827,uint16,1,W +com.victronenergy.acload,/Ac/L1/Power,d,W,3900,int16,1,R +com.victronenergy.acload,/Ac/L2/Power,d,W,3901,int16,1,R +com.victronenergy.acload,/Ac/L3/Power,d,W,3902,int16,1,R +com.victronenergy.acload,/Serial,s,,3903,string[7],,R +com.victronenergy.acload,/Ac/L1/Voltage,d,V AC,3910,uint16,10,R +com.victronenergy.acload,/Ac/L1/Current,d,A AC,3911,int16,10,R +com.victronenergy.acload,/Ac/L2/Voltage,d,V AC,3912,uint16,10,R +com.victronenergy.acload,/Ac/L2/Current,d,A AC,3913,int16,10,R +com.victronenergy.acload,/Ac/L3/Voltage,d,V AC,3914,uint16,10,R +com.victronenergy.acload,/Ac/L3/Current,d,A AC,3915,int16,10,R +com.victronenergy.acload,/Ac/L1/Energy/Forward,d,kWh,3916,uint32,100,R +com.victronenergy.acload,/Ac/L2/Energy/Forward,d,kWh,3918,uint32,100,R +com.victronenergy.acload,/Ac/L3/Energy/Forward,d,kWh,3920,uint32,100,R +com.victronenergy.fuelcell,/Dc/0/Voltage,d,V DC,4000,uint16,100,R +com.victronenergy.fuelcell,/Dc/0/Current,d,A DC,4001,int16,10,R +com.victronenergy.fuelcell,/Dc/1/Voltage,d,V DC,4002,int16,10,R +com.victronenergy.fuelcell,/Dc/0/Temperature,d,Degrees celsius,4003,int16,10,R +com.victronenergy.fuelcell,/History/EnergyOut,d,kWh,4004,uint32,100,R +com.victronenergy.fuelcell,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4006,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4007,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4008,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4009,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4010,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4011,uint16,1,R +com.victronenergy.alternator,/Dc/0/Voltage,d,V DC,4100,uint16,100,R +com.victronenergy.alternator,/Dc/0/Current,d,A DC,4101,int16,10,R +com.victronenergy.alternator,/Dc/1/Voltage,d,V DC,4102,int16,10,R +com.victronenergy.alternator,/Dc/0/Temperature,d,Degrees celsius,4103,int16,10,R +com.victronenergy.alternator,/History/EnergyOut,d,kWh,4104,uint32,100,R +com.victronenergy.alternator,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4106,uint16,1,R +com.victronenergy.alternator,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4107,uint16,1,R +com.victronenergy.alternator,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4108,uint16,1,R +com.victronenergy.alternator,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4109,uint16,1,R +com.victronenergy.alternator,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4110,uint16,1,R +com.victronenergy.alternator,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4111,uint16,1,R +com.victronenergy.alternator,/State,u,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;252=External control,4112,uint16,1,R +com.victronenergy.alternator,/ErrorCode,u,12=High battery temperature;13=High battery voltage;14=Low battery voltage;15=VBat exceeds $CPB;21=High alternator temperature;22=Alternator overspeed;24=Internal error;41=High field FET temperature;42=Sensor missing;43=Low VAlt;44=High Voltage offset;45=VAlt exceeds $CPB;51-52=Battery disconnect request;53=Battery instance out of range;54=Too many BMSes;55=AEBus fault;56=Too many Victron devices;58-61=Battery requested disconnection;91=BMS lost;92=Forced idle;201=DCDC converter fail;201-207=DCDC error,4113,uint16,1,R +com.victronenergy.alternator,/Engine/Speed,d,RPM,4114,uint16,1,R +com.victronenergy.alternator,/Speed,d,RPM,4115,uint16,1,R +com.victronenergy.alternator,/FieldDrive,q,%,4116,uint16,1,R +com.victronenergy.dcsource,/Dc/0/Voltage,d,V DC,4200,uint16,100,R +com.victronenergy.dcsource,/Dc/0/Current,d,A DC,4201,int16,10,R +com.victronenergy.dcsource,/Dc/1/Voltage,d,V DC,4202,int16,10,R +com.victronenergy.dcsource,/Dc/0/Temperature,d,Degrees centigrade,4203,int16,10,R +com.victronenergy.dcsource,/History/EnergyOut,d,kWh,4204,uint32,100,R +com.victronenergy.dcsource,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4206,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4207,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4208,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4209,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4210,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4211,uint16,1,R +com.victronenergy.dcload,/Dc/0/Voltage,d,V DC,4300,uint16,100,R +com.victronenergy.dcload,/Dc/0/Current,d,A DC,4301,int16,10,R +com.victronenergy.dcload,/Dc/1/Voltage,d,V DC,4302,int16,10,R +com.victronenergy.dcload,/Dc/0/Temperature,d,Degrees centigrade,4303,int16,10,R +com.victronenergy.dcload,/History/EnergyIn,d,kWh,4304,uint32,100,R +com.victronenergy.dcload,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4306,uint16,1,R +com.victronenergy.dcload,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4307,uint16,1,R +com.victronenergy.dcload,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4308,uint16,1,R +com.victronenergy.dcload,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4309,uint16,1,R +com.victronenergy.dcload,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4310,uint16,1,R +com.victronenergy.dcload,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4311,uint16,1,R +com.victronenergy.dcsystem,/Dc/0/Voltage,d,V DC,4400,uint16,100,R +com.victronenergy.dcsystem,/Dc/0/Current,d,A DC,4401,int16,10,R +com.victronenergy.dcsystem,/Dc/1/Voltage,d,V DC,4402,int16,10,R +com.victronenergy.dcsystem,/Dc/0/Temperature,d,Degrees centigrade,4403,int16,10,R +com.victronenergy.dcsystem,/History/EnergyOut,d,kWh,4404,uint32,100,R +com.victronenergy.dcsystem,/History/EnergyIn,d,kWh,4406,uint32,100,R +com.victronenergy.dcsystem,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4408,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4409,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4410,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4411,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4412,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4413,uint16,1,R +com.victronenergy.multi,/Ac/In/1/L1/V,d,V AC,4500,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/V,d,V AC,4501,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/V,d,V AC,4502,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/I,d,A AC,4503,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/I,d,A AC,4504,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/I,d,A AC,4505,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/P,d,W,4506,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L2/P,d,W,4507,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L3/P,d,W,4508,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L1/F,d,Hz,4509,uint16,100,R +com.victronenergy.multi,/Ac/Out/L1/V,d,V AC,4510,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/V,d,V AC,4511,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/V,d,V AC,4512,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/I,d,A AC,4513,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/I,d,A AC,4514,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/I,d,A AC,4515,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/P,d,W,4516,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L2/P,d,W,4517,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L3/P,d,W,4518,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L1/F,d,Hz,4519,uint16,100,R +com.victronenergy.multi,/Ac/In/1/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4520,uint16,1,R +com.victronenergy.multi,/Ac/In/2/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4521,uint16,1,R +com.victronenergy.multi,/Ac/In/1/CurrentLimit,d,A,4522,uint16,10,W +com.victronenergy.multi,/Ac/In/2/CurrentLimit,d,A,4523,uint16,10,W +com.victronenergy.multi,/Ac/NumberOfPhases,u,count,4524,uint16,1,R +com.victronenergy.multi,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,4525,uint16,1,R +com.victronenergy.multi,/Dc/0/Voltage,d,V DC,4526,uint16,100,R +com.victronenergy.multi,/Dc/0/Current,d,A DC,4527,int16,10,R +com.victronenergy.multi,/Dc/0/Temperature,d,Degrees celsius,4528,int16,10,R +com.victronenergy.multi,/Soc,d,%,4529,uint16,10,R +com.victronenergy.multi,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=Bulk protection,4530,uint16,1,R +com.victronenergy.multi,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,4531,uint16,1,W +com.victronenergy.multi,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,4532,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltage,u,0=Ok;1=Warning;2=Alarm,4533,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4534,uint16,1,R +com.victronenergy.multi,/Alarms/LowTemperature,u,0=Ok;1=Warning;2=Alarm,4535,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltage,u,0=Ok;1=Warning;2=Alarm,4536,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4537,uint16,1,R +com.victronenergy.multi,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,4538,uint16,1,R +com.victronenergy.multi,/Alarms/Ripple,u,0=Ok;1=Warning;2=Alarm,4539,uint16,1,R +com.victronenergy.multi,/Yield/Power,d,W,4540,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4541,uint16,10,R +com.victronenergy.multi,/Relay/0/State,i,0=Open;1=Closed,4542,uint16,1,R +com.victronenergy.multi,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4543,uint16,1,R +com.victronenergy.multi,/Pv/V,d,V DC,4544,uint16,10,R +com.victronenergy.multi,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,4545,uint16,1,R +com.victronenergy.multi,/Energy/AcIn1ToAcOut,d,kWh,4546,uint32,100,R +com.victronenergy.multi,/Energy/AcIn1ToInverter,d,kWh,4548,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToAcOut,d,kWh,4550,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToInverter,d,kWh,4552,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn1,d,kWh,4554,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn2,d,kWh,4556,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn1,d,kWh,4558,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn2,d,kWh,4560,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcOut,d,kWh,4562,uint32,100,R +com.victronenergy.multi,/Energy/OutToInverter,d,kWh,4564,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn1,d,kWh,4566,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn2,d,kWh,4568,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcOut,d,kWh,4570,uint32,100,R +com.victronenergy.multi,/Energy/SolarToBattery,d,kWh,4572,uint32,100,R +com.victronenergy.multi,/History/Daily/0/Yield,d,kWh,4574,uint16,10,R +com.victronenergy.multi,/History/Daily/0/MaxPower,d,W,4575,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Yield,d,kWh,4576,uint16,10,R +com.victronenergy.multi,/History/Daily/1/MaxPower,d,W,4577,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/0/Yield,d,kWh,4578,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/1/Yield,d,kWh,4579,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/2/Yield,d,kWh,4580,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/3/Yield,d,kWh,4581,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/0/Yield,d,kWh,4582,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/1/Yield,d,kWh,4583,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/2/Yield,d,kWh,4584,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/3/Yield,d,kWh,4585,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/0/MaxPower,d,W,4586,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/1/MaxPower,d,W,4587,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/2/MaxPower,d,W,4588,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/3/MaxPower,d,W,4589,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/0/MaxPower,d,W,4590,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/1/MaxPower,d,W,4591,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/2/MaxPower,d,W,4592,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/3/MaxPower,d,W,4593,uint16,1,R +com.victronenergy.multi,/Pv/0/V,d,V DC,4594,uint16,10,R +com.victronenergy.multi,/Pv/1/V,d,V DC,4595,uint16,10,R +com.victronenergy.multi,/Pv/2/V,d,V DC,4596,uint16,10,R +com.victronenergy.multi,/Pv/3/V,d,V DC,4597,uint16,10,R +com.victronenergy.multi,/Pv/0/P,d,W,4598,uint16,1,R +com.victronenergy.multi,/Pv/1/P,d,W,4599,uint16,1,R +com.victronenergy.multi,/Pv/2/P,d,W,4600,uint16,1,R +com.victronenergy.multi,/Pv/3/P,d,W,4601,uint16,1,R +com.victronenergy.multi,/Alarms/LowSoc,u,,4602,uint16,1,R diff --git a/FileSets/v2.94/dbus_digitalinputs.py b/FileSets/v2.94/dbus_digitalinputs.py new file mode 100755 index 00000000..82fcc208 --- /dev/null +++ b/FileSets/v2.94/dbus_digitalinputs.py @@ -0,0 +1,562 @@ +#!/usr/bin/python3 -u + +#### modified for ExtTransferSwitch package + +import sys, os +import signal +from threading import Thread +from select import select, epoll, EPOLLPRI +from functools import partial +from collections import namedtuple +from argparse import ArgumentParser +import traceback +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) + +from dbus.mainloop.glib import DBusGMainLoop +import dbus +from gi.repository import GLib +from vedbus import VeDbusService +from settingsdevice import SettingsDevice + +VERSION = '0.17' +MAXCOUNT = 2**31-1 +SAVEINTERVAL = 60000 + +INPUT_FUNCTION_COUNTER = 1 +INPUT_FUNCTION_INPUT = 2 + +Translation = namedtuple('Translation', ['no', 'yes']) + +# Only append at the end +INPUTTYPES = [ + 'Disabled', + 'Pulse meter', + 'Door', + 'Bilge pump', + 'Bilge alarm', + 'Burglar alarm', + 'Smoke alarm', + 'Fire alarm', + 'CO2 alarm', + 'Generator', + 'Generic I/O', +#### added for ExtTransferSwitch package -- must be LAST in the list + 'Transfer switch' +] + +# Translations. The text will be used only for GetText, it will be translated +# in the gui. +TRANSLATIONS = [ + Translation('low', 'high'), + Translation('off', 'on'), + Translation('no', 'yes'), + Translation('open', 'closed'), + Translation('ok', 'alarm'), + Translation('running', 'stopped'), +#### added for ExtTransferSwitch package + Translation('on generator', 'on grid'), +] + +class SystemBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SYSTEM) + +class SessionBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SESSION) + +class BasePulseCounter(object): + pass + +class DebugPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + self.gpiomap[gpio] = None + return 0 + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + for level in cycle([0, 1]): + for gpio in list(self.gpiomap.keys()): + yield gpio, level + sleep(0.25/len(self.gpiomap)) + +class EpollPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + self.states = {} + self.ob = epoll() + + def register(self, path, gpio): + path = os.path.realpath(path) + + # Set up gpio for rising edge interrupts + with open(os.path.join(path, 'edge'), 'ab') as fp: + fp.write(b'both') + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) # flush it in case it's high at startup + self.gpiomap[gpio] = fp + self.states[gpio] = level + self.ob.register(fp, EPOLLPRI) + return level + + def unregister(self, gpio): + fp = self.gpiomap[gpio] + self.ob.unregister(fp) + del self.gpiomap[gpio] + del self.states[gpio] + fp.close() + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + while True: + # We have a timeout of 1 second on the poll, because poll() only + # looks at files in the epoll object at the time poll() was called. + # The timeout means we let other files (added via calls to + # register/unregister) into the loop at least that often. + self.ob.poll(1) + + # When coming out of the epoll call, we read all the gpios to make + # sure we didn't miss any edges. This is a safety fallback that + # ensures everything is up to date once a second, but + # edge-triggered results are handled immediately. + # NOTE: There has not been a report of a missed interrupt yet. + # Belts and suspenders. + for gpio, fp in list(self.gpiomap.items()): + os.lseek(fp.fileno(), 0, os.SEEK_SET) + v = int(os.read(fp.fileno(), 1)) + if v != self.states[gpio]: + self.states[gpio] = v + yield gpio, v + +class PollingPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + path = os.path.realpath(path) + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) + self.gpiomap[gpio] = [fp, level] + return level + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + while True: + for gpio, (fp, level) in list(self.gpiomap.items()): + fp.seek(0, os.SEEK_SET) + v = int(fp.read()) + if v != level: + self.gpiomap[gpio][1] = v + yield gpio, v + sleep(1) + +class HandlerMaker(type): + """ Meta-class for keeping track of all extended classes. """ + def __init__(cls, name, bases, attrs): + if not hasattr(cls, 'handlers'): + cls.handlers = {} + else: + cls.handlers[cls.type_id] = cls + +class PinHandler(object, metaclass=HandlerMaker): + product_id = 0xFFFF + _product_name = 'Generic GPIO' + dbus_name = "digital" + def __init__(self, bus, base, path, gpio, settings): + self.gpio = gpio + self.path = path + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + self.service = VeDbusService( + "{}.{}.input{:02d}".format(base, self.dbus_name, gpio), bus=bus) + + # Add objects required by ve-api + self.service.add_path('/Mgmt/ProcessName', __file__) + self.service.add_path('/Mgmt/ProcessVersion', VERSION) + self.service.add_path('/Mgmt/Connection', path) + self.service.add_path('/DeviceInstance', gpio) + self.service.add_path('/ProductId', self.product_id) + self.service.add_path('/ProductName', self.product_name) + self.service.add_path('/Connected', 1) + + # Custom name setting + def _change_name(p, v): + # This should fire a change event that will update product_name + # below. + settings['name'] = v + return True + + self.service.add_path('/CustomName', settings['name'], writeable=True, + onchangecallback=_change_name) + + # We'll count the pulses for all types of services + self.service.add_path('/Count', value=settings['count']) + + @property + def product_name(self): + return self.settings['name'] or self._product_name + + @product_name.setter + def product_name(self, v): + # Some pin types don't have an associated service (Disabled pins for + # example) + if self.service is not None: + self.service['/ProductName'] = v or self._product_name + + def deactivate(self): + self.save_count() + self.service.__del__() + del self.service + self.service = None + + @property + def level(self): + return self._level + + @level.setter + def level(self, l): + self._level = int(bool(l)) + + def toggle(self, level): + raise NotImplementedError + + def _toggle(self, level, service): + # Only increment Count on rising edge. + if level and level != self._level: + service['/Count'] = (service['/Count']+1) % MAXCOUNT + self._level = level + + def refresh(self): + """ Toggle state to last remembered state. This is called if settings + are changed so the Service can recalculate paths. """ + self.toggle(self._level) + + def save_count(self): + if self.service is not None: + self.settings['count'] = self.count + + @property + def active(self): + return self.service is not None + + @property + def count(self): + return self.service['/Count'] + + @count.setter + def count(self, v): + self.service['/Count'] = v + + @classmethod + def createHandler(cls, _type, *args, **kwargs): + if _type in cls.handlers: + return cls.handlers[_type](*args, **kwargs) + return None + + +class DisabledPin(PinHandler): + """ Place holder for a disabled pin. """ + _product_name = 'Disabled' + type_id = 0 + def __init__(self, bus, base, path, gpio, settings): + self.service = None + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + def deactivate(self): + pass + + def toggle(self, level): + self._level = level + + def save_count(self): + # Do nothing + pass + + @property + def count(self): + return self.settings['count'] + + @count.setter + def count(self, v): + pass + + def refresh(self): + pass + + +class VolumeCounter(PinHandler): + product_id = 0xA165 + _product_name = "Generic pulse meter" + dbus_name = "pulsemeter" + type_id = 1 + + def __init__(self, bus, base, path, gpio, settings): + super(VolumeCounter, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/Aggregate', value=self.count*self.rate, + gettextcallback=lambda p, v: (str(v) + ' cubic meter')) + + @property + def rate(self): + return self.settings['rate'] + + def toggle(self, level): + with self.service as s: + super(VolumeCounter, self)._toggle(level, s) + s['/Aggregate'] = self.count * self.rate + +class PinAlarm(PinHandler): + product_id = 0xA166 + _product_name = "Generic digital input" + dbus_name = "digitalinput" + type_id = 0xFF + translation = 0 # low, high + + def __init__(self, bus, base, path, gpio, settings): + super(PinAlarm, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/InputState', value=0) + self.service.add_path('/State', value=self.get_state(0), + gettextcallback=lambda p, v: TRANSLATIONS[v//2][v%2]) + self.service.add_path('/Alarm', value=self.get_alarm_state(0)) + + # Also expose the type + self.service.add_path('/Type', value=self.type_id, + gettextcallback=lambda p, v: INPUTTYPES[v]) + + def toggle(self, level): + with self.service as s: + super(PinAlarm, self)._toggle(level, s) + s['/InputState'] = bool(level)*1 + s['/State'] = self.get_state(level) + # Ensure that the alarm flag resets if the /AlarmSetting config option + # disappears. + s['/Alarm'] = self.get_alarm_state(level) + + def get_state(self, level): + state = level ^ self.settings['invert'] + return 2 * self.translation + state + + def get_alarm_state(self, level): + return 2 * bool( + (level ^ self.settings['invertalarm']) and self.settings['alarm']) + + +# Various types of things we might want to monitor +class DoorSensor(PinAlarm): + _product_name = "Door alarm" + type_id = 2 + translation = 3 # open, closed + +class BilgePump(PinAlarm): + _product_name = "Bilge pump" + type_id = 3 + translation = 1 # off, on + +class BilgeAlarm(PinAlarm): + _product_name = "Bilge alarm" + type_id = 4 + translation = 4 # ok, alarm + +class BurglarAlarm(PinAlarm): + _product_name = "Burglar alarm" + type_id = 5 + translation = 4 # ok, alarm + +class SmokeAlarm(PinAlarm): + _product_name = "Smoke alarm" + type_id = 6 + translation = 4 # ok, alarm + +class FireAlarm(PinAlarm): + _product_name = "Fire alarm" + type_id = 7 + translation = 4 # ok, alarm + +class CO2Alarm(PinAlarm): + _product_name = "CO2 alarm" + type_id = 8 + translation = 4 # ok, alarm + +class Generator(PinAlarm): + _product_name = "Generator" + type_id = 9 + translation = 5 # running, stopped + +class GenericIO(PinAlarm): + _product_name = "Generic I/O" + type_id = 10 + translation = 0 # low, high + +#### added for ExtTransferSwitch package +class TransferSwitch(PinAlarm): + _product_name = "External AC Input transfer switch" + type_id = 11 + translation = 6 # Grid In / Generator In + + +def dbusconnection(): + return SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else SystemBus() + + +def main(): + parser = ArgumentParser(description=sys.argv[0]) + parser.add_argument('--servicebase', + help='Base service name on dbus, default is com.victronenergy', + default='com.victronenergy') + parser.add_argument('--poll', + help='Use a different kind of polling. Options are epoll, dumb and debug', + default='epoll') + parser.add_argument('inputs', nargs='+', help='Path to digital input') + args = parser.parse_args() + + PulseCounter = { + 'debug': DebugPulseCounter, + 'poll': PollingPulseCounter, + }.get(args.poll, EpollPulseCounter) + + DBusGMainLoop(set_as_default=True) + + # Keep track of enabled services + services = {} + inputs = dict(enumerate(args.inputs, 1)) + pulses = PulseCounter() # callable that iterates over pulses + + def register_gpio(path, gpio, bus, settings): + _type = settings['inputtype'] + print ("Registering GPIO {} for type {}".format(gpio, _type)) + + handler = PinHandler.createHandler(_type, + bus, args.servicebase, path, gpio, settings) + services[gpio] = handler + + # Only monitor if enabled + if _type > 0: + handler.level = pulses.register(path, gpio) + handler.refresh() + + def unregister_gpio(gpio): + print ("unRegistering GPIO {}".format(gpio)) + pulses.unregister(gpio) + services[gpio].deactivate() + + def handle_setting_change(inp, setting, old, new): + # This handler may also be called if some attribute of a setting + # is changed, but not the value. Bail if the value is unchanged. + if old == new: + return + + if setting == 'inputtype': + if new: + # Get current bus and settings objects, to be reused + service = services[inp] + bus, settings = service.bus, service.settings + + # Input enabled. If already enabled, unregister the old one first. + if pulses.registered(inp): + unregister_gpio(inp) + + # Before registering the new input, reset its settings to defaults + settings['count'] = 0 + settings['invert'] = 0 + settings['invertalarm'] = 0 + settings['alarm'] = 0 + + # Register it + register_gpio(inputs[inp], inp, bus, settings) + elif old: + # Input disabled + unregister_gpio(inp) + elif setting in ('rate', 'invert', 'alarm', 'invertalarm'): + services[inp].refresh() + elif setting == 'name': + services[inp].product_name = new + elif setting == 'count': + # Don't want this triggered on a period save, so only execute + # if it has changed. + v = int(new) + s = services[inp] + if s.count != v: + s.count = v + s.refresh() + + for inp, pth in inputs.items(): + supported_settings = { + 'inputtype': ['/Settings/DigitalInput/{}/Type'.format(inp), 0, 0, len(INPUTTYPES)], + 'rate': ['/Settings/DigitalInput/{}/Multiplier'.format(inp), 0.001, 0, 1.0], + 'count': ['/Settings/DigitalInput/{}/Count'.format(inp), 0, 0, MAXCOUNT, 1], + 'invert': ['/Settings/DigitalInput/{}/InvertTranslation'.format(inp), 0, 0, 1], + 'invertalarm': ['/Settings/DigitalInput/{}/InvertAlarm'.format(inp), 0, 0, 1], + 'alarm': ['/Settings/DigitalInput/{}/AlarmSetting'.format(inp), 0, 0, 1], + 'name': ['/Settings/DigitalInput/{}/CustomName'.format(inp), '', '', ''], + } + bus = dbusconnection() + sd = SettingsDevice(bus, supported_settings, partial(handle_setting_change, inp), timeout=10) + register_gpio(pth, inp, bus, sd) + + def poll(mainloop): + from time import time + idx = 0 + + try: + for inp, level in pulses(): + # epoll object only resyncs once a second. We may receive + # a pulse for something that's been deregistered. + try: + services[inp].toggle(level) + except KeyError: + continue + except: + traceback.print_exc() + mainloop.quit() + + # Need to run the gpio polling in separate thread. Pass in the mainloop so + # the thread can kill us if there is an exception. + mainloop = GLib.MainLoop() + + poller = Thread(target=lambda: poll(mainloop)) + poller.daemon = True + poller.start() + + # Periodically save the counter + def save_counters(): + for inp in inputs: + services[inp].save_count() + return True + GLib.timeout_add(SAVEINTERVAL, save_counters) + + # Save counter on shutdown + signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) + + try: + mainloop.run() + except KeyboardInterrupt: + pass + finally: + save_counters() + +if __name__ == "__main__": + main() diff --git a/FileSets/v2.94/dbus_digitalinputs.py.orig b/FileSets/v2.94/dbus_digitalinputs.py.orig new file mode 100755 index 00000000..a251e4e5 --- /dev/null +++ b/FileSets/v2.94/dbus_digitalinputs.py.orig @@ -0,0 +1,550 @@ +#!/usr/bin/python3 -u + +import sys, os +import signal +from threading import Thread +from select import select, epoll, EPOLLPRI +from functools import partial +from collections import namedtuple +from argparse import ArgumentParser +import traceback +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) + +from dbus.mainloop.glib import DBusGMainLoop +import dbus +from gi.repository import GLib +from vedbus import VeDbusService +from settingsdevice import SettingsDevice + +VERSION = '0.17' +MAXCOUNT = 2**31-1 +SAVEINTERVAL = 60000 + +INPUT_FUNCTION_COUNTER = 1 +INPUT_FUNCTION_INPUT = 2 + +Translation = namedtuple('Translation', ['no', 'yes']) + +# Only append at the end +INPUTTYPES = [ + 'Disabled', + 'Pulse meter', + 'Door', + 'Bilge pump', + 'Bilge alarm', + 'Burglar alarm', + 'Smoke alarm', + 'Fire alarm', + 'CO2 alarm', + 'Generator', + 'Generic I/O' +] + +# Translations. The text will be used only for GetText, it will be translated +# in the gui. +TRANSLATIONS = [ + Translation('low', 'high'), + Translation('off', 'on'), + Translation('no', 'yes'), + Translation('open', 'closed'), + Translation('ok', 'alarm'), + Translation('running', 'stopped') +] + +class SystemBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SYSTEM) + +class SessionBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SESSION) + +class BasePulseCounter(object): + pass + +class DebugPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + self.gpiomap[gpio] = None + return 0 + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + for level in cycle([0, 1]): + for gpio in list(self.gpiomap.keys()): + yield gpio, level + sleep(0.25/len(self.gpiomap)) + +class EpollPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + self.states = {} + self.ob = epoll() + + def register(self, path, gpio): + path = os.path.realpath(path) + + # Set up gpio for rising edge interrupts + with open(os.path.join(path, 'edge'), 'ab') as fp: + fp.write(b'both') + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) # flush it in case it's high at startup + self.gpiomap[gpio] = fp + self.states[gpio] = level + self.ob.register(fp, EPOLLPRI) + return level + + def unregister(self, gpio): + fp = self.gpiomap[gpio] + self.ob.unregister(fp) + del self.gpiomap[gpio] + del self.states[gpio] + fp.close() + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + while True: + # We have a timeout of 1 second on the poll, because poll() only + # looks at files in the epoll object at the time poll() was called. + # The timeout means we let other files (added via calls to + # register/unregister) into the loop at least that often. + self.ob.poll(1) + + # When coming out of the epoll call, we read all the gpios to make + # sure we didn't miss any edges. This is a safety fallback that + # ensures everything is up to date once a second, but + # edge-triggered results are handled immediately. + # NOTE: There has not been a report of a missed interrupt yet. + # Belts and suspenders. + for gpio, fp in list(self.gpiomap.items()): + os.lseek(fp.fileno(), 0, os.SEEK_SET) + v = int(os.read(fp.fileno(), 1)) + if v != self.states[gpio]: + self.states[gpio] = v + yield gpio, v + +class PollingPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + path = os.path.realpath(path) + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) + self.gpiomap[gpio] = [fp, level] + return level + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + while True: + for gpio, (fp, level) in list(self.gpiomap.items()): + fp.seek(0, os.SEEK_SET) + v = int(fp.read()) + if v != level: + self.gpiomap[gpio][1] = v + yield gpio, v + sleep(1) + +class HandlerMaker(type): + """ Meta-class for keeping track of all extended classes. """ + def __init__(cls, name, bases, attrs): + if not hasattr(cls, 'handlers'): + cls.handlers = {} + else: + cls.handlers[cls.type_id] = cls + +class PinHandler(object, metaclass=HandlerMaker): + product_id = 0xFFFF + _product_name = 'Generic GPIO' + dbus_name = "digital" + def __init__(self, bus, base, path, gpio, settings): + self.gpio = gpio + self.path = path + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + self.service = VeDbusService( + "{}.{}.input{:02d}".format(base, self.dbus_name, gpio), bus=bus) + + # Add objects required by ve-api + self.service.add_path('/Mgmt/ProcessName', __file__) + self.service.add_path('/Mgmt/ProcessVersion', VERSION) + self.service.add_path('/Mgmt/Connection', path) + self.service.add_path('/DeviceInstance', gpio) + self.service.add_path('/ProductId', self.product_id) + self.service.add_path('/ProductName', self.product_name) + self.service.add_path('/Connected', 1) + + # Custom name setting + def _change_name(p, v): + # This should fire a change event that will update product_name + # below. + settings['name'] = v + return True + + self.service.add_path('/CustomName', settings['name'], writeable=True, + onchangecallback=_change_name) + + # We'll count the pulses for all types of services + self.service.add_path('/Count', value=settings['count']) + + @property + def product_name(self): + return self.settings['name'] or self._product_name + + @product_name.setter + def product_name(self, v): + # Some pin types don't have an associated service (Disabled pins for + # example) + if self.service is not None: + self.service['/ProductName'] = v or self._product_name + + def deactivate(self): + self.save_count() + self.service.__del__() + del self.service + self.service = None + + @property + def level(self): + return self._level + + @level.setter + def level(self, l): + self._level = int(bool(l)) + + def toggle(self, level): + raise NotImplementedError + + def _toggle(self, level, service): + # Only increment Count on rising edge. + if level and level != self._level: + service['/Count'] = (service['/Count']+1) % MAXCOUNT + self._level = level + + def refresh(self): + """ Toggle state to last remembered state. This is called if settings + are changed so the Service can recalculate paths. """ + self.toggle(self._level) + + def save_count(self): + if self.service is not None: + self.settings['count'] = self.count + + @property + def active(self): + return self.service is not None + + @property + def count(self): + return self.service['/Count'] + + @count.setter + def count(self, v): + self.service['/Count'] = v + + @classmethod + def createHandler(cls, _type, *args, **kwargs): + if _type in cls.handlers: + return cls.handlers[_type](*args, **kwargs) + return None + + +class DisabledPin(PinHandler): + """ Place holder for a disabled pin. """ + _product_name = 'Disabled' + type_id = 0 + def __init__(self, bus, base, path, gpio, settings): + self.service = None + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + def deactivate(self): + pass + + def toggle(self, level): + self._level = level + + def save_count(self): + # Do nothing + pass + + @property + def count(self): + return self.settings['count'] + + @count.setter + def count(self, v): + pass + + def refresh(self): + pass + + +class VolumeCounter(PinHandler): + product_id = 0xA165 + _product_name = "Generic pulse meter" + dbus_name = "pulsemeter" + type_id = 1 + + def __init__(self, bus, base, path, gpio, settings): + super(VolumeCounter, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/Aggregate', value=self.count*self.rate, + gettextcallback=lambda p, v: (str(v) + ' cubic meter')) + + @property + def rate(self): + return self.settings['rate'] + + def toggle(self, level): + with self.service as s: + super(VolumeCounter, self)._toggle(level, s) + s['/Aggregate'] = self.count * self.rate + +class PinAlarm(PinHandler): + product_id = 0xA166 + _product_name = "Generic digital input" + dbus_name = "digitalinput" + type_id = 0xFF + translation = 0 # low, high + + def __init__(self, bus, base, path, gpio, settings): + super(PinAlarm, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/InputState', value=0) + self.service.add_path('/State', value=self.get_state(0), + gettextcallback=lambda p, v: TRANSLATIONS[v//2][v%2]) + self.service.add_path('/Alarm', value=self.get_alarm_state(0)) + + # Also expose the type + self.service.add_path('/Type', value=self.type_id, + gettextcallback=lambda p, v: INPUTTYPES[v]) + + def toggle(self, level): + with self.service as s: + super(PinAlarm, self)._toggle(level, s) + s['/InputState'] = bool(level)*1 + s['/State'] = self.get_state(level) + # Ensure that the alarm flag resets if the /AlarmSetting config option + # disappears. + s['/Alarm'] = self.get_alarm_state(level) + + def get_state(self, level): + state = level ^ self.settings['invert'] + return 2 * self.translation + state + + def get_alarm_state(self, level): + return 2 * bool( + (level ^ self.settings['invertalarm']) and self.settings['alarm']) + + +# Various types of things we might want to monitor +class DoorSensor(PinAlarm): + _product_name = "Door alarm" + type_id = 2 + translation = 3 # open, closed + +class BilgePump(PinAlarm): + _product_name = "Bilge pump" + type_id = 3 + translation = 1 # off, on + +class BilgeAlarm(PinAlarm): + _product_name = "Bilge alarm" + type_id = 4 + translation = 4 # ok, alarm + +class BurglarAlarm(PinAlarm): + _product_name = "Burglar alarm" + type_id = 5 + translation = 4 # ok, alarm + +class SmokeAlarm(PinAlarm): + _product_name = "Smoke alarm" + type_id = 6 + translation = 4 # ok, alarm + +class FireAlarm(PinAlarm): + _product_name = "Fire alarm" + type_id = 7 + translation = 4 # ok, alarm + +class CO2Alarm(PinAlarm): + _product_name = "CO2 alarm" + type_id = 8 + translation = 4 # ok, alarm + +class Generator(PinAlarm): + _product_name = "Generator" + type_id = 9 + translation = 5 # running, stopped + +class GenericIO(PinAlarm): + _product_name = "Generic I/O" + type_id = 10 + translation = 0 # low, high + + +def dbusconnection(): + return SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else SystemBus() + + +def main(): + parser = ArgumentParser(description=sys.argv[0]) + parser.add_argument('--servicebase', + help='Base service name on dbus, default is com.victronenergy', + default='com.victronenergy') + parser.add_argument('--poll', + help='Use a different kind of polling. Options are epoll, dumb and debug', + default='epoll') + parser.add_argument('inputs', nargs='+', help='Path to digital input') + args = parser.parse_args() + + PulseCounter = { + 'debug': DebugPulseCounter, + 'poll': PollingPulseCounter, + }.get(args.poll, EpollPulseCounter) + + DBusGMainLoop(set_as_default=True) + + # Keep track of enabled services + services = {} + inputs = dict(enumerate(args.inputs, 1)) + pulses = PulseCounter() # callable that iterates over pulses + + def register_gpio(path, gpio, bus, settings): + _type = settings['inputtype'] + print ("Registering GPIO {} for type {}".format(gpio, _type)) + + handler = PinHandler.createHandler(_type, + bus, args.servicebase, path, gpio, settings) + services[gpio] = handler + + # Only monitor if enabled + if _type > 0: + handler.level = pulses.register(path, gpio) + handler.refresh() + + def unregister_gpio(gpio): + print ("unRegistering GPIO {}".format(gpio)) + pulses.unregister(gpio) + services[gpio].deactivate() + + def handle_setting_change(inp, setting, old, new): + # This handler may also be called if some attribute of a setting + # is changed, but not the value. Bail if the value is unchanged. + if old == new: + return + + if setting == 'inputtype': + if new: + # Get current bus and settings objects, to be reused + service = services[inp] + bus, settings = service.bus, service.settings + + # Input enabled. If already enabled, unregister the old one first. + if pulses.registered(inp): + unregister_gpio(inp) + + # Before registering the new input, reset its settings to defaults + settings['count'] = 0 + settings['invert'] = 0 + settings['invertalarm'] = 0 + settings['alarm'] = 0 + + # Register it + register_gpio(inputs[inp], inp, bus, settings) + elif old: + # Input disabled + unregister_gpio(inp) + elif setting in ('rate', 'invert', 'alarm', 'invertalarm'): + services[inp].refresh() + elif setting == 'name': + services[inp].product_name = new + elif setting == 'count': + # Don't want this triggered on a period save, so only execute + # if it has changed. + v = int(new) + s = services[inp] + if s.count != v: + s.count = v + s.refresh() + + for inp, pth in inputs.items(): + supported_settings = { + 'inputtype': ['/Settings/DigitalInput/{}/Type'.format(inp), 0, 0, len(INPUTTYPES)], + 'rate': ['/Settings/DigitalInput/{}/Multiplier'.format(inp), 0.001, 0, 1.0], + 'count': ['/Settings/DigitalInput/{}/Count'.format(inp), 0, 0, MAXCOUNT, 1], + 'invert': ['/Settings/DigitalInput/{}/InvertTranslation'.format(inp), 0, 0, 1], + 'invertalarm': ['/Settings/DigitalInput/{}/InvertAlarm'.format(inp), 0, 0, 1], + 'alarm': ['/Settings/DigitalInput/{}/AlarmSetting'.format(inp), 0, 0, 1], + 'name': ['/Settings/DigitalInput/{}/CustomName'.format(inp), '', '', ''], + } + bus = dbusconnection() + sd = SettingsDevice(bus, supported_settings, partial(handle_setting_change, inp), timeout=10) + register_gpio(pth, inp, bus, sd) + + def poll(mainloop): + from time import time + idx = 0 + + try: + for inp, level in pulses(): + # epoll object only resyncs once a second. We may receive + # a pulse for something that's been deregistered. + try: + services[inp].toggle(level) + except KeyError: + continue + except: + traceback.print_exc() + mainloop.quit() + + # Need to run the gpio polling in separate thread. Pass in the mainloop so + # the thread can kill us if there is an exception. + mainloop = GLib.MainLoop() + + poller = Thread(target=lambda: poll(mainloop)) + poller.daemon = True + poller.start() + + # Periodically save the counter + def save_counters(): + for inp in inputs: + services[inp].save_count() + return True + GLib.timeout_add(SAVEINTERVAL, save_counters) + + # Save counter on shutdown + signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) + + try: + mainloop.run() + except KeyboardInterrupt: + pass + finally: + save_counters() + +if __name__ == "__main__": + main() diff --git a/FileSets/v2.94/styles.css b/FileSets/v2.94/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v2.94/styles.css +++ b/FileSets/v2.94/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.00/MbEditBox.qml b/FileSets/v3.00/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.00/MbEditBox.qml +++ b/FileSets/v3.00/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.00/MbEditBoxDateTime.qml b/FileSets/v3.00/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.00/MbEditBoxDateTime.qml +++ b/FileSets/v3.00/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.00/MbItem.qml b/FileSets/v3.00/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.00/MbItem.qml +++ b/FileSets/v3.00/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.00/MbItemDigitalInput.qml b/FileSets/v3.00/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.00/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.00/MbSpinBox.qml b/FileSets/v3.00/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.00/MbSpinBox.qml +++ b/FileSets/v3.00/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.00/MbStyle.qml b/FileSets/v3.00/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.00/MbStyle.qml +++ b/FileSets/v3.00/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.00/MbSubMenu.qml b/FileSets/v3.00/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.00/MbSubMenu.qml +++ b/FileSets/v3.00/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.00/Multi.qml b/FileSets/v3.00/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.00/Multi.qml +++ b/FileSets/v3.00/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.00/OverviewBox.qml b/FileSets/v3.00/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.00/OverviewBox.qml +++ b/FileSets/v3.00/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.00/OverviewConnection.qml b/FileSets/v3.00/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.00/OverviewConnection.qml +++ b/FileSets/v3.00/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.00/OverviewConnectionEnd.qml b/FileSets/v3.00/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.00/OverviewConnectionEnd.qml +++ b/FileSets/v3.00/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.00/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.00/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.00/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.00/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.00/OverviewMobileEnhanced.qml b/FileSets/v3.00/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.00/OverviewMobileEnhanced.qml +++ b/FileSets/v3.00/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.00/OverviewSolarCharger.qml b/FileSets/v3.00/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.00/OverviewSolarCharger.qml +++ b/FileSets/v3.00/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.00/OverviewSolarInverter.qml b/FileSets/v3.00/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.00/OverviewSolarInverter.qml +++ b/FileSets/v3.00/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.00/OverviewTankDelegate.qml b/FileSets/v3.00/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.00/OverviewTankDelegate.qml +++ b/FileSets/v3.00/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.00/OverviewTanks.qml b/FileSets/v3.00/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.00/OverviewTanks.qml +++ b/FileSets/v3.00/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.00/OverviewTanksTempsDigInputs.qml b/FileSets/v3.00/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.00/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.00/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.00/PageDigitalInput.qml b/FileSets/v3.00/PageDigitalInput.qml new file mode 120000 index 00000000..3ebafb06 --- /dev/null +++ b/FileSets/v3.00/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.01/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.00/PageSettingsRelay.qml b/FileSets/v3.00/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.00/PageSettingsRelay.qml +++ b/FileSets/v3.00/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.00/Tile.qml b/FileSets/v3.00/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.00/Tile.qml +++ b/FileSets/v3.00/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.00/TileRelay.qml b/FileSets/v3.00/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.00/TileRelay.qml +++ b/FileSets/v3.00/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.00/TileText.qml b/FileSets/v3.00/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.00/TileText.qml +++ b/FileSets/v3.00/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.00/attributes.csv b/FileSets/v3.00/attributes.csv new file mode 120000 index 00000000..151259cd --- /dev/null +++ b/FileSets/v3.00/attributes.csv @@ -0,0 +1 @@ +../v3.01/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.00/dbus_digitalinputs.py b/FileSets/v3.00/dbus_digitalinputs.py new file mode 120000 index 00000000..25f64663 --- /dev/null +++ b/FileSets/v3.00/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.01/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.00/styles.css b/FileSets/v3.00/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.00/styles.css +++ b/FileSets/v3.00/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.00~32/MbEditBox.qml b/FileSets/v3.00~32/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.00~32/MbEditBox.qml +++ b/FileSets/v3.00~32/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/MbEditBoxDateTime.qml b/FileSets/v3.00~32/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.00~32/MbEditBoxDateTime.qml +++ b/FileSets/v3.00~32/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/MbItem.qml b/FileSets/v3.00~32/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.00~32/MbItem.qml +++ b/FileSets/v3.00~32/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/MbItemDigitalInput.qml b/FileSets/v3.00~32/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.00~32/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/MbSpinBox.qml b/FileSets/v3.00~32/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.00~32/MbSpinBox.qml +++ b/FileSets/v3.00~32/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/MbStyle.qml b/FileSets/v3.00~32/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.00~32/MbStyle.qml +++ b/FileSets/v3.00~32/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/MbSubMenu.qml b/FileSets/v3.00~32/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.00~32/MbSubMenu.qml +++ b/FileSets/v3.00~32/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/Multi.qml b/FileSets/v3.00~32/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.00~32/Multi.qml +++ b/FileSets/v3.00~32/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/OverviewBox.qml b/FileSets/v3.00~32/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.00~32/OverviewBox.qml +++ b/FileSets/v3.00~32/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/OverviewConnection.qml b/FileSets/v3.00~32/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.00~32/OverviewConnection.qml +++ b/FileSets/v3.00~32/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/OverviewConnectionEnd.qml b/FileSets/v3.00~32/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.00~32/OverviewConnectionEnd.qml +++ b/FileSets/v3.00~32/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/OverviewMobileEnhanced.qml b/FileSets/v3.00~32/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.00~32/OverviewMobileEnhanced.qml +++ b/FileSets/v3.00~32/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/OverviewSolarCharger.qml b/FileSets/v3.00~32/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.00~32/OverviewSolarCharger.qml +++ b/FileSets/v3.00~32/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/OverviewTankDelegate.qml b/FileSets/v3.00~32/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.00~32/OverviewTankDelegate.qml +++ b/FileSets/v3.00~32/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/OverviewTanks.qml b/FileSets/v3.00~32/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.00~32/OverviewTanks.qml +++ b/FileSets/v3.00~32/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/OverviewTanksTempsDigInputs.qml b/FileSets/v3.00~32/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.00~32/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.00~32/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/PageDigitalInput.qml b/FileSets/v3.00~32/PageDigitalInput.qml new file mode 100644 index 00000000..bad7fa52 --- /dev/null +++ b/FileSets/v3.00~32/PageDigitalInput.qml @@ -0,0 +1,152 @@ +//// modified for ExtTransferSwitch package + +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: root + + property variant service + property string bindPrefix + property string settingsBindPreffix: "com.victronenergy.settings/Settings/DigitalInput/" + inputNumber + property int inputNumber: instance.valid ? instance.value : 0 + + title: getType(service.description) + summary: getState(state.item.value) + + VBusItem { + id: instance + bind: service.path("/DeviceInstance") + } + + VBusItem { + id: unit + bind: Utils.path(settingsBindPreffix, "/Unit") + } + +//// added for ExtTransferSwitch package + VBusItem + { + id: ac2connectedItem + bind: Utils.path ("com.victronenergy.system", "/Ac/In/1/Connected") + } + property bool showTransferSwitchConnection: ac2connectedItem.valid + VBusItem + { + id: typeItem + bind: service.path("/Type") + } + property bool isTransferSwitch: typeItem.valid && typeItem.value == 12 + + // Handle translations + function getType(type){ + switch (type) { + case "Disabled": + return qsTr("Disabled") + case "Pulse meter": + return qsTr("Pulse meter") + case "Door alarm": + return qsTr("Door alarm") + case "Bilge pump": + return qsTr("Bilge pump") + case "Bilge alarm": + return qsTr("Bilge alarm") + case "Disabled": + return qsTr("Burglar alarm") + case "Smoke alarm": + return qsTr("Smoke alarm") + case "Fire alarm": + return qsTr("Fire alarm") + case "CO2 alarm": + return qsTr("CO2 alarm") + case "Generator": + return qsTr("Generator") +//// added for ExtTransferSwitch package + case "TransferSwitch": + return qsTr("External transfer switch") + } + return type; + } + + function getState(st) + { + switch (st) { + case 0: + return qsTr("Low") + case 1: + return qsTr("High") + case 2: + return qsTr("Off") + case 3: + return qsTr("On") + case 4: + return qsTr("No") + case 5: + return qsTr("Yes") + case 6: + return qsTr("Open") + case 7: + return qsTr("Closed") + case 8: + return qsTr("Ok") + case 9: + return qsTr("Alarm") + case 10: + return qsTr("Running") + case 11: + return qsTr("Stopped") +//// added for ExtTransferSwitch package + case 12: + return qsTr("On generator") + case 13: + return qsTr("On grid") + } + + return qsTr("Unknown") + } + + model: VisibleItemModel { + MbItemValue { + id: state + description: qsTr("State") + item.bind: service.path("/State") + item.text: getState(item.value) + } + + MbSubMenu { + id: setupMenu + description: qsTr("Setup") + subpage: Component { + PageDigitalInputSetup { + bindPrefix: root.settingsBindPreffix + } + } + } + + MbSubMenu { + id: deviceMenu + description: qsTr("Device") + subpage: Component { + PageDeviceInfo { + title: deviceMenu.description + bindPrefix: root.bindPrefix + } + } + } + +//// added for ExtTransferSwitch package + MbItemOptions + { + id: extTransferSwitch + description: qsTr("External transfer switch connection") + bind: Utils.path ("com.victronenergy.settings/Settings", "/TransferSwitch/TransferSwitchOnAc2") + possibleValues: + [ + MbOption {description: qsTr("AC 1 in"); value: 0}, + MbOption {description: qsTr("AC 2 in"); value: 1} + ] + visible: root.isTransferSwitch && root.showTransferSwitchConnection + } + } +} diff --git a/FileSets/v3.00~32/PageDigitalInput.qml.orig b/FileSets/v3.00~32/PageDigitalInput.qml.orig new file mode 100644 index 00000000..d5c12078 --- /dev/null +++ b/FileSets/v3.00~32/PageDigitalInput.qml.orig @@ -0,0 +1,114 @@ +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: root + + property variant service + property string bindPrefix + property string settingsBindPreffix: "com.victronenergy.settings/Settings/DigitalInput/" + inputNumber + property int inputNumber: instance.valid ? instance.value : 0 + + title: getType(service.description) + summary: getState(state.item.value) + + VBusItem { + id: instance + bind: service.path("/DeviceInstance") + } + + VBusItem { + id: unit + bind: Utils.path(settingsBindPreffix, "/Unit") + } + + // Handle translations + function getType(type){ + switch (type) { + case "Disabled": + return qsTr("Disabled") + case "Pulse meter": + return qsTr("Pulse meter") + case "Door alarm": + return qsTr("Door alarm") + case "Bilge pump": + return qsTr("Bilge pump") + case "Bilge alarm": + return qsTr("Bilge alarm") + case "Disabled": + return qsTr("Burglar alarm") + case "Smoke alarm": + return qsTr("Smoke alarm") + case "Fire alarm": + return qsTr("Fire alarm") + case "CO2 alarm": + return qsTr("CO2 alarm") + case "Generator": + return qsTr("Generator") + } + return type; + } + + function getState(st) + { + switch (st) { + case 0: + return qsTr("Low") + case 1: + return qsTr("High") + case 2: + return qsTr("Off") + case 3: + return qsTr("On") + case 4: + return qsTr("No") + case 5: + return qsTr("Yes") + case 6: + return qsTr("Open") + case 7: + return qsTr("Closed") + case 8: + return qsTr("Ok") + case 9: + return qsTr("Alarm") + case 10: + return qsTr("Running") + case 11: + return qsTr("Stopped") + } + + return qsTr("Unknown") + } + + model: VisibleItemModel { + MbItemValue { + id: state + description: qsTr("State") + item.bind: service.path("/State") + item.text: getState(item.value) + } + + MbSubMenu { + id: setupMenu + description: qsTr("Setup") + subpage: Component { + PageDigitalInputSetup { + bindPrefix: root.settingsBindPreffix + } + } + } + + MbSubMenu { + id: deviceMenu + description: qsTr("Device") + subpage: Component { + PageDeviceInfo { + title: deviceMenu.description + bindPrefix: root.bindPrefix + } + } + } + } +} diff --git a/FileSets/v3.00~32/PageSettingsRelay.qml b/FileSets/v3.00~32/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.00~32/PageSettingsRelay.qml +++ b/FileSets/v3.00~32/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/Tile.qml b/FileSets/v3.00~32/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.00~32/Tile.qml +++ b/FileSets/v3.00~32/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/TileRelay.qml b/FileSets/v3.00~32/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.00~32/TileRelay.qml +++ b/FileSets/v3.00~32/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/TileText.qml b/FileSets/v3.00~32/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.00~32/TileText.qml +++ b/FileSets/v3.00~32/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.00~32/attributes.csv b/FileSets/v3.00~32/attributes.csv new file mode 120000 index 00000000..151259cd --- /dev/null +++ b/FileSets/v3.00~32/attributes.csv @@ -0,0 +1 @@ +../v3.01/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.00~32/dbus_digitalinputs.py b/FileSets/v3.00~32/dbus_digitalinputs.py new file mode 120000 index 00000000..25f64663 --- /dev/null +++ b/FileSets/v3.00~32/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.01/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.00~32/styles.css b/FileSets/v3.00~32/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.00~32/styles.css +++ b/FileSets/v3.00~32/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.01/MbEditBox.qml b/FileSets/v3.01/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.01/MbEditBox.qml +++ b/FileSets/v3.01/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.01/MbEditBoxDateTime.qml b/FileSets/v3.01/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.01/MbEditBoxDateTime.qml +++ b/FileSets/v3.01/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.01/MbItem.qml b/FileSets/v3.01/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.01/MbItem.qml +++ b/FileSets/v3.01/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.01/MbItemDigitalInput.qml b/FileSets/v3.01/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.01/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.01/MbSpinBox.qml b/FileSets/v3.01/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.01/MbSpinBox.qml +++ b/FileSets/v3.01/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.01/MbStyle.qml b/FileSets/v3.01/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.01/MbStyle.qml +++ b/FileSets/v3.01/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.01/MbSubMenu.qml b/FileSets/v3.01/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.01/MbSubMenu.qml +++ b/FileSets/v3.01/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.01/Multi.qml b/FileSets/v3.01/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.01/Multi.qml +++ b/FileSets/v3.01/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.01/OverviewBox.qml b/FileSets/v3.01/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.01/OverviewBox.qml +++ b/FileSets/v3.01/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.01/OverviewConnection.qml b/FileSets/v3.01/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.01/OverviewConnection.qml +++ b/FileSets/v3.01/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.01/OverviewConnectionEnd.qml b/FileSets/v3.01/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.01/OverviewConnectionEnd.qml +++ b/FileSets/v3.01/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.01/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.01/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.01/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.01/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.01/OverviewMobileEnhanced.qml b/FileSets/v3.01/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.01/OverviewMobileEnhanced.qml +++ b/FileSets/v3.01/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.01/OverviewSolarCharger.qml b/FileSets/v3.01/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.01/OverviewSolarCharger.qml +++ b/FileSets/v3.01/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.01/OverviewSolarInverter.qml b/FileSets/v3.01/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.01/OverviewSolarInverter.qml +++ b/FileSets/v3.01/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.01/OverviewTankDelegate.qml b/FileSets/v3.01/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.01/OverviewTankDelegate.qml +++ b/FileSets/v3.01/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.01/OverviewTanks.qml b/FileSets/v3.01/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.01/OverviewTanks.qml +++ b/FileSets/v3.01/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.01/OverviewTanksTempsDigInputs.qml b/FileSets/v3.01/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.01/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.01/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.01/PageDigitalInput.qml b/FileSets/v3.01/PageDigitalInput.qml new file mode 100644 index 00000000..1227d6bc --- /dev/null +++ b/FileSets/v3.01/PageDigitalInput.qml @@ -0,0 +1,147 @@ +//// modified for ExtTransferSwitch package + +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: root + + property variant service + property string bindPrefix + property string settingsBindPreffix: "com.victronenergy.settings/Settings/DigitalInput/" + inputNumber + property int inputNumber: instance.valid ? instance.value : 0 + + title: getType(service.description) + summary: getState(state.item.value) + + VBusItem { + id: instance + bind: service.path("/DeviceInstance") + } + +//// added for ExtTransferSwitch package + VBusItem + { + id: ac2connectedItem + bind: Utils.path ("com.victronenergy.system", "/Ac/In/1/Connected") + } + property bool showTransferSwitchConnection: ac2connectedItem.valid + VBusItem + { + id: typeItem + bind: service.path("/Type") + } + property bool isTransferSwitch: typeItem.valid && typeItem.value == 12 + + // Handle translations + function getType(type){ + switch (type) { + case "Disabled": + return qsTr("Disabled") + case "Pulse meter": + return qsTr("Pulse meter") + case "Door alarm": + return qsTr("Door alarm") + case "Bilge pump": + return qsTr("Bilge pump") + case "Bilge alarm": + return qsTr("Bilge alarm") + case "Disabled": + return qsTr("Burglar alarm") + case "Smoke alarm": + return qsTr("Smoke alarm") + case "Fire alarm": + return qsTr("Fire alarm") + case "CO2 alarm": + return qsTr("CO2 alarm") + case "Generator": + return qsTr("Generator") +//// added for ExtTransferSwitch package + case "TransferSwitch": + return qsTr("External transfer switch") + } + return type; + } + + function getState(st) + { + switch (st) { + case 0: + return qsTr("Low") + case 1: + return qsTr("High") + case 2: + return qsTr("Off") + case 3: + return qsTr("On") + case 4: + return qsTr("No") + case 5: + return qsTr("Yes") + case 6: + return qsTr("Open") + case 7: + return qsTr("Closed") + case 8: + return qsTr("Ok") + case 9: + return qsTr("Alarm") + case 10: + return qsTr("Running") + case 11: + return qsTr("Stopped") +//// added for ExtTransferSwitch package + case 12: + return qsTr("On generator") + case 13: + return qsTr("On grid") + } + + return qsTr("Unknown") + } + + model: VisibleItemModel { + MbItemValue { + id: state + description: qsTr("State") + item.bind: service.path("/State") + item.text: getState(item.value) + } + + MbSubMenu { + id: setupMenu + description: qsTr("Setup") + subpage: Component { + PageDigitalInputSetup { + bindPrefix: root.settingsBindPreffix + } + } + } + + MbSubMenu { + id: deviceMenu + description: qsTr("Device") + subpage: Component { + PageDeviceInfo { + title: deviceMenu.description + bindPrefix: root.bindPrefix + } + } + } + +//// added for ExtTransferSwitch package + MbItemOptions + { + id: extTransferSwitch + description: qsTr("External transfer switch connection") + bind: Utils.path ("com.victronenergy.settings/Settings", "/TransferSwitch/TransferSwitchOnAc2") + possibleValues: + [ + MbOption {description: qsTr("AC 1 in"); value: 0}, + MbOption {description: qsTr("AC 2 in"); value: 1} + ] + visible: root.isTransferSwitch && root.showTransferSwitchConnection + } + } +} diff --git a/FileSets/v3.01/PageDigitalInput.qml.orig b/FileSets/v3.01/PageDigitalInput.qml.orig new file mode 100644 index 00000000..47aa8e20 --- /dev/null +++ b/FileSets/v3.01/PageDigitalInput.qml.orig @@ -0,0 +1,109 @@ +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: root + + property variant service + property string bindPrefix + property string settingsBindPreffix: "com.victronenergy.settings/Settings/DigitalInput/" + inputNumber + property int inputNumber: instance.valid ? instance.value : 0 + + title: getType(service.description) + summary: getState(state.item.value) + + VBusItem { + id: instance + bind: service.path("/DeviceInstance") + } + + // Handle translations + function getType(type){ + switch (type) { + case "Disabled": + return qsTr("Disabled") + case "Pulse meter": + return qsTr("Pulse meter") + case "Door alarm": + return qsTr("Door alarm") + case "Bilge pump": + return qsTr("Bilge pump") + case "Bilge alarm": + return qsTr("Bilge alarm") + case "Disabled": + return qsTr("Burglar alarm") + case "Smoke alarm": + return qsTr("Smoke alarm") + case "Fire alarm": + return qsTr("Fire alarm") + case "CO2 alarm": + return qsTr("CO2 alarm") + case "Generator": + return qsTr("Generator") + } + return type; + } + + function getState(st) + { + switch (st) { + case 0: + return qsTr("Low") + case 1: + return qsTr("High") + case 2: + return qsTr("Off") + case 3: + return qsTr("On") + case 4: + return qsTr("No") + case 5: + return qsTr("Yes") + case 6: + return qsTr("Open") + case 7: + return qsTr("Closed") + case 8: + return qsTr("Ok") + case 9: + return qsTr("Alarm") + case 10: + return qsTr("Running") + case 11: + return qsTr("Stopped") + } + + return qsTr("Unknown") + } + + model: VisibleItemModel { + MbItemValue { + id: state + description: qsTr("State") + item.bind: service.path("/State") + item.text: getState(item.value) + } + + MbSubMenu { + id: setupMenu + description: qsTr("Setup") + subpage: Component { + PageDigitalInputSetup { + bindPrefix: root.settingsBindPreffix + } + } + } + + MbSubMenu { + id: deviceMenu + description: qsTr("Device") + subpage: Component { + PageDeviceInfo { + title: deviceMenu.description + bindPrefix: root.bindPrefix + } + } + } + } +} diff --git a/FileSets/v3.01/PageSettingsRelay.qml b/FileSets/v3.01/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.01/PageSettingsRelay.qml +++ b/FileSets/v3.01/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.01/Tile.qml b/FileSets/v3.01/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.01/Tile.qml +++ b/FileSets/v3.01/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.01/TileRelay.qml b/FileSets/v3.01/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.01/TileRelay.qml +++ b/FileSets/v3.01/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.01/TileText.qml b/FileSets/v3.01/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.01/TileText.qml +++ b/FileSets/v3.01/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.01/attributes.csv b/FileSets/v3.01/attributes.csv new file mode 100644 index 00000000..10cd0c39 --- /dev/null +++ b/FileSets/v3.01/attributes.csv @@ -0,0 +1,641 @@ +com.victronenergy.gps,/Position/Latitude,d,Decimal degrees,2800,int32,10000000,R +com.victronenergy.gps,/Position/Longitude,d,Decimal degrees,2802,int32,10000000,R +com.victronenergy.gps,/Course,d,Degrees,2804,uint16,100,R +com.victronenergy.gps,/Speed,d,m/s,2805,uint16,100,R +com.victronenergy.gps,/Fix,y,,2806,uint16,1,R +com.victronenergy.gps,/NrOfSatellites,y,,2807,uint16,1,R +com.victronenergy.gps,/Altitude,d,m,2808,int32,10,R +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/State,i,0=BL disabled;1=Restarting;2=Self-consumption;3=Self-consumption;4=Self-consumption;5=Discharge disabled;6=Force charge;7=Sustain;9=Keep batteries charged;10=BL Disabled;11=BL Disabled (Low SoC),2900,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/MinimumSocLimit,d,%,2901,uint16,10,W +com.victronenergy.settings,/Settings/CGwacs/Hub4Mode,i,1=ESS with Phase Compensation;2=ESS without phase compensation;3=Disabled/External Control,2902,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/SocLimit,d,%,2903,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/V,d,V AC,3,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/V,d,V AC,4,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/V,d,V AC,5,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/I,d,A AC,6,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/I,d,A AC,7,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/I,d,A AC,8,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/F,d,Hz,9,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/F,d,Hz,10,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/F,d,Hz,11,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/P,i,VA or Watts,12,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/P,i,VA or Watts,13,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/P,i,VA or Watts,14,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L1/V,d,V AC,15,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L2/V,d,V AC,16,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L3/V,d,V AC,17,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L1/I,d,A AC,18,int16,10,R +com.victronenergy.vebus,/Ac/Out/L2/I,d,A AC,19,int16,10,R +com.victronenergy.vebus,/Ac/Out/L3/I,d,A AC,20,int16,10,R +com.victronenergy.vebus,/Ac/Out/L1/F,d,Hz,21,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/CurrentLimit,d,A,22,int16,10,W +com.victronenergy.vebus,/Ac/Out/L1/P,i,VA or Watts,23,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L2/P,i,VA or Watts,24,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L3/P,i,VA or Watts,25,int16,0.1,R +com.victronenergy.vebus,/Dc/0/Voltage,d,V DC,26,uint16,100,R +com.victronenergy.vebus,/Dc/0/Current,d,A DC,27,int16,10,R +com.victronenergy.vebus,/Ac/NumberOfPhases,u,count,28,uint16,1,R +com.victronenergy.vebus,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,29,uint16,1,R +com.victronenergy.vebus,/Soc,d,%,30,uint16,10,W +com.victronenergy.vebus,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=External control,31,uint16,1,R +com.victronenergy.vebus,/VebusError,u,0=No error;1=VE.Bus Error 1: Device is switched off because one of the other phases in the system has switched off;2=VE.Bus Error 2: New and old types MK2 are mixed in the system;3=VE.Bus Error 3: Not all- or more than- the expected devices were found in the system;4=VE.Bus Error 4: No other device whatsoever detected;5=VE.Bus Error 5: Overvoltage on AC-out;6=VE.Bus Error 6: Error in DDC Program;7=VE.Bus BMS connected- which requires an Assistant- but no assistant found;10=VE.Bus Error 10: System time synchronisation problem occurred;14=VE.Bus Error 14: Device cannot transmit data;16=VE.Bus Error 16: Dongle missing;17=VE.Bus Error 17: One of the devices assumed master status because the original master failed;18=VE.Bus Error 18: AC Overvoltage on the output of a slave has occurred while already switched off;22=VE.Bus Error 22: This device cannot function as slave;24=VE.Bus Error 24: Switch-over system protection initiated;25=VE.Bus Error 25: Firmware incompatibility. The firmware of one of the connected device is not sufficiently up to date to operate in conjunction with this device;26=VE.Bus Error 26: Internal error,32,uint16,1,R +com.victronenergy.vebus,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,33,uint16,1,W +com.victronenergy.vebus,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,34,uint16,1,R +com.victronenergy.vebus,/Alarms/LowBattery,u,0=Ok;1=Warning;2=Alarm,35,uint16,1,R +com.victronenergy.vebus,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,36,uint16,1,R +com.victronenergy.vebus,/Alarms/TemperatureSensor,u,0=Ok;1=Warning;2=Alarm,42,uint16,1,R +com.victronenergy.vebus,/Alarms/VoltageSensor,u,0=Ok;1=Warning;2=Alarm,43,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/HighTemperature,u,0=Ok;1=Warning;2=Alarm,44,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/LowBattery,u,0=Ok;1=Warning;2=Alarm,45,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Overload,u,0=Ok;1=Warning;2=Alarm,46,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Ripple,u,0=Ok;1=Warning;2=Alarm,47,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/HighTemperature,u,0=Ok;1=Warning;2=Alarm,48,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/LowBattery,u,0=Ok;1=Warning;2=Alarm,49,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Overload,u,0=Ok;1=Warning;2=Alarm,50,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Ripple,u,0=Ok;1=Warning;2=Alarm,51,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/HighTemperature,u,0=Ok;1=Warning;2=Alarm,52,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/LowBattery,u,0=Ok;1=Warning;2=Alarm,53,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Overload,u,0=Ok;1=Warning;2=Alarm,54,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Ripple,u,0=Ok;1=Warning;2=Alarm,55,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,37,int16,1,W +com.victronenergy.vebus,/Hub4/DisableCharge,u,0=Charge allowed;1=Charge disabled,38,uint16,1,W +com.victronenergy.vebus,/Hub4/DisableFeedIn,u,0=Feed in allowed;1=Feed in disabled,39,uint16,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,40,int16,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,41,int16,1,W +com.victronenergy.vebus,/PvInverter/Disable,u,0=PV enabled;1=PV disabled,56,uint16,1,W +com.victronenergy.vebus,/Bms/AllowToCharge,u,0=No;1=Yes,57,uint16,1,R +com.victronenergy.vebus,/Bms/AllowToDischarge,u,0=No;1=Yes,58,uint16,1,R +com.victronenergy.vebus,/Bms/BmsExpected,u,0=No;1=Yes,59,uint16,1,R +com.victronenergy.vebus,/Bms/Error,u,0=No;1=Yes,60,uint16,1,R +com.victronenergy.vebus,/Dc/0/Temperature,d,Degrees celsius,61,int16,10,R +com.victronenergy.vebus,/SystemReset,y,0=No action;1=VE.Bus Reset,62,uint16,1,W +com.victronenergy.vebus,/Alarms/PhaseRotation,u,0=Ok;1=Warning,63,uint16,1,R +com.victronenergy.vebus,/Alarms/GridLost,i,0=No alarm;2=Alarm,64,uint16,1,R +com.victronenergy.vebus,/Alarms/BmsPreAlarm,u,0=OK;1=Pre-Alarm,94,uint16,1,R +com.victronenergy.vebus,/Hub4/DoNotFeedInOvervoltage,i,0=Feed in overvoltage;1=Don't feed in overvoltage,65,uint16,1,W +com.victronenergy.vebus,/Hub4/L1/MaxFeedInPower,d,W,66,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L2/MaxFeedInPower,d,W,67,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L3/MaxFeedInPower,d,W,68,uint16,0.01,W +com.victronenergy.vebus,/Ac/State/IgnoreAcIn1,i,0=AC input not ignored; 1=AC input ignored,69,uint16,1,R +com.victronenergy.vebus,/Ac/State/IgnoreAcIn2,i,0=AC input not ignored; 1=AC input ignored,70,uint16,1,R +com.victronenergy.vebus,/Hub4/TargetPowerIsMaxFeedIn,i,0=AcPowerSetpoint interpreted normally; 1=AcPowerSetpoint as OvervoltageFeedIn limit,71,uint16,,W +com.victronenergy.vebus,/Hub4/FixSolarOffsetTo100mV,i,0=OvervoltageFeedIn uses 1V offset; 1=OvervoltageFeedIn uses 0.1V offset,72,uint16,,W +com.victronenergy.vebus,/Hub4/Sustain,i,0=Sustain inactive; 1=Sustain active,73,uint16,1,R +com.victronenergy.vebus,/Energy/AcIn1ToAcOut,d,kWh,74,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn1ToInverter,d,kWh,76,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToAcOut,d,kWh,78,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToInverter,d,kWh,80,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn1,d,kWh,82,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn2,d,kWh,84,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn1,d,kWh,86,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn2,d,kWh,88,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcOut,d,kWh,90,uint32,100,R +com.victronenergy.vebus,/Energy/OutToInverter,d,kWh,92,uint32,100,R +com.victronenergy.vebus,/VebusChargeState,u,0=Initialising;1=Bulk;2=Absorption;3=Float;4=Storage;5=Absorb repeat;6=Forced absorb;7=Equalise;8=Bulk stopped;9=Unknown,95,uint16,1,R +com.victronenergy.battery,/Dc/0/Power,i,W,258,int16,1,R +com.victronenergy.battery,/Dc/0/Voltage,d,V DC,259,uint16,100,R +com.victronenergy.battery,/Dc/1/Voltage,d,V DC,260,uint16,100,R +com.victronenergy.battery,/Dc/0/Current,d,A DC,261,int16,10,R +com.victronenergy.battery,/Dc/0/Temperature,d,Degrees celsius,262,int16,10,R +com.victronenergy.battery,/Dc/0/MidVoltage,d,V DC,263,uint16,100,R +com.victronenergy.battery,/Dc/0/MidVoltageDeviation,d,%,264,uint16,100,R +com.victronenergy.battery,/ConsumedAmphours,d,Ah,265,uint16,-10,R +com.victronenergy.battery,/Soc,y,%,266,uint16,10,R +com.victronenergy.battery,/Soh,y,%,304,uint16,10,R +com.victronenergy.battery,/TimeToGo,q,seconds,303,uint16,0.01,R +com.victronenergy.battery,/Info/MaxChargeVoltage,u,V DC,305,uint16,10,R +com.victronenergy.battery,/Info/BatteryLowVoltage,u,V DC,306,uint16,10,R +com.victronenergy.battery,/Info/MaxChargeCurrent,u,A DC,307,uint16,10,R +com.victronenergy.battery,/Info/MaxDischargeCurrent,u,A DC,308,uint16,10,R +com.victronenergy.battery,/Alarms/Alarm,y,0=No alarm;2=Alarm,267,uint16,1,R +com.victronenergy.battery,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,268,uint16,1,R +com.victronenergy.battery,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,269,uint16,1,R +com.victronenergy.battery,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,270,uint16,1,R +com.victronenergy.battery,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,271,uint16,1,R +com.victronenergy.battery,/Alarms/LowSoc,u,0=No alarm;2=Alarm,272,uint16,1,R +com.victronenergy.battery,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,273,uint16,1,R +com.victronenergy.battery,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,274,uint16,1,R +com.victronenergy.battery,/Alarms/MidVoltage,u,0=No alarm;2=Alarm,275,uint16,1,R +com.victronenergy.battery,/Alarms/LowFusedVoltage,u,0=No alarm;2=Alarm,276,uint16,1,R +com.victronenergy.battery,/Alarms/HighFusedVoltage,u,0=No alarm;2=Alarm,277,uint16,1,R +com.victronenergy.battery,/Alarms/FuseBlown,u,0=No alarm;2=Alarm,278,uint16,1,R +com.victronenergy.battery,/Alarms/HighInternalTemperature,u,0=No alarm;2=Alarm,279,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeCurrent,u,0=No alarm;2=Alarm,320,uint16,1,R +com.victronenergy.battery,/Alarms/HighDischargeCurrent,u,0=No alarm;2=Alarm,321,uint16,1,R +com.victronenergy.battery,/Alarms/CellImbalance,u,0=No alarm;2=Alarm,322,uint16,1,R +com.victronenergy.battery,/Alarms/InternalFailure,u,0=No alarm;2=Alarm,323,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeTemperature,u,0=No alarm;2=Alarm,324,uint16,1,R +com.victronenergy.battery,/Alarms/LowChargeTemperature,u,0=No alarm;2=Alarm,325,uint16,1,R +com.victronenergy.battery,/Alarms/LowCellVoltage,u,0=No alarm;1=Almost discharged;2=Alarm,326,uint16,1,R +com.victronenergy.battery,/Relay/0/State,y,0=Open;1=Closed,280,uint16,1,W +com.victronenergy.battery,/History/DeepestDischarge,d,Ah,281,uint16,-10,R +com.victronenergy.battery,/History/LastDischarge,d,Ah,282,uint16,-10,R +com.victronenergy.battery,/History/AverageDischarge,d,Ah,283,uint16,-10,R +com.victronenergy.battery,/History/ChargeCycles,i,count,284,uint16,1,R +com.victronenergy.battery,/History/FullDischarges,i,count,285,uint16,1,R +com.victronenergy.battery,/History/TotalAhDrawn,d,Ah,286,uint16,-10,R +com.victronenergy.battery,/History/MinimumVoltage,d,V DC,287,uint16,100,R +com.victronenergy.battery,/History/MaximumVoltage,d,V DC,288,uint16,100,R +com.victronenergy.battery,/History/TimeSinceLastFullCharge,i,seconds,289,uint16,0.01,R +com.victronenergy.battery,/History/AutomaticSyncs,i,count,290,uint16,1,R +com.victronenergy.battery,/History/LowVoltageAlarms,i,count,291,uint16,1,R +com.victronenergy.battery,/History/HighVoltageAlarms,i,count,292,uint16,1,R +com.victronenergy.battery,/History/LowStarterVoltageAlarms,i,count,293,uint16,1,R +com.victronenergy.battery,/History/HighStarterVoltageAlarms,i,count,294,uint16,1,R +com.victronenergy.battery,/History/MinimumStarterVoltage,d,V DC,295,uint16,100,R +com.victronenergy.battery,/History/MaximumStarterVoltage,d,V DC,296,uint16,100,R +com.victronenergy.battery,/History/LowFusedVoltageAlarms,i,count,297,uint16,1,R +com.victronenergy.battery,/History/HighFusedVoltageAlarms,i,count,298,uint16,1,R +com.victronenergy.battery,/History/MinimumFusedVoltage,d,V DC,299,uint16,100,R +com.victronenergy.battery,/History/MaximumFusedVoltage,d,V DC,300,uint16,100,R +com.victronenergy.battery,/History/DischargedEnergy,d,kWh,301,uint16,10,R +com.victronenergy.battery,/History/ChargedEnergy,d,kWh,302,uint16,10,R +com.victronenergy.battery,/Capacity,d,Ah,309,uint16,10,R +com.victronenergy.battery,/State,y,0=Initializing (Wait start);1=Initializing (before boot);2=Initializing (Before boot delay);3=Initializing (Wait boot);4=Initializing;5=Initializing (Measure battery voltage);6=Initializing (Calculate battery voltage);7=Initializing (Wait bus voltage);8=Initializing (Wait for lynx shunt);9=Running;10=Error;11=Unused;12=Shutdown;13=Slave updating;14=Standby;15=Going to run;16=Per-charging;17=Contactor check,1282,uint16,1,R +com.victronenergy.battery,/ErrorCode,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1283,uint16,1,R +com.victronenergy.battery,/SystemSwitch,y,0=Disabled;1=Enabled,1284,uint16,1,R +com.victronenergy.battery,/Balancing,y,0=Inactive;1=Active,1285,uint16,1,R +com.victronenergy.battery,/System/NrOfBatteries,y,count,1286,uint16,1,R +com.victronenergy.battery,/System/BatteriesParallel,y,count,1287,uint16,1,R +com.victronenergy.battery,/System/BatteriesSeries,y,count,1288,uint16,1,R +com.victronenergy.battery,/System/NrOfCellsPerBattery,y,count,1289,uint16,1,R +com.victronenergy.battery,/System/MinCellVoltage,d,V DC,1290,uint16,100,R +com.victronenergy.battery,/System/MaxCellVoltage,d,V DC,1291,uint16,100,R +com.victronenergy.battery,/Diagnostics/ShutDownsDueError,q,count,1292,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1293,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1294,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1295,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1296,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Time,u,,310,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Time,u,,312,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Time,u,,314,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Time,u,,316,int32,1,R +com.victronenergy.battery,/System/MinCellTemperature,d,Degrees celsius,318,int16,10,R +com.victronenergy.battery,/System/MaxCellTemperature,d,Degrees celsius,319,int16,10,R +com.victronenergy.battery,/Io/AllowToCharge,y,0=No;1=Yes,1297,uint16,1,R +com.victronenergy.battery,/Io/AllowToDischarge,y,0=No;1=Yes,1298,uint16,1,R +com.victronenergy.battery,/Io/ExternalRelay,y,0=Inactive;1=Active,1299,uint16,1,R +com.victronenergy.battery,/History/MinimumCellVoltage,d,V DC,1300,uint16,100,R +com.victronenergy.battery,/History/MaximumCellVoltage,d,V DC,1301,uint16,100,R +com.victronenergy.battery,/System/NrOfModulesOffline,u,,1302,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesOnline,u,,1303,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingCharge,u,,1304,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingDischarge,u,,1305,uint16,1,R +com.victronenergy.battery,/System/MinVoltageCellId,s,,1306,string[4],1,R +com.victronenergy.battery,/System/MaxVoltageCellId,s,,1310,string[4],1,R +com.victronenergy.battery,/System/MinTemperatureCellId,s,,1314,string[4],1,R +com.victronenergy.battery,/System/MaxTemperatureCellId,s,,1318,string[4],1,R +com.victronenergy.battery,/Mode,i,3=On;252=Standby,1319,uint16,1,W +com.victronenergy.solarcharger,/Dc/0/Voltage,d,V DC,771,uint16,100,R +com.victronenergy.solarcharger,/Dc/0/Current,d,A DC,772,int16,10,R +com.victronenergy.solarcharger,/Dc/0/Temperature,d,Degrees celsius,773,int16,10,R +com.victronenergy.solarcharger,/Mode,i,1=On;4=Off,774,uint16,1,W +com.victronenergy.solarcharger,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;11=Other (Hub-1);252=Hub-1,775,uint16,1,R +com.victronenergy.solarcharger,/Pv/V,d,V DC,776,uint16,100,R +com.victronenergy.solarcharger,/Pv/I,d,A DC,777,,10,R,HANDLED IN mappings.c +com.victronenergy.solarcharger,/Yield/Power,d,W,789,uint16,10,R +com.victronenergy.solarcharger,/Equalization/Pending,i,0=No;1=Yes;2=Error;3=Unavailable- Unknown,778,uint16,1,R +com.victronenergy.solarcharger,/Equalization/TimeRemaining,d,seconds,779,uint16,10,R +com.victronenergy.solarcharger,/Relay/0/State,i,0=Open;1=Closed,780,uint16,1,R +com.victronenergy.solarcharger,/Alarms/Alarm,i,0=No alarm;2=Alarm,781,uint16,1,R +com.victronenergy.solarcharger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,782,uint16,1,R +com.victronenergy.solarcharger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,783,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Yield,d,kWh,784,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/MaxPower,d,W,785,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Yield,d,kWh,786,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/MaxPower,d,W,787,uint16,1,R +com.victronenergy.solarcharger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,788,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,790,uint16,10,R +com.victronenergy.solarcharger,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,791,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/V,d,V DC,3700,uint16,100,R +com.victronenergy.solarcharger,/Pv/1/V,d,V DC,3701,uint16,100,R +com.victronenergy.solarcharger,/Pv/2/V,d,V DC,3702,uint16,100,R +com.victronenergy.solarcharger,/Pv/3/V,d,V DC,3703,uint16,100,R +com.victronenergy.solarcharger,RESERVED,d,,3704,reserved[4],1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/Yield,d,kWh,3708,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/Yield,d,kWh,3709,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/Yield,d,kWh,3710,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/Yield,d,kWh,3711,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/Yield,d,kWh,3712,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/Yield,d,kWh,3713,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/Yield,d,kWh,3714,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/Yield,d,kWh,3715,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/MaxPower,d,W,3716,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/MaxPower,d,W,3717,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/MaxPower,d,W,3718,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/MaxPower,d,W,3719,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/MaxPower,d,W,3720,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/MaxPower,d,W,3721,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/MaxPower,d,W,3722,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/MaxPower,d,W,3723,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/P,d,W,3724,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/P,d,W,3725,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/P,d,W,3726,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/P,d,W,3727,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,3728,uint32,1,R +com.victronenergy.solarcharger,/Yield/Power,d,W,3730,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L1/Power,d,W,808,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L2/Power,d,W,809,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L3/Power,d,W,810,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L1/Power,d,W,811,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L2/Power,d,W,812,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L3/Power,d,W,813,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L1/Power,d,W,814,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L2/Power,d,W,815,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L3/Power,d,W,816,uint16,1,R +com.victronenergy.system,/Dc/Pv/Power,d,W,850,uint16,1,R +com.victronenergy.system,/Dc/Pv/Current,d,A DC,851,int16,10,R +com.victronenergy.system,/Dc/Charger/Power,d,W,855,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L1/Power,d,W,817,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L2/Power,d,W,818,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L3/Power,d,W,819,uint16,1,R +com.victronenergy.system,/Ac/Grid/L1/Power,d,W,820,int16,1,R +com.victronenergy.system,/Ac/Grid/L2/Power,d,W,821,int16,1,R +com.victronenergy.system,/Ac/Grid/L3/Power,d,W,822,int16,1,R +com.victronenergy.system,/Ac/Genset/L1/Power,d,W,823,int16,1,R +com.victronenergy.system,/Ac/Genset/L2/Power,d,W,824,int16,1,R +com.victronenergy.system,/Ac/Genset/L3/Power,d,W,825,int16,1,R +com.victronenergy.system,/Ac/ActiveIn/Source,u,0=Not available;1=Grid;2=Generator;3=Shore power;240=Not connected,826,int16,1,R +com.victronenergy.system,/Dc/System/Power,d,W,860,int16,1,R +com.victronenergy.system,/Dc/Battery/Voltage,d,V DC,840,uint16,10,R +com.victronenergy.system,/Dc/Battery/Current,d,A DC,841,int16,10,R +com.victronenergy.system,/Dc/Battery/Power,d,W,842,int16,1,R +com.victronenergy.system,/Dc/Vebus/Current,d,A DC,865,int16,10,R +com.victronenergy.system,/Dc/Vebus/Power,d,W,866,int16,1,R +com.victronenergy.system,/Dc/Battery/Soc,d,%,843,uint16,1,R +com.victronenergy.system,/Dc/Battery/State,i,0=idle;1=charging;2=discharging,844,uint16,1,R +com.victronenergy.system,/Dc/Battery/ConsumedAmphours,d,Ah,845,uint16,-10,R +com.victronenergy.system,/Dc/Battery/TimeToGo,d,s,846,uint16,0.01,R +com.victronenergy.system,/Relay/0/State,i,0=Open;1=Closed,806,uint16,1,W +com.victronenergy.system,/Relay/1/State,i,0=Open;1=Closed,807,uint16,1,W +com.victronenergy.system,/Serial,s,,800,string[6],1,R +com.victronenergy.pvinverter,/Position,i,0=AC input 1;1=AC output;2=AC input 2,1026,uint16,1,R +com.victronenergy.pvinverter,/Serial,s,,1039,string[7],1,R +com.victronenergy.pvinverter,/Ac/L1/Voltage,d,V AC,1027,uint16,10,R +com.victronenergy.pvinverter,/Ac/L1/Current,d,A AC,1028,int16,10,R +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1029,uint16,1,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1030,uint16,100,R +com.victronenergy.pvinverter,/Ac/L2/Voltage,d,V AC,1031,uint16,10,R +com.victronenergy.pvinverter,/Ac/L2/Current,d,A AC,1032,int16,10,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1033,uint16,1,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1034,uint16,100,R +com.victronenergy.pvinverter,/Ac/L3/Voltage,d,V AC,1035,uint16,10,R +com.victronenergy.pvinverter,/Ac/L3/Current,d,A AC,1036,int16,10,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1037,uint16,1,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1038,uint16,100,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1046,uint32,100,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1048,uint32,100,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1050,uint32,100,R +com.victronenergy.pvinverter,/Ac/Power,i,kW,1052,int32,1,W +com.victronenergy.pvinverter,/Ac/MaxPower,u,kW,1054,uint32,1,W +com.victronenergy.pvinverter,/Ac/PowerLimit,u,kW,1056,uint32,1,W +com.victronenergy.motordrive,/Motor/RPM,d,RPM,2048,int16,1,R +com.victronenergy.motordrive,/Motor/Temperature,d,Degrees celsius,2049,int16,10,R +com.victronenergy.motordrive,/Dc/0/Voltage,d,V DC,2050,uint16,100,R +com.victronenergy.motordrive,/Dc/0/Current,d,A DC,2051,int16,10,R +com.victronenergy.motordrive,/Dc/0/Power,d,W,2052,int16,10,R +com.victronenergy.motordrive,/Controller/Temperature,d,Degrees celsius,2053,int16,10,R +com.victronenergy.charger,/Dc/0/Voltage,d,V DC,2307,uint16,100,R +com.victronenergy.charger,/Dc/0/Current,d,A DC,2308,int16,10,R +com.victronenergy.charger,/Dc/0/Temperature,d,Degrees celsius,2309,int16,10,R +com.victronenergy.charger,/Dc/1/Voltage,d,V DC,2310,uint16,100,R +com.victronenergy.charger,/Dc/1/Current,d,A DC,2311,int16,10,R +com.victronenergy.charger,/Dc/2/Voltage,d,V DC,2312,uint16,100,R +com.victronenergy.charger,/Dc/2/Current,d,A DC,2313,int16,10,R +com.victronenergy.charger,/Ac/In/L1/I,d,A AC,2314,int16,10,R +com.victronenergy.charger,/Ac/In/L1/P,d,W DC,2315,uint16,1,R +com.victronenergy.charger,/Ac/In/CurrentLimit,d,A AC,2316,int16,10,W +com.victronenergy.charger,/Mode,i,0=Off;1=On;2=Error;3=Unavailable- Unknown,2317,uint16,1,W +com.victronenergy.charger,/State,i,0=Off;1=Low Power Mode;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply mode;252=External control,2318,uint16,1,R +com.victronenergy.charger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,2319,uint16,1,R +com.victronenergy.charger,/Relay/0/State,i,0=Open;1=Closed,2320,uint16,1,R +com.victronenergy.charger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,2321,uint16,1,R +com.victronenergy.charger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,2322,uint16,1,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2600,int16,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2601,int16,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2602,int16,1,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2603,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2604,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2605,uint16,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2606,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2607,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2608,uint16,100,R +com.victronenergy.grid,/Serial,s,,2609,string[7],,R +com.victronenergy.grid,/Ac/L1/Voltage,d,V AC,2616,uint16,10,R +com.victronenergy.grid,/Ac/L1/Current,d,A AC,2617,int16,10,R +com.victronenergy.grid,/Ac/L2/Voltage,d,V AC,2618,uint16,10,R +com.victronenergy.grid,/Ac/L2/Current,d,A AC,2619,int16,10,R +com.victronenergy.grid,/Ac/L3/Voltage,d,V AC,2620,uint16,10,R +com.victronenergy.grid,/Ac/L3/Current,d,A AC,2621,int16,10,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2622,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2624,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2626,uint32,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2628,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2630,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2632,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Forward,d,kWh,2634,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Reverse,d,kWh,2636,uint32,100,R +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2700,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2703,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/MaxChargePercentage,d,%,2701,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePercentage,d,%,2702,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePower,d,W,2704,uint16,0.1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeCurrent,d,A,2705,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxFeedInPower,d,W,2706,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/OvervoltageFeedIn,i,0=Don't feed excess DC-coupled PV into grid;1=Feed excess DC-coupled PV into the grid,2707,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/PreventFeedback,i,0=Feed excess AC-coupled PV into grid;1=Don't feed excess AC-coupled PV into the grid,2708,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeVoltage,d,V,2710,uint16,10,W +com.victronenergy.settings,/Settings/SystemSetup/AcInput1,u,0=Unused;1=Grid;2=Genset;3=Shore,2711,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/AcInput2,u,0=Unused;1=Grid;2=Genset;3=Shore,2712,uint16,1,W +com.victronenergy.hub4,/PvPowerLimiterActive,i,0=Feed-in limiting inactive;1=Feed-in limiting active,2709,uint16,1,R +com.victronenergy.tank,/ProductId,u,,3000,uint16,1,R +com.victronenergy.tank,/Capacity,d,m3,3001,uint32,10000,R +com.victronenergy.tank,/FluidType,u,0=Fuel;1=Fresh water;2=Waste water;3=Live well;4=Oil;5=Black water (sewage);6=Gasoline;7=Diesel;8=LPG;9=LNG;10=Hydraulic oil;11=Raw water,3003,uint16,1,R +com.victronenergy.tank,/Level,d,%,3004,uint16,10,R +com.victronenergy.tank,/Remaining,d,m3,3005,uint32,10000,R +com.victronenergy.tank,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3007,uint16,1,R +com.victronenergy.inverter,/ProductId,u,,3127,uint16,1,R +com.victronenergy.inverter,/FirmwareVersion,u,,3125,uint16,1,R +com.victronenergy.inverter,/Ac/Out/L1/I,d,A AC,3100,int16,10,R +com.victronenergy.inverter,/Ac/Out/L1/V,d,V AC,3101,uint16,10,R +com.victronenergy.inverter,/Ac/Out/L1/P,d,W AC,3102,int16,0.1,R +com.victronenergy.inverter,/Alarms/HighTemperature,u,0=No alarm;1=Warning;2=Alarm,3110,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltage,u,0=No alarm;1=Warning;2=Alarm,3111,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3112,uint16,1,R +com.victronenergy.inverter,/Alarms/LowTemperature,u,0=No alarm;1=Warning;2=Alarm,3113,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltage,u,0=No alarm;1=Warning;2=Alarm,3114,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3115,uint16,1,R +com.victronenergy.inverter,/Alarms/Overload,u,0=No alarm;1=Warning;2=Alarm,3116,uint16,1,R +com.victronenergy.inverter,/Alarms/Ripple,u,0=No alarm;1=Warning;2=Alarm,3117,uint16,1,R +com.victronenergy.inverter,/Dc/0/Voltage,d,V DC,3105,uint16,100,R +com.victronenergy.inverter,/Dc/0/Current,d,A DC,3106,int16,10,R +com.victronenergy.inverter,/Mode,u,2=On;4=Off;5=Eco,3126,uint16,1,W +com.victronenergy.inverter,/State,u,0=Off;1=Low power mode (search mode);2=Fault;9=Inverting (on),3128,uint16,1,R +com.victronenergy.inverter,/Energy/InverterToAcOut,d,kWh,3130,uint32,100,R +com.victronenergy.inverter,/Energy/OutToInverter,d,kWh,3132,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToAcOut,d,kWh,3134,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToBattery,d,kWh,3136,uint32,100,R +com.victronenergy.inverter,/Pv/V,d,V DC,3138,uint16,10,R +com.victronenergy.inverter,/Pv/0/V,d,V DC,3140,uint16,10,R +com.victronenergy.inverter,/Pv/1/V,d,V DC,3141,uint16,10,R +com.victronenergy.inverter,/Pv/2/V,d,V DC,3142,uint16,10,R +com.victronenergy.inverter,/Pv/3/V,d,V DC,3143,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/Yield,d,kWh,3148,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/Yield,d,kWh,3149,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/Yield,d,kWh,3150,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/Yield,d,kWh,3151,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/Yield,d,kWh,3152,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/Yield,d,kWh,3153,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/Yield,d,kWh,3154,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/Yield,d,kWh,3155,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/MaxPower,d,W,3156,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/MaxPower,d,W,3157,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/MaxPower,d,W,3158,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/MaxPower,d,W,3159,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/MaxPower,d,W,3160,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/MaxPower,d,W,3161,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/MaxPower,d,W,3162,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/MaxPower,d,W,3163,uint16,1,R +com.victronenergy.inverter,/Pv/0/P,d,W,3164,uint16,1,R +com.victronenergy.inverter,/Pv/1/P,d,W,3165,uint16,1,R +com.victronenergy.inverter,/Pv/2/P,d,W,3166,uint16,1,R +com.victronenergy.inverter,/Pv/3/P,d,W,3167,uint16,1,R +com.victronenergy.inverter,/Alarms/LowSoc,u,,3168,uint16,1,R +com.victronenergy.genset,/ProductId,u,,3212,uint16,1,R +com.victronenergy.genset,/StatusCode,u,0=Standby;1=Startup 1;2=Startup 2;3=Startup 3;4=Startup 4;5=Startup 5;6=Startup 6;7=Startup 7;8=Running;9=Stopping;10=Error,3213,uint16,1,R +com.victronenergy.genset,/ErrorCode,u,0=No error;1=AC voltage L1 too low;2=AC frequency L1 too low;3=AC current too low;4=AC power too low;5=Emergency stop;6=Servo current too low;7=Oil pressure too low;8=Engine temperature too low;9=Winding temperature too low;10=Exhaust temperature too low;13=Starter current too low;14=Glow current too low;15=Glow current too low;16=Fuel holding magnet current too low;17=Stop solenoid hold coil current too low;18=Stop solenoid pull coil current too low;19=Optional DC out current too low;20=5V output voltage too low;21=Boost output current too low;22=Panel supply current too high;25=Starter battery voltage too low;26=Startup aborted (rotation too low);28=Rotation too low;29=Power contactor current too low;30=AC voltage L2 too low;31=AC frequency L2 too low;32=AC current L2 too low;33=AC power L2 too low;34=AC voltage L3 too low;35=AC frequency L3 too low;36=AC current L3 too low;37=AC power L3 too low;62=Fuel temperature too low;63=Fuel level too low;65=AC voltage L1 too high;66=AC frequency too high;67=AC current too high;68=AC power too high;70=Servo current too high;71=Oil pressure too high;72=Engine temperature too high;73=Winding temperature too high;74=Exhaust temperature too low;77=Starter current too low;78=Glow current too high;79=Glow current too high;80=Fuel holding magnet current too high;81=Stop solenoid hold coil current too high;82=Stop solenoid pull coil current too high;83=Optional DC out current too high;84=5V output voltage too high;85=Boost output current too high;89=Starter battery voltage too high;90=Startup aborted (rotation too high);92=Rotation too high;93=Power contactor current too high;94=AC voltage L2 too high;95=AC frequency L2 too high;96=AC current L2 too high;97=AC power L2 too high;98=AC voltage L3 too high;99=AC frequency L3 too high;100=AC current L3 too high;101=AC power L3 too high;126=Fuel temperature too high;127=Fuel level too high;130=Lost control unit;131=Lost panel;132=Service needed;133=Lost 3-phase module;134=Lost AGT module;135=Synchronization failure;137=Intake airfilter;139=Lost sync. module;140=Load-balance failed;141=Sync-mode deactivated;142=Engine controller;148=Rotating field wrong;149=Fuel level sensor lost;150=Init failed;151=Watchdog;152=Out: winding;153=Out: exhaust;154=Out: Cyl. head;155=Inverter over temperature;156=Inverter overload;157=Inverter communication lost;158=Inverter sync failed;159=CAN communication lost;160=L1 overload;161=L2 overload;162=L3 overload;163=DC overload;164=DC overvoltage;165=Emergency stop;166=No connection,3214,uint16,1,R +com.victronenergy.genset,/AutoStart,u,0=Disabled;1=Enabled,3215,uint16,1,R +com.victronenergy.genset,/Start,u,0=Stop;1=Start,3223,uint16,1,W +com.victronenergy.genset,/Engine/Load,d,%,3216,uint16,1,R +com.victronenergy.genset,/Engine/Speed,d,RPM,3217,uint16,1,R +com.victronenergy.genset,/Engine/OperatingHours,d,s,3218,uint16,0.01,R +com.victronenergy.genset,/Engine/CoolantTemperature,d,Degrees celsius,3219,int16,10,R +com.victronenergy.genset,/Engine/WindingTemperature,d,Degrees celsius,3220,int16,10,R +com.victronenergy.genset,/Engine/ExaustTemperature,d,Degrees celsius,3221,int16,10,R +com.victronenergy.genset,/StarterVoltage,d,V DC,3222,uint16,100,R +com.victronenergy.genset,/Ac/L1/Voltage,d,V AC,3200,uint16,10,R +com.victronenergy.genset,/Ac/L1/Current,d,A AC,3203,int16,10,R +com.victronenergy.genset,/Ac/L1/Power,d,W,3206,int16,1,R +com.victronenergy.genset,/Ac/L1/Frequency,d,Hz,3209,uint16,100,R +com.victronenergy.genset,/Ac/L2/Voltage,d,V AC,3201,uint16,10,R +com.victronenergy.genset,/Ac/L2/Current,d,A AC,3204,int16,10,R +com.victronenergy.genset,/Ac/L2/Power,d,W,3207,int16,1,R +com.victronenergy.genset,/Ac/L2/Frequency,d,Hz,3210,uint16,100,R +com.victronenergy.genset,/Ac/L3/Voltage,d,V AC,3202,uint16,10,R +com.victronenergy.genset,/Ac/L3/Current,d,A AC,3205,int16,10,R +com.victronenergy.genset,/Ac/L3/Power,d,W,3208,int16,1,R +com.victronenergy.genset,/Ac/L3/Frequency,d,Hz,3211,uint16,100,R +com.victronenergy.temperature,/ProductId,u,,3300,uint16,1,R +com.victronenergy.temperature,/Scale,d,,3301,uint16,100,R +com.victronenergy.temperature,/Offset,d,,3302,int16,100,R +com.victronenergy.temperature,/TemperatureType,u,0=Battery;1=Fridge;2=Generic,3303,uint16,1,R +com.victronenergy.temperature,/Temperature,d,Degrees celsius,3304,int16,100,R +com.victronenergy.temperature,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3305,uint16,1,R +com.victronenergy.temperature,/Humidity,u,%,3306,uint16,10,R +com.victronenergy.temperature,/BatteryVoltage,d,V,3307,uint16,100,R +com.victronenergy.temperature,/Pressure,u,hPa,3308,uint16,1,R +com.victronenergy.pulsemeter,/Aggregate,i,,3400,uint32,1,R +com.victronenergy.pulsemeter,/Count,i,,3402,uint32,1,R +com.victronenergy.digitalinput,/Count,i,,3420,uint32,1,R +com.victronenergy.digitalinput,/State,i,,3422,uint16,1,R +com.victronenergy.digitalinput,/Alarm,i,0=No alarm;2=Alarm,3423,uint16,1,R +com.victronenergy.digitalinput,/Type,i,2=Door;3=Bilge pump;4=Bilge alarm;5=Burglar alarm;6=Smoke alarm;7=Fire alarm;8=CO2 alarm;9=Generator,3424,uint16,1,R;11=ExtTransferSwitch,3424,uint16,1,R +com.victronenergy.generator,/ManualStart,i,0=Stop generator;1=Start generator,3500,uint16,1,W +com.victronenergy.generator,/RunningByConditionCode,i,0=Stopped;1=Manual;2=TestRun;3=LossOfComms;4=Soc;5=AcLoad;6=BatteryCurrent;7=BatteryVoltage;8=InverterTemperatur;9=InverterOverload;10=StopOnAc1,3501,uint16,1,R +com.victronenergy.generator,/Runtime,i,seconds,3502,uint16,1,R +com.victronenergy.generator,/QuietHours,i,0=Quiet hours inactive; 1=Quiet hours active,3503,uint16,1,R +com.victronenergy.generator,/Runtime,u,seconds,3504,uint32,1,R +com.victronenergy.generator,/State,i,0=Stopped;1=Running;10=Error,3506,uint16,1,R +com.victronenergy.generator,/Error,i,0=No Error;1=Remote disabled;2=Remote fault,3507,uint16,1,R +com.victronenergy.generator,/Alarms/NoGeneratorAtAcIn,i,0=No Alarm;2=Alarm,3508,uint16,1,R +com.victronenergy.generator,/AutoStartEnabled,i,0=Autostart disabled;1=Autostart enabled,3509,uint16,1,W +com.victronenergy.meteo,/Irradiance,d,W/m^2,3600,uint16,10,R +com.victronenergy.meteo,/WindSpeed,d,m/s,3601,uint16,10,R +com.victronenergy.meteo,/CellTemperature,d,Degrees celsius,3602,int16,10,R +com.victronenergy.meteo,/ExternalTemperature,d,Degrees celsius,3603,int16,10,R +com.victronenergy.evcharger,/ProductId,u,,3800,uint16,1,R +com.victronenergy.evcharger,/FirmwareVersion,u,,3802,uint32,1,R +com.victronenergy.evcharger,/Serial,s,,3804,string[6],,R +com.victronenergy.evcharger,/Model,s,,3810,string[4],,R +com.victronenergy.evcharger,/MaxCurrent,d,A,3814,uint16,1,W +com.victronenergy.evcharger,/Mode,u,0=Manual;1=Auto,3815,uint16,1,W +com.victronenergy.evcharger,/Ac/Energy/Forward,d,kWh,3816,uint32,100,R +com.victronenergy.evcharger,/Ac/L1/Power,d,W,3818,uint16,1,R +com.victronenergy.evcharger,/Ac/L2/Power,d,W,3819,uint16,1,R +com.victronenergy.evcharger,/Ac/L3/Power,d,W,3820,uint16,1,R +com.victronenergy.evcharger,/Ac/Power,d,W,3821,uint16,1,R +com.victronenergy.evcharger,/ChargingTime,d,s,3822,uint16,0.01,R +com.victronenergy.evcharger,/Current,d,A,3823,uint16,1,W +com.victronenergy.evcharger,/Status,u,0=Disconnected;1=Connected;2=Charging;3=Charged;4=Waiting for sun;5=Waiting for RFID;6=Waiting for start;7=Low SOC;8=Ground fault;9=Welded contacts;10=CP Input shorted;11=Residual current detected;12=Under voltage detected;13=Overvoltage detected;14=Overheating detected,3824,uint16,1,R +com.victronenergy.evcharger,/SetCurrent,d,A,3825,uint16,1,W +com.victronenergy.evcharger,/StartStop,u,0=Stop;1=Start,3826,uint16,1,W +com.victronenergy.evcharger,/Position,i,0=AC input 1;1=AC output;2=AC input 2,3827,uint16,1,W +com.victronenergy.acload,/Ac/L1/Power,d,W,3900,int16,1,R +com.victronenergy.acload,/Ac/L2/Power,d,W,3901,int16,1,R +com.victronenergy.acload,/Ac/L3/Power,d,W,3902,int16,1,R +com.victronenergy.acload,/Serial,s,,3903,string[7],,R +com.victronenergy.acload,/Ac/L1/Voltage,d,V AC,3910,uint16,10,R +com.victronenergy.acload,/Ac/L1/Current,d,A AC,3911,int16,10,R +com.victronenergy.acload,/Ac/L2/Voltage,d,V AC,3912,uint16,10,R +com.victronenergy.acload,/Ac/L2/Current,d,A AC,3913,int16,10,R +com.victronenergy.acload,/Ac/L3/Voltage,d,V AC,3914,uint16,10,R +com.victronenergy.acload,/Ac/L3/Current,d,A AC,3915,int16,10,R +com.victronenergy.acload,/Ac/L1/Energy/Forward,d,kWh,3916,uint32,100,R +com.victronenergy.acload,/Ac/L2/Energy/Forward,d,kWh,3918,uint32,100,R +com.victronenergy.acload,/Ac/L3/Energy/Forward,d,kWh,3920,uint32,100,R +com.victronenergy.fuelcell,/Dc/0/Voltage,d,V DC,4000,uint16,100,R +com.victronenergy.fuelcell,/Dc/0/Current,d,A DC,4001,int16,10,R +com.victronenergy.fuelcell,/Dc/1/Voltage,d,V DC,4002,int16,10,R +com.victronenergy.fuelcell,/Dc/0/Temperature,d,Degrees celsius,4003,int16,10,R +com.victronenergy.fuelcell,/History/EnergyOut,d,kWh,4004,uint32,100,R +com.victronenergy.fuelcell,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4006,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4007,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4008,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4009,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4010,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4011,uint16,1,R +com.victronenergy.alternator,/Dc/0/Voltage,d,V DC,4100,uint16,100,R +com.victronenergy.alternator,/Dc/0/Current,d,A DC,4101,int16,10,R +com.victronenergy.alternator,/Dc/1/Voltage,d,V DC,4102,int16,10,R +com.victronenergy.alternator,/Dc/0/Temperature,d,Degrees celsius,4103,int16,10,R +com.victronenergy.alternator,/History/EnergyOut,d,kWh,4104,uint32,100,R +com.victronenergy.alternator,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4106,uint16,1,R +com.victronenergy.alternator,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4107,uint16,1,R +com.victronenergy.alternator,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4108,uint16,1,R +com.victronenergy.alternator,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4109,uint16,1,R +com.victronenergy.alternator,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4110,uint16,1,R +com.victronenergy.alternator,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4111,uint16,1,R +com.victronenergy.alternator,/State,u,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;252=External control,4112,uint16,1,R +com.victronenergy.alternator,/ErrorCode,u,12=High battery temperature;13=High battery voltage;14=Low battery voltage;15=VBat exceeds $CPB;21=High alternator temperature;22=Alternator overspeed;24=Internal error;41=High field FET temperature;42=Sensor missing;43=Low VAlt;44=High Voltage offset;45=VAlt exceeds $CPB;51-52=Battery disconnect request;53=Battery instance out of range;54=Too many BMSes;55=AEBus fault;56=Too many Victron devices;58-61=Battery requested disconnection;91=BMS lost;92=Forced idle;201=DCDC converter fail;201-207=DCDC error,4113,uint16,1,R +com.victronenergy.alternator,/Engine/Speed,d,RPM,4114,uint16,1,R +com.victronenergy.alternator,/Speed,d,RPM,4115,uint16,1,R +com.victronenergy.alternator,/FieldDrive,q,%,4116,uint16,1,R +com.victronenergy.dcsource,/Dc/0/Voltage,d,V DC,4200,uint16,100,R +com.victronenergy.dcsource,/Dc/0/Current,d,A DC,4201,int16,10,R +com.victronenergy.dcsource,/Dc/1/Voltage,d,V DC,4202,int16,10,R +com.victronenergy.dcsource,/Dc/0/Temperature,d,Degrees centigrade,4203,int16,10,R +com.victronenergy.dcsource,/History/EnergyOut,d,kWh,4204,uint32,100,R +com.victronenergy.dcsource,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4206,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4207,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4208,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4209,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4210,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4211,uint16,1,R +com.victronenergy.dcload,/Dc/0/Voltage,d,V DC,4300,uint16,100,R +com.victronenergy.dcload,/Dc/0/Current,d,A DC,4301,int16,10,R +com.victronenergy.dcload,/Dc/1/Voltage,d,V DC,4302,int16,10,R +com.victronenergy.dcload,/Dc/0/Temperature,d,Degrees centigrade,4303,int16,10,R +com.victronenergy.dcload,/History/EnergyIn,d,kWh,4304,uint32,100,R +com.victronenergy.dcload,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4306,uint16,1,R +com.victronenergy.dcload,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4307,uint16,1,R +com.victronenergy.dcload,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4308,uint16,1,R +com.victronenergy.dcload,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4309,uint16,1,R +com.victronenergy.dcload,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4310,uint16,1,R +com.victronenergy.dcload,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4311,uint16,1,R +com.victronenergy.dcsystem,/Dc/0/Voltage,d,V DC,4400,uint16,100,R +com.victronenergy.dcsystem,/Dc/0/Current,d,A DC,4401,int16,10,R +com.victronenergy.dcsystem,/Dc/1/Voltage,d,V DC,4402,int16,10,R +com.victronenergy.dcsystem,/Dc/0/Temperature,d,Degrees centigrade,4403,int16,10,R +com.victronenergy.dcsystem,/History/EnergyOut,d,kWh,4404,uint32,100,R +com.victronenergy.dcsystem,/History/EnergyIn,d,kWh,4406,uint32,100,R +com.victronenergy.dcsystem,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4408,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4409,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4410,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4411,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4412,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4413,uint16,1,R +com.victronenergy.multi,/Ac/In/1/L1/V,d,V AC,4500,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/V,d,V AC,4501,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/V,d,V AC,4502,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/I,d,A AC,4503,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/I,d,A AC,4504,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/I,d,A AC,4505,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/P,d,W,4506,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L2/P,d,W,4507,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L3/P,d,W,4508,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L1/F,d,Hz,4509,uint16,100,R +com.victronenergy.multi,/Ac/Out/L1/V,d,V AC,4510,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/V,d,V AC,4511,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/V,d,V AC,4512,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/I,d,A AC,4513,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/I,d,A AC,4514,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/I,d,A AC,4515,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/P,d,W,4516,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L2/P,d,W,4517,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L3/P,d,W,4518,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L1/F,d,Hz,4519,uint16,100,R +com.victronenergy.multi,/Ac/In/1/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4520,uint16,1,R +com.victronenergy.multi,/Ac/In/2/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4521,uint16,1,R +com.victronenergy.multi,/Ac/In/1/CurrentLimit,d,A,4522,uint16,10,W +com.victronenergy.multi,/Ac/In/2/CurrentLimit,d,A,4523,uint16,10,W +com.victronenergy.multi,/Ac/NumberOfPhases,u,count,4524,uint16,1,R +com.victronenergy.multi,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,4525,uint16,1,R +com.victronenergy.multi,/Dc/0/Voltage,d,V DC,4526,uint16,100,R +com.victronenergy.multi,/Dc/0/Current,d,A DC,4527,int16,10,R +com.victronenergy.multi,/Dc/0/Temperature,d,Degrees celsius,4528,int16,10,R +com.victronenergy.multi,/Soc,d,%,4529,uint16,10,R +com.victronenergy.multi,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=External control,4530,uint16,1,R +com.victronenergy.multi,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,4531,uint16,1,W +com.victronenergy.multi,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,4532,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltage,u,0=Ok;1=Warning;2=Alarm,4533,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4534,uint16,1,R +com.victronenergy.multi,/Alarms/LowTemperature,u,0=Ok;1=Warning;2=Alarm,4535,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltage,u,0=Ok;1=Warning;2=Alarm,4536,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4537,uint16,1,R +com.victronenergy.multi,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,4538,uint16,1,R +com.victronenergy.multi,/Alarms/Ripple,u,0=Ok;1=Warning;2=Alarm,4539,uint16,1,R +com.victronenergy.multi,/Yield/Power,d,W,4540,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4541,uint16,10,R +com.victronenergy.multi,/Relay/0/State,i,0=Open;1=Closed,4542,uint16,1,R +com.victronenergy.multi,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4543,uint16,1,R +com.victronenergy.multi,/Pv/V,d,V DC,4544,uint16,10,R +com.victronenergy.multi,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,4545,uint16,1,R +com.victronenergy.multi,/Energy/AcIn1ToAcOut,d,kWh,4546,uint32,100,R +com.victronenergy.multi,/Energy/AcIn1ToInverter,d,kWh,4548,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToAcOut,d,kWh,4550,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToInverter,d,kWh,4552,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn1,d,kWh,4554,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn2,d,kWh,4556,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn1,d,kWh,4558,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn2,d,kWh,4560,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcOut,d,kWh,4562,uint32,100,R +com.victronenergy.multi,/Energy/OutToInverter,d,kWh,4564,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn1,d,kWh,4566,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn2,d,kWh,4568,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcOut,d,kWh,4570,uint32,100,R +com.victronenergy.multi,/Energy/SolarToBattery,d,kWh,4572,uint32,100,R +com.victronenergy.multi,/History/Daily/0/Yield,d,kWh,4574,uint16,10,R +com.victronenergy.multi,/History/Daily/0/MaxPower,d,W,4575,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Yield,d,kWh,4576,uint16,10,R +com.victronenergy.multi,/History/Daily/1/MaxPower,d,W,4577,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/0/Yield,d,kWh,4578,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/1/Yield,d,kWh,4579,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/2/Yield,d,kWh,4580,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/3/Yield,d,kWh,4581,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/0/Yield,d,kWh,4582,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/1/Yield,d,kWh,4583,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/2/Yield,d,kWh,4584,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/3/Yield,d,kWh,4585,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/0/MaxPower,d,W,4586,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/1/MaxPower,d,W,4587,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/2/MaxPower,d,W,4588,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/3/MaxPower,d,W,4589,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/0/MaxPower,d,W,4590,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/1/MaxPower,d,W,4591,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/2/MaxPower,d,W,4592,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/3/MaxPower,d,W,4593,uint16,1,R +com.victronenergy.multi,/Pv/0/V,d,V DC,4594,uint16,10,R +com.victronenergy.multi,/Pv/1/V,d,V DC,4595,uint16,10,R +com.victronenergy.multi,/Pv/2/V,d,V DC,4596,uint16,10,R +com.victronenergy.multi,/Pv/3/V,d,V DC,4597,uint16,10,R +com.victronenergy.multi,/Pv/0/P,d,W,4598,uint16,1,R +com.victronenergy.multi,/Pv/1/P,d,W,4599,uint16,1,R +com.victronenergy.multi,/Pv/2/P,d,W,4600,uint16,1,R +com.victronenergy.multi,/Pv/3/P,d,W,4601,uint16,1,R +com.victronenergy.multi,/Alarms/LowSoc,u,,4602,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4603,uint32,1,R +com.victronenergy.pump,/State,d,0=Stopped;1=Running,4700,uint16,1,R +com.victronenergy.settings,/Settings/Pump0/AutoStartEnabled,d,0=Disabled;1=Enabled,4701,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/Mode,d,0=Auto;1=On;2=Off,4702,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/StartValue,d,%,4703,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/StopValue,d,%,4704,uint16,1,W diff --git a/FileSets/v3.01/attributes.csv.orig b/FileSets/v3.01/attributes.csv.orig new file mode 100644 index 00000000..57e672c6 --- /dev/null +++ b/FileSets/v3.01/attributes.csv.orig @@ -0,0 +1,641 @@ +com.victronenergy.gps,/Position/Latitude,d,Decimal degrees,2800,int32,10000000,R +com.victronenergy.gps,/Position/Longitude,d,Decimal degrees,2802,int32,10000000,R +com.victronenergy.gps,/Course,d,Degrees,2804,uint16,100,R +com.victronenergy.gps,/Speed,d,m/s,2805,uint16,100,R +com.victronenergy.gps,/Fix,y,,2806,uint16,1,R +com.victronenergy.gps,/NrOfSatellites,y,,2807,uint16,1,R +com.victronenergy.gps,/Altitude,d,m,2808,int32,10,R +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/State,i,0=BL disabled;1=Restarting;2=Self-consumption;3=Self-consumption;4=Self-consumption;5=Discharge disabled;6=Force charge;7=Sustain;9=Keep batteries charged;10=BL Disabled;11=BL Disabled (Low SoC),2900,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/MinimumSocLimit,d,%,2901,uint16,10,W +com.victronenergy.settings,/Settings/CGwacs/Hub4Mode,i,1=ESS with Phase Compensation;2=ESS without phase compensation;3=Disabled/External Control,2902,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/SocLimit,d,%,2903,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/V,d,V AC,3,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/V,d,V AC,4,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/V,d,V AC,5,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/I,d,A AC,6,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/I,d,A AC,7,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/I,d,A AC,8,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/F,d,Hz,9,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/F,d,Hz,10,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/F,d,Hz,11,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/P,i,VA or Watts,12,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/P,i,VA or Watts,13,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/P,i,VA or Watts,14,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L1/V,d,V AC,15,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L2/V,d,V AC,16,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L3/V,d,V AC,17,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L1/I,d,A AC,18,int16,10,R +com.victronenergy.vebus,/Ac/Out/L2/I,d,A AC,19,int16,10,R +com.victronenergy.vebus,/Ac/Out/L3/I,d,A AC,20,int16,10,R +com.victronenergy.vebus,/Ac/Out/L1/F,d,Hz,21,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/CurrentLimit,d,A,22,int16,10,W +com.victronenergy.vebus,/Ac/Out/L1/P,i,VA or Watts,23,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L2/P,i,VA or Watts,24,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L3/P,i,VA or Watts,25,int16,0.1,R +com.victronenergy.vebus,/Dc/0/Voltage,d,V DC,26,uint16,100,R +com.victronenergy.vebus,/Dc/0/Current,d,A DC,27,int16,10,R +com.victronenergy.vebus,/Ac/NumberOfPhases,u,count,28,uint16,1,R +com.victronenergy.vebus,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,29,uint16,1,R +com.victronenergy.vebus,/Soc,d,%,30,uint16,10,W +com.victronenergy.vebus,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=External control,31,uint16,1,R +com.victronenergy.vebus,/VebusError,u,0=No error;1=VE.Bus Error 1: Device is switched off because one of the other phases in the system has switched off;2=VE.Bus Error 2: New and old types MK2 are mixed in the system;3=VE.Bus Error 3: Not all- or more than- the expected devices were found in the system;4=VE.Bus Error 4: No other device whatsoever detected;5=VE.Bus Error 5: Overvoltage on AC-out;6=VE.Bus Error 6: Error in DDC Program;7=VE.Bus BMS connected- which requires an Assistant- but no assistant found;10=VE.Bus Error 10: System time synchronisation problem occurred;14=VE.Bus Error 14: Device cannot transmit data;16=VE.Bus Error 16: Dongle missing;17=VE.Bus Error 17: One of the devices assumed master status because the original master failed;18=VE.Bus Error 18: AC Overvoltage on the output of a slave has occurred while already switched off;22=VE.Bus Error 22: This device cannot function as slave;24=VE.Bus Error 24: Switch-over system protection initiated;25=VE.Bus Error 25: Firmware incompatibility. The firmware of one of the connected device is not sufficiently up to date to operate in conjunction with this device;26=VE.Bus Error 26: Internal error,32,uint16,1,R +com.victronenergy.vebus,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,33,uint16,1,W +com.victronenergy.vebus,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,34,uint16,1,R +com.victronenergy.vebus,/Alarms/LowBattery,u,0=Ok;1=Warning;2=Alarm,35,uint16,1,R +com.victronenergy.vebus,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,36,uint16,1,R +com.victronenergy.vebus,/Alarms/TemperatureSensor,u,0=Ok;1=Warning;2=Alarm,42,uint16,1,R +com.victronenergy.vebus,/Alarms/VoltageSensor,u,0=Ok;1=Warning;2=Alarm,43,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/HighTemperature,u,0=Ok;1=Warning;2=Alarm,44,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/LowBattery,u,0=Ok;1=Warning;2=Alarm,45,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Overload,u,0=Ok;1=Warning;2=Alarm,46,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Ripple,u,0=Ok;1=Warning;2=Alarm,47,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/HighTemperature,u,0=Ok;1=Warning;2=Alarm,48,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/LowBattery,u,0=Ok;1=Warning;2=Alarm,49,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Overload,u,0=Ok;1=Warning;2=Alarm,50,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Ripple,u,0=Ok;1=Warning;2=Alarm,51,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/HighTemperature,u,0=Ok;1=Warning;2=Alarm,52,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/LowBattery,u,0=Ok;1=Warning;2=Alarm,53,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Overload,u,0=Ok;1=Warning;2=Alarm,54,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Ripple,u,0=Ok;1=Warning;2=Alarm,55,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,37,int16,1,W +com.victronenergy.vebus,/Hub4/DisableCharge,u,0=Charge allowed;1=Charge disabled,38,uint16,1,W +com.victronenergy.vebus,/Hub4/DisableFeedIn,u,0=Feed in allowed;1=Feed in disabled,39,uint16,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,40,int16,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,41,int16,1,W +com.victronenergy.vebus,/PvInverter/Disable,u,0=PV enabled;1=PV disabled,56,uint16,1,W +com.victronenergy.vebus,/Bms/AllowToCharge,u,0=No;1=Yes,57,uint16,1,R +com.victronenergy.vebus,/Bms/AllowToDischarge,u,0=No;1=Yes,58,uint16,1,R +com.victronenergy.vebus,/Bms/BmsExpected,u,0=No;1=Yes,59,uint16,1,R +com.victronenergy.vebus,/Bms/Error,u,0=No;1=Yes,60,uint16,1,R +com.victronenergy.vebus,/Dc/0/Temperature,d,Degrees celsius,61,int16,10,R +com.victronenergy.vebus,/SystemReset,y,0=No action;1=VE.Bus Reset,62,uint16,1,W +com.victronenergy.vebus,/Alarms/PhaseRotation,u,0=Ok;1=Warning,63,uint16,1,R +com.victronenergy.vebus,/Alarms/GridLost,i,0=No alarm;2=Alarm,64,uint16,1,R +com.victronenergy.vebus,/Alarms/BmsPreAlarm,u,0=OK;1=Pre-Alarm,94,uint16,1,R +com.victronenergy.vebus,/Hub4/DoNotFeedInOvervoltage,i,0=Feed in overvoltage;1=Don't feed in overvoltage,65,uint16,1,W +com.victronenergy.vebus,/Hub4/L1/MaxFeedInPower,d,W,66,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L2/MaxFeedInPower,d,W,67,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L3/MaxFeedInPower,d,W,68,uint16,0.01,W +com.victronenergy.vebus,/Ac/State/IgnoreAcIn1,i,0=AC input not ignored; 1=AC input ignored,69,uint16,1,R +com.victronenergy.vebus,/Ac/State/IgnoreAcIn2,i,0=AC input not ignored; 1=AC input ignored,70,uint16,1,R +com.victronenergy.vebus,/Hub4/TargetPowerIsMaxFeedIn,i,0=AcPowerSetpoint interpreted normally; 1=AcPowerSetpoint as OvervoltageFeedIn limit,71,uint16,,W +com.victronenergy.vebus,/Hub4/FixSolarOffsetTo100mV,i,0=OvervoltageFeedIn uses 1V offset; 1=OvervoltageFeedIn uses 0.1V offset,72,uint16,,W +com.victronenergy.vebus,/Hub4/Sustain,i,0=Sustain inactive; 1=Sustain active,73,uint16,1,R +com.victronenergy.vebus,/Energy/AcIn1ToAcOut,d,kWh,74,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn1ToInverter,d,kWh,76,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToAcOut,d,kWh,78,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToInverter,d,kWh,80,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn1,d,kWh,82,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn2,d,kWh,84,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn1,d,kWh,86,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn2,d,kWh,88,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcOut,d,kWh,90,uint32,100,R +com.victronenergy.vebus,/Energy/OutToInverter,d,kWh,92,uint32,100,R +com.victronenergy.vebus,/VebusChargeState,u,0=Initialising;1=Bulk;2=Absorption;3=Float;4=Storage;5=Absorb repeat;6=Forced absorb;7=Equalise;8=Bulk stopped;9=Unknown,95,uint16,1,R +com.victronenergy.battery,/Dc/0/Power,i,W,258,int16,1,R +com.victronenergy.battery,/Dc/0/Voltage,d,V DC,259,uint16,100,R +com.victronenergy.battery,/Dc/1/Voltage,d,V DC,260,uint16,100,R +com.victronenergy.battery,/Dc/0/Current,d,A DC,261,int16,10,R +com.victronenergy.battery,/Dc/0/Temperature,d,Degrees celsius,262,int16,10,R +com.victronenergy.battery,/Dc/0/MidVoltage,d,V DC,263,uint16,100,R +com.victronenergy.battery,/Dc/0/MidVoltageDeviation,d,%,264,uint16,100,R +com.victronenergy.battery,/ConsumedAmphours,d,Ah,265,uint16,-10,R +com.victronenergy.battery,/Soc,y,%,266,uint16,10,R +com.victronenergy.battery,/Soh,y,%,304,uint16,10,R +com.victronenergy.battery,/TimeToGo,q,seconds,303,uint16,0.01,R +com.victronenergy.battery,/Info/MaxChargeVoltage,u,V DC,305,uint16,10,R +com.victronenergy.battery,/Info/BatteryLowVoltage,u,V DC,306,uint16,10,R +com.victronenergy.battery,/Info/MaxChargeCurrent,u,A DC,307,uint16,10,R +com.victronenergy.battery,/Info/MaxDischargeCurrent,u,A DC,308,uint16,10,R +com.victronenergy.battery,/Alarms/Alarm,y,0=No alarm;2=Alarm,267,uint16,1,R +com.victronenergy.battery,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,268,uint16,1,R +com.victronenergy.battery,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,269,uint16,1,R +com.victronenergy.battery,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,270,uint16,1,R +com.victronenergy.battery,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,271,uint16,1,R +com.victronenergy.battery,/Alarms/LowSoc,u,0=No alarm;2=Alarm,272,uint16,1,R +com.victronenergy.battery,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,273,uint16,1,R +com.victronenergy.battery,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,274,uint16,1,R +com.victronenergy.battery,/Alarms/MidVoltage,u,0=No alarm;2=Alarm,275,uint16,1,R +com.victronenergy.battery,/Alarms/LowFusedVoltage,u,0=No alarm;2=Alarm,276,uint16,1,R +com.victronenergy.battery,/Alarms/HighFusedVoltage,u,0=No alarm;2=Alarm,277,uint16,1,R +com.victronenergy.battery,/Alarms/FuseBlown,u,0=No alarm;2=Alarm,278,uint16,1,R +com.victronenergy.battery,/Alarms/HighInternalTemperature,u,0=No alarm;2=Alarm,279,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeCurrent,u,0=No alarm;2=Alarm,320,uint16,1,R +com.victronenergy.battery,/Alarms/HighDischargeCurrent,u,0=No alarm;2=Alarm,321,uint16,1,R +com.victronenergy.battery,/Alarms/CellImbalance,u,0=No alarm;2=Alarm,322,uint16,1,R +com.victronenergy.battery,/Alarms/InternalFailure,u,0=No alarm;2=Alarm,323,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeTemperature,u,0=No alarm;2=Alarm,324,uint16,1,R +com.victronenergy.battery,/Alarms/LowChargeTemperature,u,0=No alarm;2=Alarm,325,uint16,1,R +com.victronenergy.battery,/Alarms/LowCellVoltage,u,0=No alarm;1=Almost discharged;2=Alarm,326,uint16,1,R +com.victronenergy.battery,/Relay/0/State,y,0=Open;1=Closed,280,uint16,1,W +com.victronenergy.battery,/History/DeepestDischarge,d,Ah,281,uint16,-10,R +com.victronenergy.battery,/History/LastDischarge,d,Ah,282,uint16,-10,R +com.victronenergy.battery,/History/AverageDischarge,d,Ah,283,uint16,-10,R +com.victronenergy.battery,/History/ChargeCycles,i,count,284,uint16,1,R +com.victronenergy.battery,/History/FullDischarges,i,count,285,uint16,1,R +com.victronenergy.battery,/History/TotalAhDrawn,d,Ah,286,uint16,-10,R +com.victronenergy.battery,/History/MinimumVoltage,d,V DC,287,uint16,100,R +com.victronenergy.battery,/History/MaximumVoltage,d,V DC,288,uint16,100,R +com.victronenergy.battery,/History/TimeSinceLastFullCharge,i,seconds,289,uint16,0.01,R +com.victronenergy.battery,/History/AutomaticSyncs,i,count,290,uint16,1,R +com.victronenergy.battery,/History/LowVoltageAlarms,i,count,291,uint16,1,R +com.victronenergy.battery,/History/HighVoltageAlarms,i,count,292,uint16,1,R +com.victronenergy.battery,/History/LowStarterVoltageAlarms,i,count,293,uint16,1,R +com.victronenergy.battery,/History/HighStarterVoltageAlarms,i,count,294,uint16,1,R +com.victronenergy.battery,/History/MinimumStarterVoltage,d,V DC,295,uint16,100,R +com.victronenergy.battery,/History/MaximumStarterVoltage,d,V DC,296,uint16,100,R +com.victronenergy.battery,/History/LowFusedVoltageAlarms,i,count,297,uint16,1,R +com.victronenergy.battery,/History/HighFusedVoltageAlarms,i,count,298,uint16,1,R +com.victronenergy.battery,/History/MinimumFusedVoltage,d,V DC,299,uint16,100,R +com.victronenergy.battery,/History/MaximumFusedVoltage,d,V DC,300,uint16,100,R +com.victronenergy.battery,/History/DischargedEnergy,d,kWh,301,uint16,10,R +com.victronenergy.battery,/History/ChargedEnergy,d,kWh,302,uint16,10,R +com.victronenergy.battery,/Capacity,d,Ah,309,uint16,10,R +com.victronenergy.battery,/State,y,0=Initializing (Wait start);1=Initializing (before boot);2=Initializing (Before boot delay);3=Initializing (Wait boot);4=Initializing;5=Initializing (Measure battery voltage);6=Initializing (Calculate battery voltage);7=Initializing (Wait bus voltage);8=Initializing (Wait for lynx shunt);9=Running;10=Error;11=Unused;12=Shutdown;13=Slave updating;14=Standby;15=Going to run;16=Per-charging;17=Contactor check,1282,uint16,1,R +com.victronenergy.battery,/ErrorCode,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1283,uint16,1,R +com.victronenergy.battery,/SystemSwitch,y,0=Disabled;1=Enabled,1284,uint16,1,R +com.victronenergy.battery,/Balancing,y,0=Inactive;1=Active,1285,uint16,1,R +com.victronenergy.battery,/System/NrOfBatteries,y,count,1286,uint16,1,R +com.victronenergy.battery,/System/BatteriesParallel,y,count,1287,uint16,1,R +com.victronenergy.battery,/System/BatteriesSeries,y,count,1288,uint16,1,R +com.victronenergy.battery,/System/NrOfCellsPerBattery,y,count,1289,uint16,1,R +com.victronenergy.battery,/System/MinCellVoltage,d,V DC,1290,uint16,100,R +com.victronenergy.battery,/System/MaxCellVoltage,d,V DC,1291,uint16,100,R +com.victronenergy.battery,/Diagnostics/ShutDownsDueError,q,count,1292,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1293,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1294,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1295,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1296,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Time,u,,310,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Time,u,,312,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Time,u,,314,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Time,u,,316,int32,1,R +com.victronenergy.battery,/System/MinCellTemperature,d,Degrees celsius,318,int16,10,R +com.victronenergy.battery,/System/MaxCellTemperature,d,Degrees celsius,319,int16,10,R +com.victronenergy.battery,/Io/AllowToCharge,y,0=No;1=Yes,1297,uint16,1,R +com.victronenergy.battery,/Io/AllowToDischarge,y,0=No;1=Yes,1298,uint16,1,R +com.victronenergy.battery,/Io/ExternalRelay,y,0=Inactive;1=Active,1299,uint16,1,R +com.victronenergy.battery,/History/MinimumCellVoltage,d,V DC,1300,uint16,100,R +com.victronenergy.battery,/History/MaximumCellVoltage,d,V DC,1301,uint16,100,R +com.victronenergy.battery,/System/NrOfModulesOffline,u,,1302,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesOnline,u,,1303,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingCharge,u,,1304,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingDischarge,u,,1305,uint16,1,R +com.victronenergy.battery,/System/MinVoltageCellId,s,,1306,string[4],1,R +com.victronenergy.battery,/System/MaxVoltageCellId,s,,1310,string[4],1,R +com.victronenergy.battery,/System/MinTemperatureCellId,s,,1314,string[4],1,R +com.victronenergy.battery,/System/MaxTemperatureCellId,s,,1318,string[4],1,R +com.victronenergy.battery,/Mode,i,3=On;252=Standby,1319,uint16,1,W +com.victronenergy.solarcharger,/Dc/0/Voltage,d,V DC,771,uint16,100,R +com.victronenergy.solarcharger,/Dc/0/Current,d,A DC,772,int16,10,R +com.victronenergy.solarcharger,/Dc/0/Temperature,d,Degrees celsius,773,int16,10,R +com.victronenergy.solarcharger,/Mode,i,1=On;4=Off,774,uint16,1,W +com.victronenergy.solarcharger,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;11=Other (Hub-1);252=Hub-1,775,uint16,1,R +com.victronenergy.solarcharger,/Pv/V,d,V DC,776,uint16,100,R +com.victronenergy.solarcharger,/Pv/I,d,A DC,777,,10,R,HANDLED IN mappings.c +com.victronenergy.solarcharger,/Yield/Power,d,W,789,uint16,10,R +com.victronenergy.solarcharger,/Equalization/Pending,i,0=No;1=Yes;2=Error;3=Unavailable- Unknown,778,uint16,1,R +com.victronenergy.solarcharger,/Equalization/TimeRemaining,d,seconds,779,uint16,10,R +com.victronenergy.solarcharger,/Relay/0/State,i,0=Open;1=Closed,780,uint16,1,R +com.victronenergy.solarcharger,/Alarms/Alarm,i,0=No alarm;2=Alarm,781,uint16,1,R +com.victronenergy.solarcharger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,782,uint16,1,R +com.victronenergy.solarcharger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,783,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Yield,d,kWh,784,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/MaxPower,d,W,785,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Yield,d,kWh,786,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/MaxPower,d,W,787,uint16,1,R +com.victronenergy.solarcharger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,788,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,790,uint16,10,R +com.victronenergy.solarcharger,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,791,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/V,d,V DC,3700,uint16,100,R +com.victronenergy.solarcharger,/Pv/1/V,d,V DC,3701,uint16,100,R +com.victronenergy.solarcharger,/Pv/2/V,d,V DC,3702,uint16,100,R +com.victronenergy.solarcharger,/Pv/3/V,d,V DC,3703,uint16,100,R +com.victronenergy.solarcharger,RESERVED,d,,3704,reserved[4],1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/Yield,d,kWh,3708,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/Yield,d,kWh,3709,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/Yield,d,kWh,3710,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/Yield,d,kWh,3711,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/Yield,d,kWh,3712,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/Yield,d,kWh,3713,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/Yield,d,kWh,3714,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/Yield,d,kWh,3715,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/MaxPower,d,W,3716,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/MaxPower,d,W,3717,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/MaxPower,d,W,3718,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/MaxPower,d,W,3719,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/MaxPower,d,W,3720,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/MaxPower,d,W,3721,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/MaxPower,d,W,3722,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/MaxPower,d,W,3723,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/P,d,W,3724,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/P,d,W,3725,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/P,d,W,3726,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/P,d,W,3727,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,3728,uint32,1,R +com.victronenergy.solarcharger,/Yield/Power,d,W,3730,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L1/Power,d,W,808,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L2/Power,d,W,809,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L3/Power,d,W,810,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L1/Power,d,W,811,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L2/Power,d,W,812,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L3/Power,d,W,813,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L1/Power,d,W,814,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L2/Power,d,W,815,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L3/Power,d,W,816,uint16,1,R +com.victronenergy.system,/Dc/Pv/Power,d,W,850,uint16,1,R +com.victronenergy.system,/Dc/Pv/Current,d,A DC,851,int16,10,R +com.victronenergy.system,/Dc/Charger/Power,d,W,855,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L1/Power,d,W,817,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L2/Power,d,W,818,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L3/Power,d,W,819,uint16,1,R +com.victronenergy.system,/Ac/Grid/L1/Power,d,W,820,int16,1,R +com.victronenergy.system,/Ac/Grid/L2/Power,d,W,821,int16,1,R +com.victronenergy.system,/Ac/Grid/L3/Power,d,W,822,int16,1,R +com.victronenergy.system,/Ac/Genset/L1/Power,d,W,823,int16,1,R +com.victronenergy.system,/Ac/Genset/L2/Power,d,W,824,int16,1,R +com.victronenergy.system,/Ac/Genset/L3/Power,d,W,825,int16,1,R +com.victronenergy.system,/Ac/ActiveIn/Source,u,0=Not available;1=Grid;2=Generator;3=Shore power;240=Not connected,826,int16,1,R +com.victronenergy.system,/Dc/System/Power,d,W,860,int16,1,R +com.victronenergy.system,/Dc/Battery/Voltage,d,V DC,840,uint16,10,R +com.victronenergy.system,/Dc/Battery/Current,d,A DC,841,int16,10,R +com.victronenergy.system,/Dc/Battery/Power,d,W,842,int16,1,R +com.victronenergy.system,/Dc/Vebus/Current,d,A DC,865,int16,10,R +com.victronenergy.system,/Dc/Vebus/Power,d,W,866,int16,1,R +com.victronenergy.system,/Dc/Battery/Soc,d,%,843,uint16,1,R +com.victronenergy.system,/Dc/Battery/State,i,0=idle;1=charging;2=discharging,844,uint16,1,R +com.victronenergy.system,/Dc/Battery/ConsumedAmphours,d,Ah,845,uint16,-10,R +com.victronenergy.system,/Dc/Battery/TimeToGo,d,s,846,uint16,0.01,R +com.victronenergy.system,/Relay/0/State,i,0=Open;1=Closed,806,uint16,1,W +com.victronenergy.system,/Relay/1/State,i,0=Open;1=Closed,807,uint16,1,W +com.victronenergy.system,/Serial,s,,800,string[6],1,R +com.victronenergy.pvinverter,/Position,i,0=AC input 1;1=AC output;2=AC input 2,1026,uint16,1,R +com.victronenergy.pvinverter,/Serial,s,,1039,string[7],1,R +com.victronenergy.pvinverter,/Ac/L1/Voltage,d,V AC,1027,uint16,10,R +com.victronenergy.pvinverter,/Ac/L1/Current,d,A AC,1028,int16,10,R +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1029,uint16,1,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1030,uint16,100,R +com.victronenergy.pvinverter,/Ac/L2/Voltage,d,V AC,1031,uint16,10,R +com.victronenergy.pvinverter,/Ac/L2/Current,d,A AC,1032,int16,10,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1033,uint16,1,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1034,uint16,100,R +com.victronenergy.pvinverter,/Ac/L3/Voltage,d,V AC,1035,uint16,10,R +com.victronenergy.pvinverter,/Ac/L3/Current,d,A AC,1036,int16,10,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1037,uint16,1,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1038,uint16,100,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1046,uint32,100,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1048,uint32,100,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1050,uint32,100,R +com.victronenergy.pvinverter,/Ac/Power,i,kW,1052,int32,1,W +com.victronenergy.pvinverter,/Ac/MaxPower,u,kW,1054,uint32,1,W +com.victronenergy.pvinverter,/Ac/PowerLimit,u,kW,1056,uint32,1,W +com.victronenergy.motordrive,/Motor/RPM,d,RPM,2048,int16,1,R +com.victronenergy.motordrive,/Motor/Temperature,d,Degrees celsius,2049,int16,10,R +com.victronenergy.motordrive,/Dc/0/Voltage,d,V DC,2050,uint16,100,R +com.victronenergy.motordrive,/Dc/0/Current,d,A DC,2051,int16,10,R +com.victronenergy.motordrive,/Dc/0/Power,d,W,2052,int16,10,R +com.victronenergy.motordrive,/Controller/Temperature,d,Degrees celsius,2053,int16,10,R +com.victronenergy.charger,/Dc/0/Voltage,d,V DC,2307,uint16,100,R +com.victronenergy.charger,/Dc/0/Current,d,A DC,2308,int16,10,R +com.victronenergy.charger,/Dc/0/Temperature,d,Degrees celsius,2309,int16,10,R +com.victronenergy.charger,/Dc/1/Voltage,d,V DC,2310,uint16,100,R +com.victronenergy.charger,/Dc/1/Current,d,A DC,2311,int16,10,R +com.victronenergy.charger,/Dc/2/Voltage,d,V DC,2312,uint16,100,R +com.victronenergy.charger,/Dc/2/Current,d,A DC,2313,int16,10,R +com.victronenergy.charger,/Ac/In/L1/I,d,A AC,2314,int16,10,R +com.victronenergy.charger,/Ac/In/L1/P,d,W DC,2315,uint16,1,R +com.victronenergy.charger,/Ac/In/CurrentLimit,d,A AC,2316,int16,10,W +com.victronenergy.charger,/Mode,i,0=Off;1=On;2=Error;3=Unavailable- Unknown,2317,uint16,1,W +com.victronenergy.charger,/State,i,0=Off;1=Low Power Mode;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply mode;252=External control,2318,uint16,1,R +com.victronenergy.charger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,2319,uint16,1,R +com.victronenergy.charger,/Relay/0/State,i,0=Open;1=Closed,2320,uint16,1,R +com.victronenergy.charger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,2321,uint16,1,R +com.victronenergy.charger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,2322,uint16,1,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2600,int16,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2601,int16,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2602,int16,1,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2603,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2604,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2605,uint16,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2606,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2607,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2608,uint16,100,R +com.victronenergy.grid,/Serial,s,,2609,string[7],,R +com.victronenergy.grid,/Ac/L1/Voltage,d,V AC,2616,uint16,10,R +com.victronenergy.grid,/Ac/L1/Current,d,A AC,2617,int16,10,R +com.victronenergy.grid,/Ac/L2/Voltage,d,V AC,2618,uint16,10,R +com.victronenergy.grid,/Ac/L2/Current,d,A AC,2619,int16,10,R +com.victronenergy.grid,/Ac/L3/Voltage,d,V AC,2620,uint16,10,R +com.victronenergy.grid,/Ac/L3/Current,d,A AC,2621,int16,10,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2622,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2624,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2626,uint32,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2628,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2630,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2632,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Forward,d,kWh,2634,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Reverse,d,kWh,2636,uint32,100,R +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2700,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2703,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/MaxChargePercentage,d,%,2701,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePercentage,d,%,2702,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePower,d,W,2704,uint16,0.1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeCurrent,d,A,2705,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxFeedInPower,d,W,2706,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/OvervoltageFeedIn,i,0=Don't feed excess DC-coupled PV into grid;1=Feed excess DC-coupled PV into the grid,2707,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/PreventFeedback,i,0=Feed excess AC-coupled PV into grid;1=Don't feed excess AC-coupled PV into the grid,2708,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeVoltage,d,V,2710,uint16,10,W +com.victronenergy.settings,/Settings/SystemSetup/AcInput1,u,0=Unused;1=Grid;2=Genset;3=Shore,2711,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/AcInput2,u,0=Unused;1=Grid;2=Genset;3=Shore,2712,uint16,1,W +com.victronenergy.hub4,/PvPowerLimiterActive,i,0=Feed-in limiting inactive;1=Feed-in limiting active,2709,uint16,1,R +com.victronenergy.tank,/ProductId,u,,3000,uint16,1,R +com.victronenergy.tank,/Capacity,d,m3,3001,uint32,10000,R +com.victronenergy.tank,/FluidType,u,0=Fuel;1=Fresh water;2=Waste water;3=Live well;4=Oil;5=Black water (sewage);6=Gasoline;7=Diesel;8=LPG;9=LNG;10=Hydraulic oil;11=Raw water,3003,uint16,1,R +com.victronenergy.tank,/Level,d,%,3004,uint16,10,R +com.victronenergy.tank,/Remaining,d,m3,3005,uint32,10000,R +com.victronenergy.tank,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3007,uint16,1,R +com.victronenergy.inverter,/ProductId,u,,3127,uint16,1,R +com.victronenergy.inverter,/FirmwareVersion,u,,3125,uint16,1,R +com.victronenergy.inverter,/Ac/Out/L1/I,d,A AC,3100,int16,10,R +com.victronenergy.inverter,/Ac/Out/L1/V,d,V AC,3101,uint16,10,R +com.victronenergy.inverter,/Ac/Out/L1/P,d,W AC,3102,int16,0.1,R +com.victronenergy.inverter,/Alarms/HighTemperature,u,0=No alarm;1=Warning;2=Alarm,3110,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltage,u,0=No alarm;1=Warning;2=Alarm,3111,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3112,uint16,1,R +com.victronenergy.inverter,/Alarms/LowTemperature,u,0=No alarm;1=Warning;2=Alarm,3113,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltage,u,0=No alarm;1=Warning;2=Alarm,3114,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3115,uint16,1,R +com.victronenergy.inverter,/Alarms/Overload,u,0=No alarm;1=Warning;2=Alarm,3116,uint16,1,R +com.victronenergy.inverter,/Alarms/Ripple,u,0=No alarm;1=Warning;2=Alarm,3117,uint16,1,R +com.victronenergy.inverter,/Dc/0/Voltage,d,V DC,3105,uint16,100,R +com.victronenergy.inverter,/Dc/0/Current,d,A DC,3106,int16,10,R +com.victronenergy.inverter,/Mode,u,2=On;4=Off;5=Eco,3126,uint16,1,W +com.victronenergy.inverter,/State,u,0=Off;1=Low power mode (search mode);2=Fault;9=Inverting (on),3128,uint16,1,R +com.victronenergy.inverter,/Energy/InverterToAcOut,d,kWh,3130,uint32,100,R +com.victronenergy.inverter,/Energy/OutToInverter,d,kWh,3132,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToAcOut,d,kWh,3134,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToBattery,d,kWh,3136,uint32,100,R +com.victronenergy.inverter,/Pv/V,d,V DC,3138,uint16,10,R +com.victronenergy.inverter,/Pv/0/V,d,V DC,3140,uint16,10,R +com.victronenergy.inverter,/Pv/1/V,d,V DC,3141,uint16,10,R +com.victronenergy.inverter,/Pv/2/V,d,V DC,3142,uint16,10,R +com.victronenergy.inverter,/Pv/3/V,d,V DC,3143,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/Yield,d,kWh,3148,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/Yield,d,kWh,3149,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/Yield,d,kWh,3150,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/Yield,d,kWh,3151,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/Yield,d,kWh,3152,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/Yield,d,kWh,3153,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/Yield,d,kWh,3154,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/Yield,d,kWh,3155,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/MaxPower,d,W,3156,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/MaxPower,d,W,3157,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/MaxPower,d,W,3158,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/MaxPower,d,W,3159,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/MaxPower,d,W,3160,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/MaxPower,d,W,3161,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/MaxPower,d,W,3162,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/MaxPower,d,W,3163,uint16,1,R +com.victronenergy.inverter,/Pv/0/P,d,W,3164,uint16,1,R +com.victronenergy.inverter,/Pv/1/P,d,W,3165,uint16,1,R +com.victronenergy.inverter,/Pv/2/P,d,W,3166,uint16,1,R +com.victronenergy.inverter,/Pv/3/P,d,W,3167,uint16,1,R +com.victronenergy.inverter,/Alarms/LowSoc,u,,3168,uint16,1,R +com.victronenergy.genset,/ProductId,u,,3212,uint16,1,R +com.victronenergy.genset,/StatusCode,u,0=Standby;1=Startup 1;2=Startup 2;3=Startup 3;4=Startup 4;5=Startup 5;6=Startup 6;7=Startup 7;8=Running;9=Stopping;10=Error,3213,uint16,1,R +com.victronenergy.genset,/ErrorCode,u,0=No error;1=AC voltage L1 too low;2=AC frequency L1 too low;3=AC current too low;4=AC power too low;5=Emergency stop;6=Servo current too low;7=Oil pressure too low;8=Engine temperature too low;9=Winding temperature too low;10=Exhaust temperature too low;13=Starter current too low;14=Glow current too low;15=Glow current too low;16=Fuel holding magnet current too low;17=Stop solenoid hold coil current too low;18=Stop solenoid pull coil current too low;19=Optional DC out current too low;20=5V output voltage too low;21=Boost output current too low;22=Panel supply current too high;25=Starter battery voltage too low;26=Startup aborted (rotation too low);28=Rotation too low;29=Power contactor current too low;30=AC voltage L2 too low;31=AC frequency L2 too low;32=AC current L2 too low;33=AC power L2 too low;34=AC voltage L3 too low;35=AC frequency L3 too low;36=AC current L3 too low;37=AC power L3 too low;62=Fuel temperature too low;63=Fuel level too low;65=AC voltage L1 too high;66=AC frequency too high;67=AC current too high;68=AC power too high;70=Servo current too high;71=Oil pressure too high;72=Engine temperature too high;73=Winding temperature too high;74=Exhaust temperature too low;77=Starter current too low;78=Glow current too high;79=Glow current too high;80=Fuel holding magnet current too high;81=Stop solenoid hold coil current too high;82=Stop solenoid pull coil current too high;83=Optional DC out current too high;84=5V output voltage too high;85=Boost output current too high;89=Starter battery voltage too high;90=Startup aborted (rotation too high);92=Rotation too high;93=Power contactor current too high;94=AC voltage L2 too high;95=AC frequency L2 too high;96=AC current L2 too high;97=AC power L2 too high;98=AC voltage L3 too high;99=AC frequency L3 too high;100=AC current L3 too high;101=AC power L3 too high;126=Fuel temperature too high;127=Fuel level too high;130=Lost control unit;131=Lost panel;132=Service needed;133=Lost 3-phase module;134=Lost AGT module;135=Synchronization failure;137=Intake airfilter;139=Lost sync. module;140=Load-balance failed;141=Sync-mode deactivated;142=Engine controller;148=Rotating field wrong;149=Fuel level sensor lost;150=Init failed;151=Watchdog;152=Out: winding;153=Out: exhaust;154=Out: Cyl. head;155=Inverter over temperature;156=Inverter overload;157=Inverter communication lost;158=Inverter sync failed;159=CAN communication lost;160=L1 overload;161=L2 overload;162=L3 overload;163=DC overload;164=DC overvoltage;165=Emergency stop;166=No connection,3214,uint16,1,R +com.victronenergy.genset,/AutoStart,u,0=Disabled;1=Enabled,3215,uint16,1,R +com.victronenergy.genset,/Start,u,0=Stop;1=Start,3223,uint16,1,W +com.victronenergy.genset,/Engine/Load,d,%,3216,uint16,1,R +com.victronenergy.genset,/Engine/Speed,d,RPM,3217,uint16,1,R +com.victronenergy.genset,/Engine/OperatingHours,d,s,3218,uint16,0.01,R +com.victronenergy.genset,/Engine/CoolantTemperature,d,Degrees celsius,3219,int16,10,R +com.victronenergy.genset,/Engine/WindingTemperature,d,Degrees celsius,3220,int16,10,R +com.victronenergy.genset,/Engine/ExaustTemperature,d,Degrees celsius,3221,int16,10,R +com.victronenergy.genset,/StarterVoltage,d,V DC,3222,uint16,100,R +com.victronenergy.genset,/Ac/L1/Voltage,d,V AC,3200,uint16,10,R +com.victronenergy.genset,/Ac/L1/Current,d,A AC,3203,int16,10,R +com.victronenergy.genset,/Ac/L1/Power,d,W,3206,int16,1,R +com.victronenergy.genset,/Ac/L1/Frequency,d,Hz,3209,uint16,100,R +com.victronenergy.genset,/Ac/L2/Voltage,d,V AC,3201,uint16,10,R +com.victronenergy.genset,/Ac/L2/Current,d,A AC,3204,int16,10,R +com.victronenergy.genset,/Ac/L2/Power,d,W,3207,int16,1,R +com.victronenergy.genset,/Ac/L2/Frequency,d,Hz,3210,uint16,100,R +com.victronenergy.genset,/Ac/L3/Voltage,d,V AC,3202,uint16,10,R +com.victronenergy.genset,/Ac/L3/Current,d,A AC,3205,int16,10,R +com.victronenergy.genset,/Ac/L3/Power,d,W,3208,int16,1,R +com.victronenergy.genset,/Ac/L3/Frequency,d,Hz,3211,uint16,100,R +com.victronenergy.temperature,/ProductId,u,,3300,uint16,1,R +com.victronenergy.temperature,/Scale,d,,3301,uint16,100,R +com.victronenergy.temperature,/Offset,d,,3302,int16,100,R +com.victronenergy.temperature,/TemperatureType,u,0=Battery;1=Fridge;2=Generic,3303,uint16,1,R +com.victronenergy.temperature,/Temperature,d,Degrees celsius,3304,int16,100,R +com.victronenergy.temperature,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3305,uint16,1,R +com.victronenergy.temperature,/Humidity,u,%,3306,uint16,10,R +com.victronenergy.temperature,/BatteryVoltage,d,V,3307,uint16,100,R +com.victronenergy.temperature,/Pressure,u,hPa,3308,uint16,1,R +com.victronenergy.pulsemeter,/Aggregate,i,,3400,uint32,1,R +com.victronenergy.pulsemeter,/Count,i,,3402,uint32,1,R +com.victronenergy.digitalinput,/Count,i,,3420,uint32,1,R +com.victronenergy.digitalinput,/State,i,,3422,uint16,1,R +com.victronenergy.digitalinput,/Alarm,i,0=No alarm;2=Alarm,3423,uint16,1,R +com.victronenergy.digitalinput,/Type,i,2=Door;3=Bilge pump;4=Bilge alarm;5=Burglar alarm;6=Smoke alarm;7=Fire alarm;8=CO2 alarm;9=Generator,3424,uint16,1,R +com.victronenergy.generator,/ManualStart,i,0=Stop generator;1=Start generator,3500,uint16,1,W +com.victronenergy.generator,/RunningByConditionCode,i,0=Stopped;1=Manual;2=TestRun;3=LossOfComms;4=Soc;5=AcLoad;6=BatteryCurrent;7=BatteryVoltage;8=InverterTemperatur;9=InverterOverload;10=StopOnAc1,3501,uint16,1,R +com.victronenergy.generator,/Runtime,i,seconds,3502,uint16,1,R +com.victronenergy.generator,/QuietHours,i,0=Quiet hours inactive; 1=Quiet hours active,3503,uint16,1,R +com.victronenergy.generator,/Runtime,u,seconds,3504,uint32,1,R +com.victronenergy.generator,/State,i,0=Stopped;1=Running;10=Error,3506,uint16,1,R +com.victronenergy.generator,/Error,i,0=No Error;1=Remote disabled;2=Remote fault,3507,uint16,1,R +com.victronenergy.generator,/Alarms/NoGeneratorAtAcIn,i,0=No Alarm;2=Alarm,3508,uint16,1,R +com.victronenergy.generator,/AutoStartEnabled,i,0=Autostart disabled;1=Autostart enabled,3509,uint16,1,W +com.victronenergy.meteo,/Irradiance,d,W/m^2,3600,uint16,10,R +com.victronenergy.meteo,/WindSpeed,d,m/s,3601,uint16,10,R +com.victronenergy.meteo,/CellTemperature,d,Degrees celsius,3602,int16,10,R +com.victronenergy.meteo,/ExternalTemperature,d,Degrees celsius,3603,int16,10,R +com.victronenergy.evcharger,/ProductId,u,,3800,uint16,1,R +com.victronenergy.evcharger,/FirmwareVersion,u,,3802,uint32,1,R +com.victronenergy.evcharger,/Serial,s,,3804,string[6],,R +com.victronenergy.evcharger,/Model,s,,3810,string[4],,R +com.victronenergy.evcharger,/MaxCurrent,d,A,3814,uint16,1,W +com.victronenergy.evcharger,/Mode,u,0=Manual;1=Auto,3815,uint16,1,W +com.victronenergy.evcharger,/Ac/Energy/Forward,d,kWh,3816,uint32,100,R +com.victronenergy.evcharger,/Ac/L1/Power,d,W,3818,uint16,1,R +com.victronenergy.evcharger,/Ac/L2/Power,d,W,3819,uint16,1,R +com.victronenergy.evcharger,/Ac/L3/Power,d,W,3820,uint16,1,R +com.victronenergy.evcharger,/Ac/Power,d,W,3821,uint16,1,R +com.victronenergy.evcharger,/ChargingTime,d,s,3822,uint16,0.01,R +com.victronenergy.evcharger,/Current,d,A,3823,uint16,1,W +com.victronenergy.evcharger,/Status,u,0=Disconnected;1=Connected;2=Charging;3=Charged;4=Waiting for sun;5=Waiting for RFID;6=Waiting for start;7=Low SOC;8=Ground fault;9=Welded contacts;10=CP Input shorted;11=Residual current detected;12=Under voltage detected;13=Overvoltage detected;14=Overheating detected,3824,uint16,1,R +com.victronenergy.evcharger,/SetCurrent,d,A,3825,uint16,1,W +com.victronenergy.evcharger,/StartStop,u,0=Stop;1=Start,3826,uint16,1,W +com.victronenergy.evcharger,/Position,i,0=AC input 1;1=AC output;2=AC input 2,3827,uint16,1,W +com.victronenergy.acload,/Ac/L1/Power,d,W,3900,int16,1,R +com.victronenergy.acload,/Ac/L2/Power,d,W,3901,int16,1,R +com.victronenergy.acload,/Ac/L3/Power,d,W,3902,int16,1,R +com.victronenergy.acload,/Serial,s,,3903,string[7],,R +com.victronenergy.acload,/Ac/L1/Voltage,d,V AC,3910,uint16,10,R +com.victronenergy.acload,/Ac/L1/Current,d,A AC,3911,int16,10,R +com.victronenergy.acload,/Ac/L2/Voltage,d,V AC,3912,uint16,10,R +com.victronenergy.acload,/Ac/L2/Current,d,A AC,3913,int16,10,R +com.victronenergy.acload,/Ac/L3/Voltage,d,V AC,3914,uint16,10,R +com.victronenergy.acload,/Ac/L3/Current,d,A AC,3915,int16,10,R +com.victronenergy.acload,/Ac/L1/Energy/Forward,d,kWh,3916,uint32,100,R +com.victronenergy.acload,/Ac/L2/Energy/Forward,d,kWh,3918,uint32,100,R +com.victronenergy.acload,/Ac/L3/Energy/Forward,d,kWh,3920,uint32,100,R +com.victronenergy.fuelcell,/Dc/0/Voltage,d,V DC,4000,uint16,100,R +com.victronenergy.fuelcell,/Dc/0/Current,d,A DC,4001,int16,10,R +com.victronenergy.fuelcell,/Dc/1/Voltage,d,V DC,4002,int16,10,R +com.victronenergy.fuelcell,/Dc/0/Temperature,d,Degrees celsius,4003,int16,10,R +com.victronenergy.fuelcell,/History/EnergyOut,d,kWh,4004,uint32,100,R +com.victronenergy.fuelcell,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4006,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4007,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4008,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4009,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4010,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4011,uint16,1,R +com.victronenergy.alternator,/Dc/0/Voltage,d,V DC,4100,uint16,100,R +com.victronenergy.alternator,/Dc/0/Current,d,A DC,4101,int16,10,R +com.victronenergy.alternator,/Dc/1/Voltage,d,V DC,4102,int16,10,R +com.victronenergy.alternator,/Dc/0/Temperature,d,Degrees celsius,4103,int16,10,R +com.victronenergy.alternator,/History/EnergyOut,d,kWh,4104,uint32,100,R +com.victronenergy.alternator,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4106,uint16,1,R +com.victronenergy.alternator,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4107,uint16,1,R +com.victronenergy.alternator,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4108,uint16,1,R +com.victronenergy.alternator,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4109,uint16,1,R +com.victronenergy.alternator,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4110,uint16,1,R +com.victronenergy.alternator,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4111,uint16,1,R +com.victronenergy.alternator,/State,u,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;252=External control,4112,uint16,1,R +com.victronenergy.alternator,/ErrorCode,u,12=High battery temperature;13=High battery voltage;14=Low battery voltage;15=VBat exceeds $CPB;21=High alternator temperature;22=Alternator overspeed;24=Internal error;41=High field FET temperature;42=Sensor missing;43=Low VAlt;44=High Voltage offset;45=VAlt exceeds $CPB;51-52=Battery disconnect request;53=Battery instance out of range;54=Too many BMSes;55=AEBus fault;56=Too many Victron devices;58-61=Battery requested disconnection;91=BMS lost;92=Forced idle;201=DCDC converter fail;201-207=DCDC error,4113,uint16,1,R +com.victronenergy.alternator,/Engine/Speed,d,RPM,4114,uint16,1,R +com.victronenergy.alternator,/Speed,d,RPM,4115,uint16,1,R +com.victronenergy.alternator,/FieldDrive,q,%,4116,uint16,1,R +com.victronenergy.dcsource,/Dc/0/Voltage,d,V DC,4200,uint16,100,R +com.victronenergy.dcsource,/Dc/0/Current,d,A DC,4201,int16,10,R +com.victronenergy.dcsource,/Dc/1/Voltage,d,V DC,4202,int16,10,R +com.victronenergy.dcsource,/Dc/0/Temperature,d,Degrees centigrade,4203,int16,10,R +com.victronenergy.dcsource,/History/EnergyOut,d,kWh,4204,uint32,100,R +com.victronenergy.dcsource,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4206,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4207,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4208,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4209,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4210,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4211,uint16,1,R +com.victronenergy.dcload,/Dc/0/Voltage,d,V DC,4300,uint16,100,R +com.victronenergy.dcload,/Dc/0/Current,d,A DC,4301,int16,10,R +com.victronenergy.dcload,/Dc/1/Voltage,d,V DC,4302,int16,10,R +com.victronenergy.dcload,/Dc/0/Temperature,d,Degrees centigrade,4303,int16,10,R +com.victronenergy.dcload,/History/EnergyIn,d,kWh,4304,uint32,100,R +com.victronenergy.dcload,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4306,uint16,1,R +com.victronenergy.dcload,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4307,uint16,1,R +com.victronenergy.dcload,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4308,uint16,1,R +com.victronenergy.dcload,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4309,uint16,1,R +com.victronenergy.dcload,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4310,uint16,1,R +com.victronenergy.dcload,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4311,uint16,1,R +com.victronenergy.dcsystem,/Dc/0/Voltage,d,V DC,4400,uint16,100,R +com.victronenergy.dcsystem,/Dc/0/Current,d,A DC,4401,int16,10,R +com.victronenergy.dcsystem,/Dc/1/Voltage,d,V DC,4402,int16,10,R +com.victronenergy.dcsystem,/Dc/0/Temperature,d,Degrees centigrade,4403,int16,10,R +com.victronenergy.dcsystem,/History/EnergyOut,d,kWh,4404,uint32,100,R +com.victronenergy.dcsystem,/History/EnergyIn,d,kWh,4406,uint32,100,R +com.victronenergy.dcsystem,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4408,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4409,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4410,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4411,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4412,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4413,uint16,1,R +com.victronenergy.multi,/Ac/In/1/L1/V,d,V AC,4500,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/V,d,V AC,4501,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/V,d,V AC,4502,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/I,d,A AC,4503,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/I,d,A AC,4504,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/I,d,A AC,4505,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/P,d,W,4506,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L2/P,d,W,4507,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L3/P,d,W,4508,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L1/F,d,Hz,4509,uint16,100,R +com.victronenergy.multi,/Ac/Out/L1/V,d,V AC,4510,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/V,d,V AC,4511,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/V,d,V AC,4512,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/I,d,A AC,4513,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/I,d,A AC,4514,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/I,d,A AC,4515,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/P,d,W,4516,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L2/P,d,W,4517,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L3/P,d,W,4518,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L1/F,d,Hz,4519,uint16,100,R +com.victronenergy.multi,/Ac/In/1/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4520,uint16,1,R +com.victronenergy.multi,/Ac/In/2/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4521,uint16,1,R +com.victronenergy.multi,/Ac/In/1/CurrentLimit,d,A,4522,uint16,10,W +com.victronenergy.multi,/Ac/In/2/CurrentLimit,d,A,4523,uint16,10,W +com.victronenergy.multi,/Ac/NumberOfPhases,u,count,4524,uint16,1,R +com.victronenergy.multi,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,4525,uint16,1,R +com.victronenergy.multi,/Dc/0/Voltage,d,V DC,4526,uint16,100,R +com.victronenergy.multi,/Dc/0/Current,d,A DC,4527,int16,10,R +com.victronenergy.multi,/Dc/0/Temperature,d,Degrees celsius,4528,int16,10,R +com.victronenergy.multi,/Soc,d,%,4529,uint16,10,R +com.victronenergy.multi,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=External control,4530,uint16,1,R +com.victronenergy.multi,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,4531,uint16,1,W +com.victronenergy.multi,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,4532,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltage,u,0=Ok;1=Warning;2=Alarm,4533,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4534,uint16,1,R +com.victronenergy.multi,/Alarms/LowTemperature,u,0=Ok;1=Warning;2=Alarm,4535,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltage,u,0=Ok;1=Warning;2=Alarm,4536,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4537,uint16,1,R +com.victronenergy.multi,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,4538,uint16,1,R +com.victronenergy.multi,/Alarms/Ripple,u,0=Ok;1=Warning;2=Alarm,4539,uint16,1,R +com.victronenergy.multi,/Yield/Power,d,W,4540,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4541,uint16,10,R +com.victronenergy.multi,/Relay/0/State,i,0=Open;1=Closed,4542,uint16,1,R +com.victronenergy.multi,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4543,uint16,1,R +com.victronenergy.multi,/Pv/V,d,V DC,4544,uint16,10,R +com.victronenergy.multi,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,4545,uint16,1,R +com.victronenergy.multi,/Energy/AcIn1ToAcOut,d,kWh,4546,uint32,100,R +com.victronenergy.multi,/Energy/AcIn1ToInverter,d,kWh,4548,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToAcOut,d,kWh,4550,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToInverter,d,kWh,4552,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn1,d,kWh,4554,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn2,d,kWh,4556,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn1,d,kWh,4558,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn2,d,kWh,4560,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcOut,d,kWh,4562,uint32,100,R +com.victronenergy.multi,/Energy/OutToInverter,d,kWh,4564,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn1,d,kWh,4566,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn2,d,kWh,4568,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcOut,d,kWh,4570,uint32,100,R +com.victronenergy.multi,/Energy/SolarToBattery,d,kWh,4572,uint32,100,R +com.victronenergy.multi,/History/Daily/0/Yield,d,kWh,4574,uint16,10,R +com.victronenergy.multi,/History/Daily/0/MaxPower,d,W,4575,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Yield,d,kWh,4576,uint16,10,R +com.victronenergy.multi,/History/Daily/1/MaxPower,d,W,4577,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/0/Yield,d,kWh,4578,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/1/Yield,d,kWh,4579,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/2/Yield,d,kWh,4580,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/3/Yield,d,kWh,4581,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/0/Yield,d,kWh,4582,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/1/Yield,d,kWh,4583,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/2/Yield,d,kWh,4584,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/3/Yield,d,kWh,4585,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/0/MaxPower,d,W,4586,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/1/MaxPower,d,W,4587,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/2/MaxPower,d,W,4588,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/3/MaxPower,d,W,4589,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/0/MaxPower,d,W,4590,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/1/MaxPower,d,W,4591,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/2/MaxPower,d,W,4592,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/3/MaxPower,d,W,4593,uint16,1,R +com.victronenergy.multi,/Pv/0/V,d,V DC,4594,uint16,10,R +com.victronenergy.multi,/Pv/1/V,d,V DC,4595,uint16,10,R +com.victronenergy.multi,/Pv/2/V,d,V DC,4596,uint16,10,R +com.victronenergy.multi,/Pv/3/V,d,V DC,4597,uint16,10,R +com.victronenergy.multi,/Pv/0/P,d,W,4598,uint16,1,R +com.victronenergy.multi,/Pv/1/P,d,W,4599,uint16,1,R +com.victronenergy.multi,/Pv/2/P,d,W,4600,uint16,1,R +com.victronenergy.multi,/Pv/3/P,d,W,4601,uint16,1,R +com.victronenergy.multi,/Alarms/LowSoc,u,,4602,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4603,uint32,1,R +com.victronenergy.pump,/State,d,0=Stopped;1=Running,4700,uint16,1,R +com.victronenergy.settings,/Settings/Pump0/AutoStartEnabled,d,0=Disabled;1=Enabled,4701,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/Mode,d,0=Auto;1=On;2=Off,4702,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/StartValue,d,%,4703,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/StopValue,d,%,4704,uint16,1,W diff --git a/FileSets/v3.01/dbus_digitalinputs.py b/FileSets/v3.01/dbus_digitalinputs.py new file mode 100755 index 00000000..2ee09d55 --- /dev/null +++ b/FileSets/v3.01/dbus_digitalinputs.py @@ -0,0 +1,596 @@ +#!/usr/bin/python3 -u + +#### modified for ExtTransferSwitch package + +import sys, os +import signal +from threading import Thread +from select import select, epoll, EPOLLPRI +from functools import partial +from collections import namedtuple +from argparse import ArgumentParser +import traceback +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) + +from dbus.mainloop.glib import DBusGMainLoop +import dbus +from gi.repository import GLib +from vedbus import VeDbusService, VeDbusItemImport +from settingsdevice import SettingsDevice + +VERSION = '0.19' +MAXCOUNT = 2**31-1 +SAVEINTERVAL = 60000 + +INPUT_FUNCTION_COUNTER = 1 +INPUT_FUNCTION_INPUT = 2 + +Translation = namedtuple('Translation', ['no', 'yes']) + +# Only append at the end +INPUTTYPES = [ + 'Disabled', + 'Pulse meter', + 'Door', + 'Bilge pump', + 'Bilge alarm', + 'Burglar alarm', + 'Smoke alarm', + 'Fire alarm', + 'CO2 alarm', + 'Generator', + 'Generic I/O', + 'Touch enable', +#### added for ExtTransferSwitch package -- must be LAST in the list + 'Transfer switch' +] + +# Translations. The text will be used only for GetText, it will be translated +# in the gui. +TRANSLATIONS = [ + Translation('low', 'high'), + Translation('off', 'on'), + Translation('no', 'yes'), + Translation('open', 'closed'), + Translation('ok', 'alarm'), + Translation('running', 'stopped'), +#### added for ExtTransferSwitch package + Translation('on generator', 'on grid') +] + +class SystemBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SYSTEM) + +class SessionBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SESSION) + +class BasePulseCounter(object): + pass + +class DebugPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + self.gpiomap[gpio] = None + return 0 + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + for level in cycle([0, 1]): + for gpio in list(self.gpiomap.keys()): + yield gpio, level + sleep(0.25/len(self.gpiomap)) + +class EpollPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + self.states = {} + self.ob = epoll() + + def register(self, path, gpio): + path = os.path.realpath(path) + + # Set up gpio for rising edge interrupts + with open(os.path.join(path, 'edge'), 'ab') as fp: + fp.write(b'both') + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) # flush it in case it's high at startup + self.gpiomap[gpio] = fp + self.states[gpio] = level + self.ob.register(fp, EPOLLPRI) + return level + + def unregister(self, gpio): + fp = self.gpiomap[gpio] + self.ob.unregister(fp) + del self.gpiomap[gpio] + del self.states[gpio] + fp.close() + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + while True: + # We have a timeout of 1 second on the poll, because poll() only + # looks at files in the epoll object at the time poll() was called. + # The timeout means we let other files (added via calls to + # register/unregister) into the loop at least that often. + self.ob.poll(1) + + # When coming out of the epoll call, we read all the gpios to make + # sure we didn't miss any edges. This is a safety fallback that + # ensures everything is up to date once a second, but + # edge-triggered results are handled immediately. + # NOTE: There has not been a report of a missed interrupt yet. + # Belts and suspenders. + for gpio, fp in list(self.gpiomap.items()): + os.lseek(fp.fileno(), 0, os.SEEK_SET) + v = int(os.read(fp.fileno(), 1)) + if v != self.states[gpio]: + self.states[gpio] = v + yield gpio, v + +class PollingPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + path = os.path.realpath(path) + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) + self.gpiomap[gpio] = [fp, level] + return level + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + while True: + for gpio, (fp, level) in list(self.gpiomap.items()): + fp.seek(0, os.SEEK_SET) + v = int(fp.read()) + if v != level: + self.gpiomap[gpio][1] = v + yield gpio, v + sleep(1) + +class HandlerMaker(type): + """ Meta-class for keeping track of all extended classes. """ + def __init__(cls, name, bases, attrs): + if not hasattr(cls, 'handlers'): + cls.handlers = {} + else: + cls.handlers[cls.type_id] = cls + +class PinHandler(object, metaclass=HandlerMaker): + product_id = 0xFFFF + _product_name = 'Generic GPIO' + dbus_name = "digital" + def __init__(self, bus, base, path, gpio, settings): + self.gpio = gpio + self.path = path + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + self.service = VeDbusService( + "{}.{}.input{:02d}".format(base, self.dbus_name, gpio), bus=bus) + + # Add objects required by ve-api + self.service.add_path('/Mgmt/ProcessName', __file__) + self.service.add_path('/Mgmt/ProcessVersion', VERSION) + self.service.add_path('/Mgmt/Connection', path) + self.service.add_path('/DeviceInstance', gpio) + self.service.add_path('/ProductId', self.product_id) + self.service.add_path('/ProductName', self.product_name) + self.service.add_path('/Connected', 1) + + # Custom name setting + def _change_name(p, v): + # This should fire a change event that will update product_name + # below. + settings['name'] = v + return True + + self.service.add_path('/CustomName', settings['name'], writeable=True, + onchangecallback=_change_name) + + # We'll count the pulses for all types of services + self.service.add_path('/Count', value=settings['count']) + + @property + def product_name(self): + return self.settings['name'] or self._product_name + + @product_name.setter + def product_name(self, v): + # Some pin types don't have an associated service (Disabled pins for + # example) + if self.service is not None: + self.service['/ProductName'] = v or self._product_name + + def deactivate(self): + self.save_count() + self.service.__del__() + del self.service + self.service = None + + @property + def level(self): + return self._level + + @level.setter + def level(self, l): + self._level = int(bool(l)) + + def toggle(self, level): + raise NotImplementedError + + def _toggle(self, level, service): + # Only increment Count on rising edge. + if level and level != self._level: + service['/Count'] = (service['/Count']+1) % MAXCOUNT + self._level = level + + def refresh(self): + """ Toggle state to last remembered state. This is called if settings + are changed so the Service can recalculate paths. """ + self.toggle(self._level) + + def save_count(self): + if self.service is not None: + self.settings['count'] = self.count + + @property + def active(self): + return self.service is not None + + @property + def count(self): + return self.service['/Count'] + + @count.setter + def count(self, v): + self.service['/Count'] = v + + @classmethod + def createHandler(cls, _type, *args, **kwargs): + if _type in cls.handlers: + return cls.handlers[_type](*args, **kwargs) + return None + + +class NopPin(object): + """ Mixin for a pin with empty behaviour. Mix in BEFORE PinHandler so that + __init__ overrides the base behaviour. """ + def __init__(self, bus, base, path, gpio, settings): + self.service = None + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + def deactivate(self): + pass + + def toggle(self, level): + self._level = level + + def save_count(self): + # Do nothing + pass + + @property + def count(self): + return self.settings['count'] + + @count.setter + def count(self, v): + pass + + def refresh(self): + pass + + +class DisabledPin(NopPin, PinHandler): + """ Place holder for a disabled pin. """ + _product_name = 'Disabled' + type_id = 0 + + +class VolumeCounter(PinHandler): + product_id = 0xA165 + _product_name = "Generic pulse meter" + dbus_name = "pulsemeter" + type_id = 1 + + def __init__(self, bus, base, path, gpio, settings): + super(VolumeCounter, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/Aggregate', value=self.count*self.rate, + gettextcallback=lambda p, v: (str(v) + ' cubic meter')) + + @property + def rate(self): + return self.settings['rate'] + + def toggle(self, level): + with self.service as s: + super(VolumeCounter, self)._toggle(level, s) + s['/Aggregate'] = self.count * self.rate + +class TouchEnable(NopPin, PinHandler): + """ The pin is used to enable/disable the Touch screen when toggled. + No dbus-service is created. """ + _product_name = 'TouchEnable' + type_id = 11 + + def __init__(self, *args, **kwargs): + super(TouchEnable, self).__init__(*args, **kwargs) + self.item = VeDbusItemImport(self.bus, + "com.victronenergy.settings", "/Settings/Gui/TouchEnabled") + + def toggle(self, level): + super(TouchEnable, self).toggle(level) + + # Toggle the touch-enable setting on the downward edge. + # Level is expected to be high with the switch open, and + # pulled low when pushed. + if level == 0: + enabled = bool(self.item.get_value()) + self.item.set_value(int(not enabled)) + + def deactivate(self): + # Always re-enable touch when the pin is deactivated. + # This adds another layer of protection against accidental + # lockout. + self.item.set_value(1) + del self.item + +class PinAlarm(PinHandler): + product_id = 0xA166 + _product_name = "Generic digital input" + dbus_name = "digitalinput" + type_id = 0xFF + translation = 0 # low, high + + def __init__(self, bus, base, path, gpio, settings): + super(PinAlarm, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/InputState', value=0) + self.service.add_path('/State', value=self.get_state(0), + gettextcallback=lambda p, v: TRANSLATIONS[v//2][v%2]) + self.service.add_path('/Alarm', value=self.get_alarm_state(0)) + + # Also expose the type + self.service.add_path('/Type', value=self.type_id, + gettextcallback=lambda p, v: INPUTTYPES[v]) + + def toggle(self, level): + with self.service as s: + super(PinAlarm, self)._toggle(level, s) + s['/InputState'] = bool(level)*1 + s['/State'] = self.get_state(level) + # Ensure that the alarm flag resets if the /AlarmSetting config option + # disappears. + s['/Alarm'] = self.get_alarm_state(level) + + def get_state(self, level): + state = level ^ self.settings['invert'] + return 2 * self.translation + state + + def get_alarm_state(self, level): + return 2 * bool( + (level ^ self.settings['invertalarm']) and self.settings['alarm']) + + +# Various types of things we might want to monitor +class DoorSensor(PinAlarm): + _product_name = "Door alarm" + type_id = 2 + translation = 3 # open, closed + +class BilgePump(PinAlarm): + _product_name = "Bilge pump" + type_id = 3 + translation = 1 # off, on + +class BilgeAlarm(PinAlarm): + _product_name = "Bilge alarm" + type_id = 4 + translation = 4 # ok, alarm + +class BurglarAlarm(PinAlarm): + _product_name = "Burglar alarm" + type_id = 5 + translation = 4 # ok, alarm + +class SmokeAlarm(PinAlarm): + _product_name = "Smoke alarm" + type_id = 6 + translation = 4 # ok, alarm + +class FireAlarm(PinAlarm): + _product_name = "Fire alarm" + type_id = 7 + translation = 4 # ok, alarm + +class CO2Alarm(PinAlarm): + _product_name = "CO2 alarm" + type_id = 8 + translation = 4 # ok, alarm + +class Generator(PinAlarm): + _product_name = "Generator" + type_id = 9 + translation = 5 # running, stopped + +class GenericIO(PinAlarm): + _product_name = "Generic I/O" + type_id = 10 + translation = 0 # low, high + +#### added for ExtTransferSwitch package +class TransferSwitch(PinAlarm): + _product_name = "External AC Input transfer switch" + type_id = 12 + translation = 6 # Grid In / Generator In + + +def dbusconnection(): + return SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else SystemBus() + + +def main(): + parser = ArgumentParser(description=sys.argv[0]) + parser.add_argument('--servicebase', + help='Base service name on dbus, default is com.victronenergy', + default='com.victronenergy') + parser.add_argument('--poll', + help='Use a different kind of polling. Options are epoll, dumb and debug', + default='epoll') + parser.add_argument('inputs', nargs='+', help='Path to digital input') + args = parser.parse_args() + + PulseCounter = { + 'debug': DebugPulseCounter, + 'poll': PollingPulseCounter, + }.get(args.poll, EpollPulseCounter) + + DBusGMainLoop(set_as_default=True) + + # Keep track of enabled services + services = {} + inputs = dict(enumerate(args.inputs, 1)) + pulses = PulseCounter() # callable that iterates over pulses + + def register_gpio(path, gpio, bus, settings): + _type = settings['inputtype'] + print ("Registering GPIO {} for type {}".format(gpio, _type)) + + handler = PinHandler.createHandler(_type, + bus, args.servicebase, path, gpio, settings) + services[gpio] = handler + + # Only monitor if enabled + if _type > 0: + handler.level = pulses.register(path, gpio) + handler.refresh() + + def unregister_gpio(gpio): + print ("unRegistering GPIO {}".format(gpio)) + pulses.unregister(gpio) + services[gpio].deactivate() + + def handle_setting_change(inp, setting, old, new): + # This handler may also be called if some attribute of a setting + # is changed, but not the value. Bail if the value is unchanged. + if old == new: + return + + if setting == 'inputtype': + if new: + # Get current bus and settings objects, to be reused + service = services[inp] + bus, settings = service.bus, service.settings + + # Input enabled. If already enabled, unregister the old one first. + if pulses.registered(inp): + unregister_gpio(inp) + + # Before registering the new input, reset its settings to defaults + settings['count'] = 0 + settings['invert'] = 0 + settings['invertalarm'] = 0 + settings['alarm'] = 0 + + # Register it + register_gpio(inputs[inp], inp, bus, settings) + elif old: + # Input disabled + unregister_gpio(inp) + elif setting in ('rate', 'invert', 'alarm', 'invertalarm'): + services[inp].refresh() + elif setting == 'name': + services[inp].product_name = new + elif setting == 'count': + # Don't want this triggered on a period save, so only execute + # if it has changed. + v = int(new) + s = services[inp] + if s.count != v: + s.count = v + s.refresh() + + for inp, pth in inputs.items(): + supported_settings = { + 'inputtype': ['/Settings/DigitalInput/{}/Type'.format(inp), 0, 0, len(INPUTTYPES)-1], + 'rate': ['/Settings/DigitalInput/{}/Multiplier'.format(inp), 0.001, 0, 1.0], + 'count': ['/Settings/DigitalInput/{}/Count'.format(inp), 0, 0, MAXCOUNT, 1], + 'invert': ['/Settings/DigitalInput/{}/InvertTranslation'.format(inp), 0, 0, 1], + 'invertalarm': ['/Settings/DigitalInput/{}/InvertAlarm'.format(inp), 0, 0, 1], + 'alarm': ['/Settings/DigitalInput/{}/AlarmSetting'.format(inp), 0, 0, 1], + 'name': ['/Settings/DigitalInput/{}/CustomName'.format(inp), '', '', ''], + } + bus = dbusconnection() + sd = SettingsDevice(bus, supported_settings, partial(handle_setting_change, inp), timeout=10) + register_gpio(pth, inp, bus, sd) + + def poll(mainloop): + from time import time + idx = 0 + + try: + for inp, level in pulses(): + # epoll object only resyncs once a second. We may receive + # a pulse for something that's been deregistered. + try: + services[inp].toggle(level) + except KeyError: + continue + except: + traceback.print_exc() + mainloop.quit() + + # Need to run the gpio polling in separate thread. Pass in the mainloop so + # the thread can kill us if there is an exception. + mainloop = GLib.MainLoop() + + poller = Thread(target=lambda: poll(mainloop)) + poller.daemon = True + poller.start() + + # Periodically save the counter + def save_counters(): + for inp in inputs: + services[inp].save_count() + return True + GLib.timeout_add(SAVEINTERVAL, save_counters) + + # Save counter on shutdown + signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) + + try: + mainloop.run() + except KeyboardInterrupt: + pass + finally: + save_counters() + +if __name__ == "__main__": + main() diff --git a/FileSets/v3.01/dbus_digitalinputs.py.orig b/FileSets/v3.01/dbus_digitalinputs.py.orig new file mode 100755 index 00000000..d9c90083 --- /dev/null +++ b/FileSets/v3.01/dbus_digitalinputs.py.orig @@ -0,0 +1,584 @@ +#!/usr/bin/python3 -u + +import sys, os +import signal +from threading import Thread +from select import select, epoll, EPOLLPRI +from functools import partial +from collections import namedtuple +from argparse import ArgumentParser +import traceback +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) + +from dbus.mainloop.glib import DBusGMainLoop +import dbus +from gi.repository import GLib +from vedbus import VeDbusService, VeDbusItemImport +from settingsdevice import SettingsDevice + +VERSION = '0.19' +MAXCOUNT = 2**31-1 +SAVEINTERVAL = 60000 + +INPUT_FUNCTION_COUNTER = 1 +INPUT_FUNCTION_INPUT = 2 + +Translation = namedtuple('Translation', ['no', 'yes']) + +# Only append at the end +INPUTTYPES = [ + 'Disabled', + 'Pulse meter', + 'Door', + 'Bilge pump', + 'Bilge alarm', + 'Burglar alarm', + 'Smoke alarm', + 'Fire alarm', + 'CO2 alarm', + 'Generator', + 'Generic I/O', + 'Touch enable', +] + +# Translations. The text will be used only for GetText, it will be translated +# in the gui. +TRANSLATIONS = [ + Translation('low', 'high'), + Translation('off', 'on'), + Translation('no', 'yes'), + Translation('open', 'closed'), + Translation('ok', 'alarm'), + Translation('running', 'stopped') +] + +class SystemBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SYSTEM) + +class SessionBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SESSION) + +class BasePulseCounter(object): + pass + +class DebugPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + self.gpiomap[gpio] = None + return 0 + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + for level in cycle([0, 1]): + for gpio in list(self.gpiomap.keys()): + yield gpio, level + sleep(0.25/len(self.gpiomap)) + +class EpollPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + self.states = {} + self.ob = epoll() + + def register(self, path, gpio): + path = os.path.realpath(path) + + # Set up gpio for rising edge interrupts + with open(os.path.join(path, 'edge'), 'ab') as fp: + fp.write(b'both') + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) # flush it in case it's high at startup + self.gpiomap[gpio] = fp + self.states[gpio] = level + self.ob.register(fp, EPOLLPRI) + return level + + def unregister(self, gpio): + fp = self.gpiomap[gpio] + self.ob.unregister(fp) + del self.gpiomap[gpio] + del self.states[gpio] + fp.close() + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + while True: + # We have a timeout of 1 second on the poll, because poll() only + # looks at files in the epoll object at the time poll() was called. + # The timeout means we let other files (added via calls to + # register/unregister) into the loop at least that often. + self.ob.poll(1) + + # When coming out of the epoll call, we read all the gpios to make + # sure we didn't miss any edges. This is a safety fallback that + # ensures everything is up to date once a second, but + # edge-triggered results are handled immediately. + # NOTE: There has not been a report of a missed interrupt yet. + # Belts and suspenders. + for gpio, fp in list(self.gpiomap.items()): + os.lseek(fp.fileno(), 0, os.SEEK_SET) + v = int(os.read(fp.fileno(), 1)) + if v != self.states[gpio]: + self.states[gpio] = v + yield gpio, v + +class PollingPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + path = os.path.realpath(path) + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) + self.gpiomap[gpio] = [fp, level] + return level + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + while True: + for gpio, (fp, level) in list(self.gpiomap.items()): + fp.seek(0, os.SEEK_SET) + v = int(fp.read()) + if v != level: + self.gpiomap[gpio][1] = v + yield gpio, v + sleep(1) + +class HandlerMaker(type): + """ Meta-class for keeping track of all extended classes. """ + def __init__(cls, name, bases, attrs): + if not hasattr(cls, 'handlers'): + cls.handlers = {} + else: + cls.handlers[cls.type_id] = cls + +class PinHandler(object, metaclass=HandlerMaker): + product_id = 0xFFFF + _product_name = 'Generic GPIO' + dbus_name = "digital" + def __init__(self, bus, base, path, gpio, settings): + self.gpio = gpio + self.path = path + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + self.service = VeDbusService( + "{}.{}.input{:02d}".format(base, self.dbus_name, gpio), bus=bus) + + # Add objects required by ve-api + self.service.add_path('/Mgmt/ProcessName', __file__) + self.service.add_path('/Mgmt/ProcessVersion', VERSION) + self.service.add_path('/Mgmt/Connection', path) + self.service.add_path('/DeviceInstance', gpio) + self.service.add_path('/ProductId', self.product_id) + self.service.add_path('/ProductName', self.product_name) + self.service.add_path('/Connected', 1) + + # Custom name setting + def _change_name(p, v): + # This should fire a change event that will update product_name + # below. + settings['name'] = v + return True + + self.service.add_path('/CustomName', settings['name'], writeable=True, + onchangecallback=_change_name) + + # We'll count the pulses for all types of services + self.service.add_path('/Count', value=settings['count']) + + @property + def product_name(self): + return self.settings['name'] or self._product_name + + @product_name.setter + def product_name(self, v): + # Some pin types don't have an associated service (Disabled pins for + # example) + if self.service is not None: + self.service['/ProductName'] = v or self._product_name + + def deactivate(self): + self.save_count() + self.service.__del__() + del self.service + self.service = None + + @property + def level(self): + return self._level + + @level.setter + def level(self, l): + self._level = int(bool(l)) + + def toggle(self, level): + raise NotImplementedError + + def _toggle(self, level, service): + # Only increment Count on rising edge. + if level and level != self._level: + service['/Count'] = (service['/Count']+1) % MAXCOUNT + self._level = level + + def refresh(self): + """ Toggle state to last remembered state. This is called if settings + are changed so the Service can recalculate paths. """ + self.toggle(self._level) + + def save_count(self): + if self.service is not None: + self.settings['count'] = self.count + + @property + def active(self): + return self.service is not None + + @property + def count(self): + return self.service['/Count'] + + @count.setter + def count(self, v): + self.service['/Count'] = v + + @classmethod + def createHandler(cls, _type, *args, **kwargs): + if _type in cls.handlers: + return cls.handlers[_type](*args, **kwargs) + return None + + +class NopPin(object): + """ Mixin for a pin with empty behaviour. Mix in BEFORE PinHandler so that + __init__ overrides the base behaviour. """ + def __init__(self, bus, base, path, gpio, settings): + self.service = None + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + def deactivate(self): + pass + + def toggle(self, level): + self._level = level + + def save_count(self): + # Do nothing + pass + + @property + def count(self): + return self.settings['count'] + + @count.setter + def count(self, v): + pass + + def refresh(self): + pass + + +class DisabledPin(NopPin, PinHandler): + """ Place holder for a disabled pin. """ + _product_name = 'Disabled' + type_id = 0 + + +class VolumeCounter(PinHandler): + product_id = 0xA165 + _product_name = "Generic pulse meter" + dbus_name = "pulsemeter" + type_id = 1 + + def __init__(self, bus, base, path, gpio, settings): + super(VolumeCounter, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/Aggregate', value=self.count*self.rate, + gettextcallback=lambda p, v: (str(v) + ' cubic meter')) + + @property + def rate(self): + return self.settings['rate'] + + def toggle(self, level): + with self.service as s: + super(VolumeCounter, self)._toggle(level, s) + s['/Aggregate'] = self.count * self.rate + +class TouchEnable(NopPin, PinHandler): + """ The pin is used to enable/disable the Touch screen when toggled. + No dbus-service is created. """ + _product_name = 'TouchEnable' + type_id = 11 + + def __init__(self, *args, **kwargs): + super(TouchEnable, self).__init__(*args, **kwargs) + self.item = VeDbusItemImport(self.bus, + "com.victronenergy.settings", "/Settings/Gui/TouchEnabled") + + def toggle(self, level): + super(TouchEnable, self).toggle(level) + + # Toggle the touch-enable setting on the downward edge. + # Level is expected to be high with the switch open, and + # pulled low when pushed. + if level == 0: + enabled = bool(self.item.get_value()) + self.item.set_value(int(not enabled)) + + def deactivate(self): + # Always re-enable touch when the pin is deactivated. + # This adds another layer of protection against accidental + # lockout. + self.item.set_value(1) + del self.item + +class PinAlarm(PinHandler): + product_id = 0xA166 + _product_name = "Generic digital input" + dbus_name = "digitalinput" + type_id = 0xFF + translation = 0 # low, high + + def __init__(self, bus, base, path, gpio, settings): + super(PinAlarm, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/InputState', value=0) + self.service.add_path('/State', value=self.get_state(0), + gettextcallback=lambda p, v: TRANSLATIONS[v//2][v%2]) + self.service.add_path('/Alarm', value=self.get_alarm_state(0)) + + # Also expose the type + self.service.add_path('/Type', value=self.type_id, + gettextcallback=lambda p, v: INPUTTYPES[v]) + + def toggle(self, level): + with self.service as s: + super(PinAlarm, self)._toggle(level, s) + s['/InputState'] = bool(level)*1 + s['/State'] = self.get_state(level) + # Ensure that the alarm flag resets if the /AlarmSetting config option + # disappears. + s['/Alarm'] = self.get_alarm_state(level) + + def get_state(self, level): + state = level ^ self.settings['invert'] + return 2 * self.translation + state + + def get_alarm_state(self, level): + return 2 * bool( + (level ^ self.settings['invertalarm']) and self.settings['alarm']) + + +# Various types of things we might want to monitor +class DoorSensor(PinAlarm): + _product_name = "Door alarm" + type_id = 2 + translation = 3 # open, closed + +class BilgePump(PinAlarm): + _product_name = "Bilge pump" + type_id = 3 + translation = 1 # off, on + +class BilgeAlarm(PinAlarm): + _product_name = "Bilge alarm" + type_id = 4 + translation = 4 # ok, alarm + +class BurglarAlarm(PinAlarm): + _product_name = "Burglar alarm" + type_id = 5 + translation = 4 # ok, alarm + +class SmokeAlarm(PinAlarm): + _product_name = "Smoke alarm" + type_id = 6 + translation = 4 # ok, alarm + +class FireAlarm(PinAlarm): + _product_name = "Fire alarm" + type_id = 7 + translation = 4 # ok, alarm + +class CO2Alarm(PinAlarm): + _product_name = "CO2 alarm" + type_id = 8 + translation = 4 # ok, alarm + +class Generator(PinAlarm): + _product_name = "Generator" + type_id = 9 + translation = 5 # running, stopped + +class GenericIO(PinAlarm): + _product_name = "Generic I/O" + type_id = 10 + translation = 0 # low, high + + +def dbusconnection(): + return SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else SystemBus() + + +def main(): + parser = ArgumentParser(description=sys.argv[0]) + parser.add_argument('--servicebase', + help='Base service name on dbus, default is com.victronenergy', + default='com.victronenergy') + parser.add_argument('--poll', + help='Use a different kind of polling. Options are epoll, dumb and debug', + default='epoll') + parser.add_argument('inputs', nargs='+', help='Path to digital input') + args = parser.parse_args() + + PulseCounter = { + 'debug': DebugPulseCounter, + 'poll': PollingPulseCounter, + }.get(args.poll, EpollPulseCounter) + + DBusGMainLoop(set_as_default=True) + + # Keep track of enabled services + services = {} + inputs = dict(enumerate(args.inputs, 1)) + pulses = PulseCounter() # callable that iterates over pulses + + def register_gpio(path, gpio, bus, settings): + _type = settings['inputtype'] + print ("Registering GPIO {} for type {}".format(gpio, _type)) + + handler = PinHandler.createHandler(_type, + bus, args.servicebase, path, gpio, settings) + services[gpio] = handler + + # Only monitor if enabled + if _type > 0: + handler.level = pulses.register(path, gpio) + handler.refresh() + + def unregister_gpio(gpio): + print ("unRegistering GPIO {}".format(gpio)) + pulses.unregister(gpio) + services[gpio].deactivate() + + def handle_setting_change(inp, setting, old, new): + # This handler may also be called if some attribute of a setting + # is changed, but not the value. Bail if the value is unchanged. + if old == new: + return + + if setting == 'inputtype': + if new: + # Get current bus and settings objects, to be reused + service = services[inp] + bus, settings = service.bus, service.settings + + # Input enabled. If already enabled, unregister the old one first. + if pulses.registered(inp): + unregister_gpio(inp) + + # Before registering the new input, reset its settings to defaults + settings['count'] = 0 + settings['invert'] = 0 + settings['invertalarm'] = 0 + settings['alarm'] = 0 + + # Register it + register_gpio(inputs[inp], inp, bus, settings) + elif old: + # Input disabled + unregister_gpio(inp) + elif setting in ('rate', 'invert', 'alarm', 'invertalarm'): + services[inp].refresh() + elif setting == 'name': + services[inp].product_name = new + elif setting == 'count': + # Don't want this triggered on a period save, so only execute + # if it has changed. + v = int(new) + s = services[inp] + if s.count != v: + s.count = v + s.refresh() + + for inp, pth in inputs.items(): + supported_settings = { + 'inputtype': ['/Settings/DigitalInput/{}/Type'.format(inp), 0, 0, len(INPUTTYPES)-1], + 'rate': ['/Settings/DigitalInput/{}/Multiplier'.format(inp), 0.001, 0, 1.0], + 'count': ['/Settings/DigitalInput/{}/Count'.format(inp), 0, 0, MAXCOUNT, 1], + 'invert': ['/Settings/DigitalInput/{}/InvertTranslation'.format(inp), 0, 0, 1], + 'invertalarm': ['/Settings/DigitalInput/{}/InvertAlarm'.format(inp), 0, 0, 1], + 'alarm': ['/Settings/DigitalInput/{}/AlarmSetting'.format(inp), 0, 0, 1], + 'name': ['/Settings/DigitalInput/{}/CustomName'.format(inp), '', '', ''], + } + bus = dbusconnection() + sd = SettingsDevice(bus, supported_settings, partial(handle_setting_change, inp), timeout=10) + register_gpio(pth, inp, bus, sd) + + def poll(mainloop): + from time import time + idx = 0 + + try: + for inp, level in pulses(): + # epoll object only resyncs once a second. We may receive + # a pulse for something that's been deregistered. + try: + services[inp].toggle(level) + except KeyError: + continue + except: + traceback.print_exc() + mainloop.quit() + + # Need to run the gpio polling in separate thread. Pass in the mainloop so + # the thread can kill us if there is an exception. + mainloop = GLib.MainLoop() + + poller = Thread(target=lambda: poll(mainloop)) + poller.daemon = True + poller.start() + + # Periodically save the counter + def save_counters(): + for inp in inputs: + services[inp].save_count() + return True + GLib.timeout_add(SAVEINTERVAL, save_counters) + + # Save counter on shutdown + signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) + + try: + mainloop.run() + except KeyboardInterrupt: + pass + finally: + save_counters() + +if __name__ == "__main__": + main() diff --git a/FileSets/v3.01/styles.css b/FileSets/v3.01/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.01/styles.css +++ b/FileSets/v3.01/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.10/Battery.qml b/FileSets/v3.10/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.10/Battery.qml +++ b/FileSets/v3.10/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.10/DetailAcInput.qml b/FileSets/v3.10/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.10/DetailAcInput.qml +++ b/FileSets/v3.10/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.10/DetailInverter.qml b/FileSets/v3.10/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.10/DetailInverter.qml +++ b/FileSets/v3.10/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.10/DetailLoadsCombined.qml b/FileSets/v3.10/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.10/DetailLoadsCombined.qml +++ b/FileSets/v3.10/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.10/DetailLoadsOnInput.qml b/FileSets/v3.10/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.10/DetailLoadsOnInput.qml +++ b/FileSets/v3.10/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.10/DetailLoadsOnOutput.qml b/FileSets/v3.10/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.10/DetailLoadsOnOutput.qml +++ b/FileSets/v3.10/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.10/HubData.qml b/FileSets/v3.10/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.10/HubData.qml +++ b/FileSets/v3.10/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.10/MbEditBox.qml b/FileSets/v3.10/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.10/MbEditBox.qml +++ b/FileSets/v3.10/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.10/MbEditBoxDateTime.qml b/FileSets/v3.10/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.10/MbEditBoxDateTime.qml +++ b/FileSets/v3.10/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.10/MbItem.qml b/FileSets/v3.10/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.10/MbItem.qml +++ b/FileSets/v3.10/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.10/MbItemDigitalInput.qml b/FileSets/v3.10/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.10/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.10/MbSpinBox.qml b/FileSets/v3.10/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.10/MbSpinBox.qml +++ b/FileSets/v3.10/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.10/MbStyle.qml b/FileSets/v3.10/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.10/MbStyle.qml +++ b/FileSets/v3.10/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.10/MbSubMenu.qml b/FileSets/v3.10/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.10/MbSubMenu.qml +++ b/FileSets/v3.10/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.10/Multi.qml b/FileSets/v3.10/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.10/Multi.qml +++ b/FileSets/v3.10/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.10/ObjectAcConnection.qml b/FileSets/v3.10/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.10/ObjectAcConnection.qml +++ b/FileSets/v3.10/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewAcValuesEnhanced.qml b/FileSets/v3.10/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.10/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.10/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewBox.qml b/FileSets/v3.10/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.10/OverviewBox.qml +++ b/FileSets/v3.10/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewConnection.qml b/FileSets/v3.10/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.10/OverviewConnection.qml +++ b/FileSets/v3.10/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewConnectionEnd.qml b/FileSets/v3.10/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.10/OverviewConnectionEnd.qml +++ b/FileSets/v3.10/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewFlowComplex.qml b/FileSets/v3.10/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.10/OverviewFlowComplex.qml +++ b/FileSets/v3.10/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.10/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.10/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.10/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewGridParallel.qml b/FileSets/v3.10/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.10/OverviewGridParallel.qml +++ b/FileSets/v3.10/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewHub.qml b/FileSets/v3.10/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.10/OverviewHub.qml +++ b/FileSets/v3.10/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewHubEnhanced.qml b/FileSets/v3.10/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.10/OverviewHubEnhanced.qml +++ b/FileSets/v3.10/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewMobileEnhanced.qml b/FileSets/v3.10/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.10/OverviewMobileEnhanced.qml +++ b/FileSets/v3.10/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewSolarCharger.qml b/FileSets/v3.10/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.10/OverviewSolarCharger.qml +++ b/FileSets/v3.10/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewSolarInverter.qml b/FileSets/v3.10/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.10/OverviewSolarInverter.qml +++ b/FileSets/v3.10/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewTankDelegate.qml b/FileSets/v3.10/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.10/OverviewTankDelegate.qml +++ b/FileSets/v3.10/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewTanks.qml b/FileSets/v3.10/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.10/OverviewTanks.qml +++ b/FileSets/v3.10/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.10/OverviewTanksTempsDigInputs.qml b/FileSets/v3.10/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.10/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.10/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.10/PageDigitalInput.qml b/FileSets/v3.10/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.10/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.10/PageSettingsGenerator.qml b/FileSets/v3.10/PageSettingsGenerator.qml index d059ed06..a9603955 100644 --- a/FileSets/v3.10/PageSettingsGenerator.qml +++ b/FileSets/v3.10/PageSettingsGenerator.qml @@ -66,7 +66,7 @@ MbPage { description: qsTr("Post-cool-down time") show: capabilities.value & warmupCapability item { - bind: Utils.path(settingsBindPrefix, "/PostCoolDownTime") + bind: Utils.path(settingsBindPrefix, "/GeneratorStopTime") unit: "s" decimals: 0 step: 5 diff --git a/FileSets/v3.10/PageSettingsRelay.qml b/FileSets/v3.10/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.10/PageSettingsRelay.qml +++ b/FileSets/v3.10/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.10/PowerGauge.qml b/FileSets/v3.10/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.10/PowerGauge.qml +++ b/FileSets/v3.10/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.10/Tile.qml b/FileSets/v3.10/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.10/Tile.qml +++ b/FileSets/v3.10/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.10/TileDigIn.qml b/FileSets/v3.10/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.10/TileDigIn.qml +++ b/FileSets/v3.10/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.10/TileRelay.qml b/FileSets/v3.10/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.10/TileRelay.qml +++ b/FileSets/v3.10/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.10/TileText.qml b/FileSets/v3.10/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.10/TileText.qml +++ b/FileSets/v3.10/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.10/attributes.csv b/FileSets/v3.10/attributes.csv new file mode 120000 index 00000000..c6ffacd5 --- /dev/null +++ b/FileSets/v3.10/attributes.csv @@ -0,0 +1 @@ +../v3.20~33/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.10/dbus_digitalinputs.py b/FileSets/v3.10/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.10/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.10/dbus_generator.py b/FileSets/v3.10/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.10/dbus_generator.py +++ b/FileSets/v3.10/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.10/startstop.py b/FileSets/v3.10/startstop.py index 1a19e23e..086fd2f7 100644 --- a/FileSets/v3.10/startstop.py +++ b/FileSets/v3.10/startstop.py @@ -281,7 +281,6 @@ def __init__(self, instance): #### GuiMods warm-up / cool-down self._warmUpEndTime = 0 self._coolDownEndTime = 0 - self._postCoolDownEndTime = 0 self._ac1isIgnored = False self._ac2isIgnored = False self._activeAcInIsIgnored = False @@ -1203,7 +1202,7 @@ def _start_generator(self, condition): self._warmUpEndTime = 0 self._coolDownEndTime = 0 - self._postCoolDownEndTime = 0 + self._stoptime = 0 self._update_remote_switch() else: # WARMUP, COOLDOWN, RUNNING, STOPPING @@ -1234,54 +1233,46 @@ def _stop_generator(self): if running or remote_running: #### GuiMods warm-up / cool-down - # run for cool-down period before stopping - # cooldown end time is updated while generator is running - # and generator feeds Multi AC input - if self._currentTime < self._coolDownEndTime: - if state != States.COOLDOWN: - self._dbusservice['/State'] = States.COOLDOWN + if state == States.RUNNING: + state = States.COOLDOWN + if self._currentTime < self._coolDownEndTime: self.log_info ("starting cool-down") - return - - # When we arrive here, a stop command was given and cool-down period has elapesed - # Stop the engine, but if we're coming from cooldown, delay another - # while in the STOPPING state before reactivating AC-in. - if state == States.COOLDOWN: - self.log_info ("starting post cool-down") - # delay restoring load to give generator a chance to stop - self._postCoolDownEndTime = self._currentTime + self._settings['postcooldowntime'] - self._dbusservice['/State'] = States.STOPPING - self._update_remote_switch() # Stop engine - self.log_info('Stopping generator that was running by %s condition' % - str(self._dbusservice['/RunningByCondition'])) - return - - # Wait for engine stop + elif self._settings['cooldowntime'] != 0: + self.log_info ("skipping cool-down -- no AC load on generator") + + # warm-up should also transition to stopping + # cool-down time will have expired since it's set to 0 when starting + # and there has not yet been a load on the generator + if state in (States.WARMUP, States.COOLDOWN): + # cool down complete + if self._currentTime > self._coolDownEndTime: + state = States.STOPPING + self.log_info('Stopping generator that was running by %s condition' % + str(self._dbusservice['/RunningByCondition'])) + self._update_remote_switch() # Stop engine + self._stoptime = self._currentTime + self._settings['generatorstoptime'] + if self._currentTime < self._stoptime: + self.log_info ("waiting for generator so stop") + if state == States.STOPPING: - if self._currentTime < self._postCoolDownEndTime: - return - else: - self.log_info ("post cool-down delay complete") - - # generator stop was reported when entering post cool-down - # don't report it again - else: - self.log_info('Stopping generator that was running by %s condition' % - str(self._dbusservice['/RunningByCondition'])) - - # All other possibilities are handled now. Cooldown is over or not - # configured and we waited for the generator to shut down. - self._dbusservice['/State'] = States.STOPPED - self._update_remote_switch() + # wait for stop period expired - finish up transition to STOPPED + if self._currentTime > self._stoptime: + if self._settings['generatorstoptime'] != 0: + self.log_info ("generator stop time reached - OK to reconnect AC") + state = States.STOPPED + self._update_remote_switch() + self._dbusservice['/RunningByCondition'] = '' + self._dbusservice['/RunningByConditionCode'] = RunningConditions.Stopped + self._update_accumulated_time() + self._starttime = 0 + self._dbusservice['/Runtime'] = 0 + self._dbusservice['/ManualStartTimer'] = 0 + self._manualstarttimer = 0 + self._last_runtime_update = 0 + + self._dbusservice['/State'] = state #### end GuiMods warm-up / cool-down - self._dbusservice['/RunningByCondition'] = '' - self._dbusservice['/RunningByConditionCode'] = RunningConditions.Stopped - self._update_accumulated_time() - self._starttime = 0 - self._dbusservice['/Runtime'] = 0 - self._dbusservice['/ManualStartTimer'] = 0 - self._manualstarttimer = 0 - self._last_runtime_update = 0 + # This is here so the Multi/Quattro can be told to disconnect AC-in, # so that we can do warm-up and cool-down. @@ -1330,9 +1321,9 @@ def _update_remote_switch(self): self._set_remote_switch_state(dbus.Int32(v, variant_level=1)) #### GuiMods if v == True: - logging.info ("updating remote switch to running") + self.log_info ("updating remote switch to running") else: - logging.info ("updating remote switch to stopped") + self.log_info ("updating remote switch to stopped") def _get_remote_switch_state(self): raise Exception('This function should be overridden') diff --git a/FileSets/v3.10/styles.css b/FileSets/v3.10/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.10/styles.css +++ b/FileSets/v3.10/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.11/Battery.qml b/FileSets/v3.11/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.11/Battery.qml +++ b/FileSets/v3.11/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.11/DetailAcInput.qml b/FileSets/v3.11/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.11/DetailAcInput.qml +++ b/FileSets/v3.11/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.11/DetailInverter.qml b/FileSets/v3.11/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.11/DetailInverter.qml +++ b/FileSets/v3.11/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.11/DetailLoadsCombined.qml b/FileSets/v3.11/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.11/DetailLoadsCombined.qml +++ b/FileSets/v3.11/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.11/DetailLoadsOnInput.qml b/FileSets/v3.11/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.11/DetailLoadsOnInput.qml +++ b/FileSets/v3.11/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.11/DetailLoadsOnOutput.qml b/FileSets/v3.11/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.11/DetailLoadsOnOutput.qml +++ b/FileSets/v3.11/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.11/HubData.qml b/FileSets/v3.11/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.11/HubData.qml +++ b/FileSets/v3.11/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.11/MbEditBox.qml b/FileSets/v3.11/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.11/MbEditBox.qml +++ b/FileSets/v3.11/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.11/MbEditBoxDateTime.qml b/FileSets/v3.11/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.11/MbEditBoxDateTime.qml +++ b/FileSets/v3.11/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.11/MbItem.qml b/FileSets/v3.11/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.11/MbItem.qml +++ b/FileSets/v3.11/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.11/MbItemDigitalInput.qml b/FileSets/v3.11/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.11/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.11/MbSpinBox.qml b/FileSets/v3.11/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.11/MbSpinBox.qml +++ b/FileSets/v3.11/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.11/MbStyle.qml b/FileSets/v3.11/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.11/MbStyle.qml +++ b/FileSets/v3.11/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.11/MbSubMenu.qml b/FileSets/v3.11/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.11/MbSubMenu.qml +++ b/FileSets/v3.11/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.11/Multi.qml b/FileSets/v3.11/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.11/Multi.qml +++ b/FileSets/v3.11/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.11/ObjectAcConnection.qml b/FileSets/v3.11/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.11/ObjectAcConnection.qml +++ b/FileSets/v3.11/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewAcValuesEnhanced.qml b/FileSets/v3.11/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.11/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.11/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewBox.qml b/FileSets/v3.11/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.11/OverviewBox.qml +++ b/FileSets/v3.11/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewConnection.qml b/FileSets/v3.11/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.11/OverviewConnection.qml +++ b/FileSets/v3.11/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewConnectionEnd.qml b/FileSets/v3.11/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.11/OverviewConnectionEnd.qml +++ b/FileSets/v3.11/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewFlowComplex.qml b/FileSets/v3.11/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.11/OverviewFlowComplex.qml +++ b/FileSets/v3.11/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewGeneratorEnhanced.qml b/FileSets/v3.11/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.11/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.11/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.11/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.11/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.11/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewGridParallel.qml b/FileSets/v3.11/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.11/OverviewGridParallel.qml +++ b/FileSets/v3.11/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewHub.qml b/FileSets/v3.11/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.11/OverviewHub.qml +++ b/FileSets/v3.11/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewHubEnhanced.qml b/FileSets/v3.11/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.11/OverviewHubEnhanced.qml +++ b/FileSets/v3.11/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewMobileEnhanced.qml b/FileSets/v3.11/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.11/OverviewMobileEnhanced.qml +++ b/FileSets/v3.11/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewSolarCharger.qml b/FileSets/v3.11/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.11/OverviewSolarCharger.qml +++ b/FileSets/v3.11/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewSolarInverter.qml b/FileSets/v3.11/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.11/OverviewSolarInverter.qml +++ b/FileSets/v3.11/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewTankDelegate.qml b/FileSets/v3.11/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.11/OverviewTankDelegate.qml +++ b/FileSets/v3.11/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewTanks.qml b/FileSets/v3.11/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.11/OverviewTanks.qml +++ b/FileSets/v3.11/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.11/OverviewTanksTempsDigInputs.qml b/FileSets/v3.11/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.11/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.11/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.11/PageDigitalInput.qml b/FileSets/v3.11/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.11/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.11/PageGenerator.qml b/FileSets/v3.11/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.11/PageGenerator.qml +++ b/FileSets/v3.11/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.11/PageSettingsGenerator.qml b/FileSets/v3.11/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.11/PageSettingsGenerator.qml +++ b/FileSets/v3.11/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.11/PageSettingsRelay.qml b/FileSets/v3.11/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.11/PageSettingsRelay.qml +++ b/FileSets/v3.11/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.11/PowerGauge.qml b/FileSets/v3.11/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.11/PowerGauge.qml +++ b/FileSets/v3.11/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.11/Tile.qml b/FileSets/v3.11/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.11/Tile.qml +++ b/FileSets/v3.11/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.11/TileDigIn.qml b/FileSets/v3.11/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.11/TileDigIn.qml +++ b/FileSets/v3.11/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.11/TileRelay.qml b/FileSets/v3.11/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.11/TileRelay.qml +++ b/FileSets/v3.11/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.11/TileText.qml b/FileSets/v3.11/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.11/TileText.qml +++ b/FileSets/v3.11/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.11/attributes.csv b/FileSets/v3.11/attributes.csv new file mode 120000 index 00000000..c6ffacd5 --- /dev/null +++ b/FileSets/v3.11/attributes.csv @@ -0,0 +1 @@ +../v3.20~33/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.11/dbus_digitalinputs.py b/FileSets/v3.11/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.11/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.11/dbus_generator.py b/FileSets/v3.11/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.11/dbus_generator.py +++ b/FileSets/v3.11/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.11/main.qml b/FileSets/v3.11/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.11/main.qml +++ b/FileSets/v3.11/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.11/styles.css b/FileSets/v3.11/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.11/styles.css +++ b/FileSets/v3.11/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.12/Battery.qml b/FileSets/v3.12/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.12/Battery.qml +++ b/FileSets/v3.12/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.12/DetailAcInput.qml b/FileSets/v3.12/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.12/DetailAcInput.qml +++ b/FileSets/v3.12/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.12/DetailInverter.qml b/FileSets/v3.12/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.12/DetailInverter.qml +++ b/FileSets/v3.12/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.12/DetailLoadsCombined.qml b/FileSets/v3.12/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.12/DetailLoadsCombined.qml +++ b/FileSets/v3.12/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.12/DetailLoadsOnInput.qml b/FileSets/v3.12/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.12/DetailLoadsOnInput.qml +++ b/FileSets/v3.12/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.12/DetailLoadsOnOutput.qml b/FileSets/v3.12/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.12/DetailLoadsOnOutput.qml +++ b/FileSets/v3.12/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.12/HubData.qml b/FileSets/v3.12/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.12/HubData.qml +++ b/FileSets/v3.12/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.12/MbEditBox.qml b/FileSets/v3.12/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.12/MbEditBox.qml +++ b/FileSets/v3.12/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.12/MbEditBoxDateTime.qml b/FileSets/v3.12/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.12/MbEditBoxDateTime.qml +++ b/FileSets/v3.12/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.12/MbItem.qml b/FileSets/v3.12/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.12/MbItem.qml +++ b/FileSets/v3.12/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.12/MbItemDigitalInput.qml b/FileSets/v3.12/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.12/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.12/MbSpinBox.qml b/FileSets/v3.12/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.12/MbSpinBox.qml +++ b/FileSets/v3.12/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.12/MbStyle.qml b/FileSets/v3.12/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.12/MbStyle.qml +++ b/FileSets/v3.12/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.12/MbSubMenu.qml b/FileSets/v3.12/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.12/MbSubMenu.qml +++ b/FileSets/v3.12/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.12/Multi.qml b/FileSets/v3.12/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.12/Multi.qml +++ b/FileSets/v3.12/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.12/ObjectAcConnection.qml b/FileSets/v3.12/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.12/ObjectAcConnection.qml +++ b/FileSets/v3.12/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewAcValuesEnhanced.qml b/FileSets/v3.12/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.12/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.12/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewBox.qml b/FileSets/v3.12/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.12/OverviewBox.qml +++ b/FileSets/v3.12/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewConnection.qml b/FileSets/v3.12/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.12/OverviewConnection.qml +++ b/FileSets/v3.12/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewConnectionEnd.qml b/FileSets/v3.12/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.12/OverviewConnectionEnd.qml +++ b/FileSets/v3.12/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewFlowComplex.qml b/FileSets/v3.12/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.12/OverviewFlowComplex.qml +++ b/FileSets/v3.12/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewGeneratorEnhanced.qml b/FileSets/v3.12/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.12/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.12/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.12/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.12/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.12/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewGridParallel.qml b/FileSets/v3.12/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.12/OverviewGridParallel.qml +++ b/FileSets/v3.12/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewHub.qml b/FileSets/v3.12/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.12/OverviewHub.qml +++ b/FileSets/v3.12/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewHubEnhanced.qml b/FileSets/v3.12/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.12/OverviewHubEnhanced.qml +++ b/FileSets/v3.12/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewMobileEnhanced.qml b/FileSets/v3.12/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.12/OverviewMobileEnhanced.qml +++ b/FileSets/v3.12/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewSolarCharger.qml b/FileSets/v3.12/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.12/OverviewSolarCharger.qml +++ b/FileSets/v3.12/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewSolarInverter.qml b/FileSets/v3.12/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.12/OverviewSolarInverter.qml +++ b/FileSets/v3.12/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewTankDelegate.qml b/FileSets/v3.12/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.12/OverviewTankDelegate.qml +++ b/FileSets/v3.12/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewTanks.qml b/FileSets/v3.12/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.12/OverviewTanks.qml +++ b/FileSets/v3.12/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.12/OverviewTanksTempsDigInputs.qml b/FileSets/v3.12/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.12/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.12/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.12/PageDigitalInput.qml b/FileSets/v3.12/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.12/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.12/PageGenerator.qml b/FileSets/v3.12/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.12/PageGenerator.qml +++ b/FileSets/v3.12/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.12/PageSettingsGenerator.qml b/FileSets/v3.12/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.12/PageSettingsGenerator.qml +++ b/FileSets/v3.12/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.12/PageSettingsRelay.qml b/FileSets/v3.12/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.12/PageSettingsRelay.qml +++ b/FileSets/v3.12/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.12/PowerGauge.qml b/FileSets/v3.12/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.12/PowerGauge.qml +++ b/FileSets/v3.12/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.12/Tile.qml b/FileSets/v3.12/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.12/Tile.qml +++ b/FileSets/v3.12/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.12/TileDigIn.qml b/FileSets/v3.12/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.12/TileDigIn.qml +++ b/FileSets/v3.12/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.12/TileRelay.qml b/FileSets/v3.12/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.12/TileRelay.qml +++ b/FileSets/v3.12/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.12/TileText.qml b/FileSets/v3.12/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.12/TileText.qml +++ b/FileSets/v3.12/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.12/attributes.csv b/FileSets/v3.12/attributes.csv new file mode 120000 index 00000000..c6ffacd5 --- /dev/null +++ b/FileSets/v3.12/attributes.csv @@ -0,0 +1 @@ +../v3.20~33/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.12/dbus_digitalinputs.py b/FileSets/v3.12/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.12/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.12/dbus_generator.py b/FileSets/v3.12/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.12/dbus_generator.py +++ b/FileSets/v3.12/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.12/main.qml b/FileSets/v3.12/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.12/main.qml +++ b/FileSets/v3.12/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.12/styles.css b/FileSets/v3.12/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.12/styles.css +++ b/FileSets/v3.12/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.13/Battery.qml b/FileSets/v3.13/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.13/Battery.qml +++ b/FileSets/v3.13/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.13/DetailAcInput.qml b/FileSets/v3.13/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.13/DetailAcInput.qml +++ b/FileSets/v3.13/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.13/DetailInverter.qml b/FileSets/v3.13/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.13/DetailInverter.qml +++ b/FileSets/v3.13/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.13/DetailLoadsCombined.qml b/FileSets/v3.13/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.13/DetailLoadsCombined.qml +++ b/FileSets/v3.13/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.13/DetailLoadsOnInput.qml b/FileSets/v3.13/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.13/DetailLoadsOnInput.qml +++ b/FileSets/v3.13/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.13/DetailLoadsOnOutput.qml b/FileSets/v3.13/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.13/DetailLoadsOnOutput.qml +++ b/FileSets/v3.13/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.13/HubData.qml b/FileSets/v3.13/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.13/HubData.qml +++ b/FileSets/v3.13/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.13/MbEditBox.qml b/FileSets/v3.13/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.13/MbEditBox.qml +++ b/FileSets/v3.13/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.13/MbEditBoxDateTime.qml b/FileSets/v3.13/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.13/MbEditBoxDateTime.qml +++ b/FileSets/v3.13/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.13/MbItem.qml b/FileSets/v3.13/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.13/MbItem.qml +++ b/FileSets/v3.13/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.13/MbItemDigitalInput.qml b/FileSets/v3.13/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.13/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.13/MbSpinBox.qml b/FileSets/v3.13/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.13/MbSpinBox.qml +++ b/FileSets/v3.13/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.13/MbStyle.qml b/FileSets/v3.13/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.13/MbStyle.qml +++ b/FileSets/v3.13/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.13/MbSubMenu.qml b/FileSets/v3.13/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.13/MbSubMenu.qml +++ b/FileSets/v3.13/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.13/Multi.qml b/FileSets/v3.13/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.13/Multi.qml +++ b/FileSets/v3.13/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.13/ObjectAcConnection.qml b/FileSets/v3.13/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.13/ObjectAcConnection.qml +++ b/FileSets/v3.13/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewAcValuesEnhanced.qml b/FileSets/v3.13/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.13/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.13/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewBox.qml b/FileSets/v3.13/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.13/OverviewBox.qml +++ b/FileSets/v3.13/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewConnection.qml b/FileSets/v3.13/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.13/OverviewConnection.qml +++ b/FileSets/v3.13/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewConnectionEnd.qml b/FileSets/v3.13/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.13/OverviewConnectionEnd.qml +++ b/FileSets/v3.13/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewFlowComplex.qml b/FileSets/v3.13/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.13/OverviewFlowComplex.qml +++ b/FileSets/v3.13/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewGeneratorEnhanced.qml b/FileSets/v3.13/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.13/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.13/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.13/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.13/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.13/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewGridParallel.qml b/FileSets/v3.13/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.13/OverviewGridParallel.qml +++ b/FileSets/v3.13/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewHub.qml b/FileSets/v3.13/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.13/OverviewHub.qml +++ b/FileSets/v3.13/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewHubEnhanced.qml b/FileSets/v3.13/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.13/OverviewHubEnhanced.qml +++ b/FileSets/v3.13/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewMobileEnhanced.qml b/FileSets/v3.13/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.13/OverviewMobileEnhanced.qml +++ b/FileSets/v3.13/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewSolarCharger.qml b/FileSets/v3.13/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.13/OverviewSolarCharger.qml +++ b/FileSets/v3.13/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewSolarInverter.qml b/FileSets/v3.13/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.13/OverviewSolarInverter.qml +++ b/FileSets/v3.13/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewTankDelegate.qml b/FileSets/v3.13/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.13/OverviewTankDelegate.qml +++ b/FileSets/v3.13/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewTanks.qml b/FileSets/v3.13/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.13/OverviewTanks.qml +++ b/FileSets/v3.13/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.13/OverviewTanksTempsDigInputs.qml b/FileSets/v3.13/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.13/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.13/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.13/PageDigitalInput.qml b/FileSets/v3.13/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.13/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.13/PageGenerator.qml b/FileSets/v3.13/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.13/PageGenerator.qml +++ b/FileSets/v3.13/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.13/PageSettingsGenerator.qml b/FileSets/v3.13/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.13/PageSettingsGenerator.qml +++ b/FileSets/v3.13/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.13/PageSettingsRelay.qml b/FileSets/v3.13/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.13/PageSettingsRelay.qml +++ b/FileSets/v3.13/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.13/PowerGauge.qml b/FileSets/v3.13/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.13/PowerGauge.qml +++ b/FileSets/v3.13/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.13/Tile.qml b/FileSets/v3.13/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.13/Tile.qml +++ b/FileSets/v3.13/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.13/TileDigIn.qml b/FileSets/v3.13/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.13/TileDigIn.qml +++ b/FileSets/v3.13/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.13/TileRelay.qml b/FileSets/v3.13/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.13/TileRelay.qml +++ b/FileSets/v3.13/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.13/TileText.qml b/FileSets/v3.13/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.13/TileText.qml +++ b/FileSets/v3.13/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.13/attributes.csv b/FileSets/v3.13/attributes.csv new file mode 120000 index 00000000..c6ffacd5 --- /dev/null +++ b/FileSets/v3.13/attributes.csv @@ -0,0 +1 @@ +../v3.20~33/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.13/dbus_digitalinputs.py b/FileSets/v3.13/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.13/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.13/dbus_generator.py b/FileSets/v3.13/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.13/dbus_generator.py +++ b/FileSets/v3.13/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.13/main.qml b/FileSets/v3.13/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.13/main.qml +++ b/FileSets/v3.13/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.13/styles.css b/FileSets/v3.13/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.13/styles.css +++ b/FileSets/v3.13/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.14/Battery.qml b/FileSets/v3.14/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.14/Battery.qml +++ b/FileSets/v3.14/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.14/DetailAcInput.qml b/FileSets/v3.14/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.14/DetailAcInput.qml +++ b/FileSets/v3.14/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.14/DetailInverter.qml b/FileSets/v3.14/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.14/DetailInverter.qml +++ b/FileSets/v3.14/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.14/DetailLoadsCombined.qml b/FileSets/v3.14/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.14/DetailLoadsCombined.qml +++ b/FileSets/v3.14/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.14/DetailLoadsOnInput.qml b/FileSets/v3.14/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.14/DetailLoadsOnInput.qml +++ b/FileSets/v3.14/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.14/DetailLoadsOnOutput.qml b/FileSets/v3.14/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.14/DetailLoadsOnOutput.qml +++ b/FileSets/v3.14/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.14/HubData.qml b/FileSets/v3.14/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.14/HubData.qml +++ b/FileSets/v3.14/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.14/MbEditBox.qml b/FileSets/v3.14/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.14/MbEditBox.qml +++ b/FileSets/v3.14/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.14/MbEditBoxDateTime.qml b/FileSets/v3.14/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.14/MbEditBoxDateTime.qml +++ b/FileSets/v3.14/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.14/MbItem.qml b/FileSets/v3.14/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.14/MbItem.qml +++ b/FileSets/v3.14/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.14/MbItemDigitalInput.qml b/FileSets/v3.14/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.14/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.14/MbSpinBox.qml b/FileSets/v3.14/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.14/MbSpinBox.qml +++ b/FileSets/v3.14/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.14/MbStyle.qml b/FileSets/v3.14/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.14/MbStyle.qml +++ b/FileSets/v3.14/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.14/MbSubMenu.qml b/FileSets/v3.14/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.14/MbSubMenu.qml +++ b/FileSets/v3.14/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.14/Multi.qml b/FileSets/v3.14/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.14/Multi.qml +++ b/FileSets/v3.14/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.14/ObjectAcConnection.qml b/FileSets/v3.14/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.14/ObjectAcConnection.qml +++ b/FileSets/v3.14/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewAcValuesEnhanced.qml b/FileSets/v3.14/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.14/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.14/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewBox.qml b/FileSets/v3.14/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.14/OverviewBox.qml +++ b/FileSets/v3.14/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewConnection.qml b/FileSets/v3.14/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.14/OverviewConnection.qml +++ b/FileSets/v3.14/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewConnectionEnd.qml b/FileSets/v3.14/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.14/OverviewConnectionEnd.qml +++ b/FileSets/v3.14/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewFlowComplex.qml b/FileSets/v3.14/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.14/OverviewFlowComplex.qml +++ b/FileSets/v3.14/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewGeneratorEnhanced.qml b/FileSets/v3.14/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.14/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.14/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.14/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.14/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.14/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewGridParallel.qml b/FileSets/v3.14/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.14/OverviewGridParallel.qml +++ b/FileSets/v3.14/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewHub.qml b/FileSets/v3.14/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.14/OverviewHub.qml +++ b/FileSets/v3.14/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewHubEnhanced.qml b/FileSets/v3.14/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.14/OverviewHubEnhanced.qml +++ b/FileSets/v3.14/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewMobileEnhanced.qml b/FileSets/v3.14/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.14/OverviewMobileEnhanced.qml +++ b/FileSets/v3.14/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewSolarCharger.qml b/FileSets/v3.14/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.14/OverviewSolarCharger.qml +++ b/FileSets/v3.14/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewSolarInverter.qml b/FileSets/v3.14/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.14/OverviewSolarInverter.qml +++ b/FileSets/v3.14/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewTankDelegate.qml b/FileSets/v3.14/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.14/OverviewTankDelegate.qml +++ b/FileSets/v3.14/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewTanks.qml b/FileSets/v3.14/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.14/OverviewTanks.qml +++ b/FileSets/v3.14/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.14/OverviewTanksTempsDigInputs.qml b/FileSets/v3.14/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.14/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.14/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.14/PageDigitalInput.qml b/FileSets/v3.14/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.14/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.14/PageGenerator.qml b/FileSets/v3.14/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.14/PageGenerator.qml +++ b/FileSets/v3.14/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.14/PageSettingsGenerator.qml b/FileSets/v3.14/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.14/PageSettingsGenerator.qml +++ b/FileSets/v3.14/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.14/PageSettingsRelay.qml b/FileSets/v3.14/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.14/PageSettingsRelay.qml +++ b/FileSets/v3.14/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.14/PowerGauge.qml b/FileSets/v3.14/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.14/PowerGauge.qml +++ b/FileSets/v3.14/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.14/Tile.qml b/FileSets/v3.14/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.14/Tile.qml +++ b/FileSets/v3.14/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.14/TileDigIn.qml b/FileSets/v3.14/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.14/TileDigIn.qml +++ b/FileSets/v3.14/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.14/TileRelay.qml b/FileSets/v3.14/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.14/TileRelay.qml +++ b/FileSets/v3.14/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.14/TileText.qml b/FileSets/v3.14/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.14/TileText.qml +++ b/FileSets/v3.14/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.14/attributes.csv b/FileSets/v3.14/attributes.csv new file mode 120000 index 00000000..c6ffacd5 --- /dev/null +++ b/FileSets/v3.14/attributes.csv @@ -0,0 +1 @@ +../v3.20~33/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.14/dbus_digitalinputs.py b/FileSets/v3.14/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.14/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.14/dbus_generator.py b/FileSets/v3.14/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.14/dbus_generator.py +++ b/FileSets/v3.14/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.14/main.qml b/FileSets/v3.14/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.14/main.qml +++ b/FileSets/v3.14/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.14/styles.css b/FileSets/v3.14/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.14/styles.css +++ b/FileSets/v3.14/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~17/Battery.qml b/FileSets/v3.20~17/Battery.qml deleted file mode 120000 index 794e9dd0..00000000 --- a/FileSets/v3.20~17/Battery.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/DetailAcInput.qml b/FileSets/v3.20~17/DetailAcInput.qml deleted file mode 120000 index 8b226ba8..00000000 --- a/FileSets/v3.20~17/DetailAcInput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/DetailInverter.qml b/FileSets/v3.20~17/DetailInverter.qml deleted file mode 120000 index 5ddd5ce8..00000000 --- a/FileSets/v3.20~17/DetailInverter.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/DetailLoadsCombined.qml b/FileSets/v3.20~17/DetailLoadsCombined.qml deleted file mode 120000 index b000afaa..00000000 --- a/FileSets/v3.20~17/DetailLoadsCombined.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/DetailLoadsOnInput.qml b/FileSets/v3.20~17/DetailLoadsOnInput.qml deleted file mode 120000 index 901e0820..00000000 --- a/FileSets/v3.20~17/DetailLoadsOnInput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/DetailLoadsOnOutput.qml b/FileSets/v3.20~17/DetailLoadsOnOutput.qml deleted file mode 120000 index 142fee12..00000000 --- a/FileSets/v3.20~17/DetailLoadsOnOutput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/HubData.qml b/FileSets/v3.20~17/HubData.qml deleted file mode 120000 index df42560b..00000000 --- a/FileSets/v3.20~17/HubData.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/MbEditBox.qml b/FileSets/v3.20~17/MbEditBox.qml deleted file mode 120000 index a6185dba..00000000 --- a/FileSets/v3.20~17/MbEditBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/MbEditBoxDateTime.qml b/FileSets/v3.20~17/MbEditBoxDateTime.qml deleted file mode 120000 index 158d88d0..00000000 --- a/FileSets/v3.20~17/MbEditBoxDateTime.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/MbItem.qml b/FileSets/v3.20~17/MbItem.qml deleted file mode 120000 index 8dfa4b06..00000000 --- a/FileSets/v3.20~17/MbItem.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/MbSpinBox.qml b/FileSets/v3.20~17/MbSpinBox.qml deleted file mode 120000 index b0dffaae..00000000 --- a/FileSets/v3.20~17/MbSpinBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/MbStyle.qml b/FileSets/v3.20~17/MbStyle.qml deleted file mode 120000 index 4accbc46..00000000 --- a/FileSets/v3.20~17/MbStyle.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/MbSubMenu.qml b/FileSets/v3.20~17/MbSubMenu.qml deleted file mode 120000 index d1172169..00000000 --- a/FileSets/v3.20~17/MbSubMenu.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/Multi.qml b/FileSets/v3.20~17/Multi.qml deleted file mode 120000 index 9a2fa57b..00000000 --- a/FileSets/v3.20~17/Multi.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/ObjectAcConnection.qml b/FileSets/v3.20~17/ObjectAcConnection.qml deleted file mode 120000 index 406d6613..00000000 --- a/FileSets/v3.20~17/ObjectAcConnection.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~17/OverviewAcValuesEnhanced.qml deleted file mode 120000 index 09322f1d..00000000 --- a/FileSets/v3.20~17/OverviewAcValuesEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewBox.qml b/FileSets/v3.20~17/OverviewBox.qml deleted file mode 120000 index 8c3baac0..00000000 --- a/FileSets/v3.20~17/OverviewBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewConnection.qml b/FileSets/v3.20~17/OverviewConnection.qml deleted file mode 120000 index 52cb8f85..00000000 --- a/FileSets/v3.20~17/OverviewConnection.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewConnectionEnd.qml b/FileSets/v3.20~17/OverviewConnectionEnd.qml deleted file mode 120000 index 04bf981f..00000000 --- a/FileSets/v3.20~17/OverviewConnectionEnd.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewFlowComplex.qml b/FileSets/v3.20~17/OverviewFlowComplex.qml deleted file mode 120000 index 6089ae4c..00000000 --- a/FileSets/v3.20~17/OverviewFlowComplex.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~17/OverviewGeneratorEnhanced.qml deleted file mode 120000 index ebdde7dc..00000000 --- a/FileSets/v3.20~17/OverviewGeneratorEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~17/OverviewGeneratorRelayEnhanced.qml deleted file mode 120000 index 54b24f30..00000000 --- a/FileSets/v3.20~17/OverviewGeneratorRelayEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewGridParallel.qml b/FileSets/v3.20~17/OverviewGridParallel.qml deleted file mode 120000 index c31a5a0f..00000000 --- a/FileSets/v3.20~17/OverviewGridParallel.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewHub.qml b/FileSets/v3.20~17/OverviewHub.qml deleted file mode 120000 index 9f251775..00000000 --- a/FileSets/v3.20~17/OverviewHub.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewHubEnhanced.qml b/FileSets/v3.20~17/OverviewHubEnhanced.qml deleted file mode 120000 index 0c37301c..00000000 --- a/FileSets/v3.20~17/OverviewHubEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewMobileEnhanced.qml b/FileSets/v3.20~17/OverviewMobileEnhanced.qml deleted file mode 120000 index 79cb1fcb..00000000 --- a/FileSets/v3.20~17/OverviewMobileEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewSolarCharger.qml b/FileSets/v3.20~17/OverviewSolarCharger.qml deleted file mode 120000 index 73220270..00000000 --- a/FileSets/v3.20~17/OverviewSolarCharger.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewSolarInverter.qml b/FileSets/v3.20~17/OverviewSolarInverter.qml deleted file mode 120000 index dd6f7b40..00000000 --- a/FileSets/v3.20~17/OverviewSolarInverter.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewTankDelegate.qml b/FileSets/v3.20~17/OverviewTankDelegate.qml deleted file mode 120000 index 9ac457b6..00000000 --- a/FileSets/v3.20~17/OverviewTankDelegate.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewTanks.qml b/FileSets/v3.20~17/OverviewTanks.qml deleted file mode 120000 index 975b464a..00000000 --- a/FileSets/v3.20~17/OverviewTanks.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~17/OverviewTanksTempsDigInputs.qml deleted file mode 120000 index 6cd0cfc3..00000000 --- a/FileSets/v3.20~17/OverviewTanksTempsDigInputs.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/PageGenerator.qml b/FileSets/v3.20~17/PageGenerator.qml deleted file mode 120000 index 05b5cccb..00000000 --- a/FileSets/v3.20~17/PageGenerator.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/PageMain.qml b/FileSets/v3.20~17/PageMain.qml deleted file mode 120000 index 444dec5f..00000000 --- a/FileSets/v3.20~17/PageMain.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~33/PageMain.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/PageSettingsDisplay.qml b/FileSets/v3.20~17/PageSettingsDisplay.qml deleted file mode 100644 index 8721bf7f..00000000 --- a/FileSets/v3.20~17/PageSettingsDisplay.qml +++ /dev/null @@ -1,143 +0,0 @@ -//////// modified to add GuiMods controls - -import QtQuick 1.1 -import com.victron.velib 1.0 -import "utils.js" as Utils - -MbPage { - id: root - property string bindPrefix: "com.victronenergy.settings/Settings/Gui" - - model: VisibleItemModel { - MbSwitch { - id: autoBrightness - name: qsTr("Adaptive brightness") - bind: Utils.path(bindPrefix, "/AutoBrightness") - show: vePlatform.hasAutoBrightness - onClicked: vePlatform.autoBrightness = checked; - } - - // note: the backlight is changed during edit, and saved afterwards - MbItemSlider { - id: backlight - show: vePlatform.hasBacklight && !(vePlatform.hasAutoBrightness && autoBrightness.checked) - icondId: "icon-items-brightness" - directUpdates: true - item { - min: 1 - max: vePlatform.maxBrightness - step: 1 - value: vePlatform.brightness - onValueChanged: if (editMode) vePlatform.brightness = item.value; - } - writeAccessLevel: User.AccessUser - onEditModeChanged: if (!editMode) storedBacklight.setValue(item.value) - - VBusItem { - id: storedBacklight - bind: Utils.path(bindPrefix, "/Brightness") - } - } - - MbItemOptions { - show: vePlatform.hasScreenSaver - description: qsTr("Display off time") - bind: Utils.path(bindPrefix, "/DisplayOff") - writeAccessLevel: User.AccessUser - possibleValues: [ - MbOption { description: qsTr("10 sec"); value: 10 }, - MbOption { description: qsTr("30 sec"); value: 30 }, - MbOption { description: qsTr("1 min"); value: 60 }, - MbOption { description: qsTr("10 min"); value: 600 }, - MbOption { description: qsTr("30 min"); value: 1800 }, - MbOption { description: qsTr("Never"); value: 0 } - ] - } - - ////// GuiMods — DarkMode - MbSwitch - { - id: colorScheme - bind: "com.victronenergy.settings/Settings/GuiMods/DarkMode" - name: qsTr ("Dark Mode") - writeAccessLevel: User.AccessUser - } - - MbSwitch { - bind: Utils.path(bindPrefix, "/MobileOverview") - name: qsTr("Show boat & motorhome overview") - // When enabled set OverviewMobile as default overview - onClicked: if (checked) defaultOverview.setValue("OverviewMobile") - VBusItem { id: defaultOverview; bind: "com.victronenergy.settings/Settings/Gui/DefaultOverview" } - } - - MbSwitch { - bind: Utils.path(bindPrefix, "/TanksOverview") - name: qsTr("Show tanks overview") - } - - //////// add Gui Mods menu - MbSubMenu { - id: guiModsMenu - description: qsTr("Gui Mods") - subpage: Component { - PageSettingsGuiMods { } - } - } - - MbItemOptions { - id: languageSelect - description: qsTr("Language") - writeAccessLevel: User.AccessUser - bind: Utils.path(bindPrefix, "/Language") - - // NOTE: do make sure application.cpp returns the correct fontForLanguage. - // The current font might not be able to display these values / the default - // font might not be contain the characters required for the selected language. - possibleValues: [ - MbOptionLang { description: "English"; value: "en" }, - MbOptionLang { description: "Čeština"; value: "cs" }, - MbOptionLang { description: "Dansk"; value: "da" }, - MbOptionLang { description: "Deutsch"; value: "de" }, - MbOptionLang { description: "Español"; value: "es" }, - MbOptionLang { description: "Français"; value: "fr" }, - MbOptionLang { description: "Italiano"; value: "it" }, - MbOptionLang { description: "Nederlands"; value: "nl" }, - MbOptionLang { description: "Polski"; value: "pl" }, - MbOptionLang { description: "Русский"; value: "ru" }, - MbOptionLang { description: "Română"; value: "ro" }, - MbOptionLang { description: "Svenska"; value: "se" }, - MbOptionLang { description: "ไทย"; value: "th" }, - MbOptionLang { description: "Türkçe"; value: "tr" }, - MbOptionLang { description: "中文"; value: "zh" }, - MbOptionLang { description: "العربية"; value: "ar" } - ] - } - - MbSubMenu { - description: qsTr("Units") - subpage: Component { - PageSettingsDisplayUnits { - title: qsTr("Units") - } - } - } - - MbItemOptions { - property VBusItem updateFeed: VBusItem { bind: "com.victronenergy.settings/Settings/System/ReleaseType" } - show: vePlatform.isGuiv2Installed() && vePlatform.displayPresent() && updateFeed.value >= Updater.FirmwareCandidate - bind: "com.victronenergy.settings/Settings/Gui/RunningVersion" - description: "UI version" - possibleValues: [ - MbOption { description: "Standard version"; value: 1 }, - MbOption { description: "Beta version (Check the manual first)"; value: 2 } - ] - onOptionSelected: { - if (newValue === 2) { - vePlatform.splash("Starting the beta UI") - Qt.quit() - } - } - } - } -} diff --git a/FileSets/v3.20~17/PageSettingsDisplay.qml.orig b/FileSets/v3.20~17/PageSettingsDisplay.qml.orig deleted file mode 100644 index 8b5728cf..00000000 --- a/FileSets/v3.20~17/PageSettingsDisplay.qml.orig +++ /dev/null @@ -1,123 +0,0 @@ -import QtQuick 1.1 -import com.victron.velib 1.0 -import "utils.js" as Utils - -MbPage { - id: root - property string bindPrefix: "com.victronenergy.settings/Settings/Gui" - - model: VisibleItemModel { - MbSwitch { - id: autoBrightness - name: qsTr("Adaptive brightness") - bind: Utils.path(bindPrefix, "/AutoBrightness") - show: vePlatform.hasAutoBrightness - onClicked: vePlatform.autoBrightness = checked; - } - - // note: the backlight is changed during edit, and saved afterwards - MbItemSlider { - id: backlight - show: vePlatform.hasBacklight && !(vePlatform.hasAutoBrightness && autoBrightness.checked) - icondId: "icon-items-brightness" - directUpdates: true - item { - min: 1 - max: vePlatform.maxBrightness - step: 1 - value: vePlatform.brightness - onValueChanged: if (editMode) vePlatform.brightness = item.value; - } - writeAccessLevel: User.AccessUser - onEditModeChanged: if (!editMode) storedBacklight.setValue(item.value) - - VBusItem { - id: storedBacklight - bind: Utils.path(bindPrefix, "/Brightness") - } - } - - MbItemOptions { - show: vePlatform.hasScreenSaver - description: qsTr("Display off time") - bind: Utils.path(bindPrefix, "/DisplayOff") - writeAccessLevel: User.AccessUser - possibleValues: [ - MbOption { description: qsTr("10 sec"); value: 10 }, - MbOption { description: qsTr("30 sec"); value: 30 }, - MbOption { description: qsTr("1 min"); value: 60 }, - MbOption { description: qsTr("10 min"); value: 600 }, - MbOption { description: qsTr("30 min"); value: 1800 }, - MbOption { description: qsTr("Never"); value: 0 } - ] - } - - MbSwitch { - bind: Utils.path(bindPrefix, "/MobileOverview") - name: qsTr("Show boat & motorhome overview") - // When enabled set OverviewMobile as default overview - onClicked: if (checked) defaultOverview.setValue("OverviewMobile") - VBusItem { id: defaultOverview; bind: "com.victronenergy.settings/Settings/Gui/DefaultOverview" } - } - - MbSwitch { - bind: Utils.path(bindPrefix, "/TanksOverview") - name: qsTr("Show tanks overview") - } - - MbItemOptions { - id: languageSelect - description: qsTr("Language") - writeAccessLevel: User.AccessUser - bind: Utils.path(bindPrefix, "/Language") - - // NOTE: do make sure application.cpp returns the correct fontForLanguage. - // The current font might not be able to display these values / the default - // font might not be contain the characters required for the selected language. - possibleValues: [ - MbOptionLang { description: "English"; value: "en" }, - MbOptionLang { description: "Čeština"; value: "cs" }, - MbOptionLang { description: "Dansk"; value: "da" }, - MbOptionLang { description: "Deutsch"; value: "de" }, - MbOptionLang { description: "Español"; value: "es" }, - MbOptionLang { description: "Français"; value: "fr" }, - MbOptionLang { description: "Italiano"; value: "it" }, - MbOptionLang { description: "Nederlands"; value: "nl" }, - MbOptionLang { description: "Polski"; value: "pl" }, - MbOptionLang { description: "Русский"; value: "ru" }, - MbOptionLang { description: "Română"; value: "ro" }, - MbOptionLang { description: "Svenska"; value: "se" }, - MbOptionLang { description: "ไทย"; value: "th" }, - MbOptionLang { description: "Türkçe"; value: "tr" }, - MbOptionLang { description: "中文"; value: "zh" }, - MbOptionLang { description: "العربية"; value: "ar" } - ] - } - - MbSubMenu { - description: qsTr("Units") - subpage: Component { - PageSettingsDisplayUnits { - title: qsTr("Units") - } - } - } - - MbItemOptions { - property VBusItem updateFeed: VBusItem { bind: "com.victronenergy.settings/Settings/System/ReleaseType" } - show: vePlatform.isGuiv2Installed() && vePlatform.displayPresent() && updateFeed.value >= Updater.FirmwareCandidate - bind: "com.victronenergy.settings/Settings/Gui/RunningVersion" - description: "UI version" - possibleValues: [ - MbOption { description: "Standard version"; value: 1 }, - MbOption { description: "Beta version (Check the manual first)"; value: 2 } - ] - onOptionSelected: { - if (newValue === 2) { - vePlatform.splash("Starting the beta UI") - Qt.quit() - } - } - } - } -} diff --git a/FileSets/v3.20~17/PageSettingsGenerator.qml b/FileSets/v3.20~17/PageSettingsGenerator.qml deleted file mode 120000 index 54543635..00000000 --- a/FileSets/v3.20~17/PageSettingsGenerator.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/PageSettingsGuiMods.qml b/FileSets/v3.20~17/PageSettingsGuiMods.qml deleted file mode 120000 index c4dc4998..00000000 --- a/FileSets/v3.20~17/PageSettingsGuiMods.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~37/PageSettingsGuiMods.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/PageSettingsRelay.qml b/FileSets/v3.20~17/PageSettingsRelay.qml deleted file mode 120000 index e083e872..00000000 --- a/FileSets/v3.20~17/PageSettingsRelay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/PowerGauge.qml b/FileSets/v3.20~17/PowerGauge.qml deleted file mode 120000 index 2ed81452..00000000 --- a/FileSets/v3.20~17/PowerGauge.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/Tile.qml b/FileSets/v3.20~17/Tile.qml deleted file mode 120000 index db98506f..00000000 --- a/FileSets/v3.20~17/Tile.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/TileDigIn.qml b/FileSets/v3.20~17/TileDigIn.qml deleted file mode 120000 index c6408a84..00000000 --- a/FileSets/v3.20~17/TileDigIn.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/TileRelay.qml b/FileSets/v3.20~17/TileRelay.qml deleted file mode 120000 index 200caf92..00000000 --- a/FileSets/v3.20~17/TileRelay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/TileText.qml b/FileSets/v3.20~17/TileText.qml deleted file mode 120000 index 8f17d6b3..00000000 --- a/FileSets/v3.20~17/TileText.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/UNUSED_FILE_SET b/FileSets/v3.20~17/UNUSED_FILE_SET deleted file mode 100644 index e69de29b..00000000 diff --git a/FileSets/v3.20~17/dbus_generator.py b/FileSets/v3.20~17/dbus_generator.py deleted file mode 120000 index f0d38f59..00000000 --- a/FileSets/v3.20~17/dbus_generator.py +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~17/dbus_systemcalc.py b/FileSets/v3.20~17/dbus_systemcalc.py deleted file mode 120000 index 6e4ff01e..00000000 --- a/FileSets/v3.20~17/dbus_systemcalc.py +++ /dev/null @@ -1 +0,0 @@ -../v3.20~18/dbus_systemcalc.py \ No newline at end of file diff --git a/FileSets/v3.20~17/main.qml b/FileSets/v3.20~17/main.qml deleted file mode 120000 index aafeae08..00000000 --- a/FileSets/v3.20~17/main.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/startstop.py b/FileSets/v3.20~17/startstop.py deleted file mode 120000 index b962b8d5..00000000 --- a/FileSets/v3.20~17/startstop.py +++ /dev/null @@ -1 +0,0 @@ -../v3.20~37/startstop.py \ No newline at end of file diff --git a/FileSets/v3.20~17/styles.css b/FileSets/v3.20~17/styles.css deleted file mode 120000 index 4af38df2..00000000 --- a/FileSets/v3.20~17/styles.css +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~18/Battery.qml b/FileSets/v3.20~18/Battery.qml deleted file mode 120000 index 794e9dd0..00000000 --- a/FileSets/v3.20~18/Battery.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/DetailAcInput.qml b/FileSets/v3.20~18/DetailAcInput.qml deleted file mode 120000 index 8b226ba8..00000000 --- a/FileSets/v3.20~18/DetailAcInput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/DetailInverter.qml b/FileSets/v3.20~18/DetailInverter.qml deleted file mode 120000 index 5ddd5ce8..00000000 --- a/FileSets/v3.20~18/DetailInverter.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/DetailLoadsCombined.qml b/FileSets/v3.20~18/DetailLoadsCombined.qml deleted file mode 120000 index b000afaa..00000000 --- a/FileSets/v3.20~18/DetailLoadsCombined.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/DetailLoadsOnInput.qml b/FileSets/v3.20~18/DetailLoadsOnInput.qml deleted file mode 120000 index 901e0820..00000000 --- a/FileSets/v3.20~18/DetailLoadsOnInput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/DetailLoadsOnOutput.qml b/FileSets/v3.20~18/DetailLoadsOnOutput.qml deleted file mode 120000 index 142fee12..00000000 --- a/FileSets/v3.20~18/DetailLoadsOnOutput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/HubData.qml b/FileSets/v3.20~18/HubData.qml deleted file mode 120000 index df42560b..00000000 --- a/FileSets/v3.20~18/HubData.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/MbEditBox.qml b/FileSets/v3.20~18/MbEditBox.qml deleted file mode 120000 index a6185dba..00000000 --- a/FileSets/v3.20~18/MbEditBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/MbEditBoxDateTime.qml b/FileSets/v3.20~18/MbEditBoxDateTime.qml deleted file mode 120000 index 158d88d0..00000000 --- a/FileSets/v3.20~18/MbEditBoxDateTime.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/MbItem.qml b/FileSets/v3.20~18/MbItem.qml deleted file mode 120000 index 8dfa4b06..00000000 --- a/FileSets/v3.20~18/MbItem.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/MbSpinBox.qml b/FileSets/v3.20~18/MbSpinBox.qml deleted file mode 120000 index b0dffaae..00000000 --- a/FileSets/v3.20~18/MbSpinBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/MbStyle.qml b/FileSets/v3.20~18/MbStyle.qml deleted file mode 120000 index 4accbc46..00000000 --- a/FileSets/v3.20~18/MbStyle.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/MbSubMenu.qml b/FileSets/v3.20~18/MbSubMenu.qml deleted file mode 120000 index d1172169..00000000 --- a/FileSets/v3.20~18/MbSubMenu.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/Multi.qml b/FileSets/v3.20~18/Multi.qml deleted file mode 120000 index 9a2fa57b..00000000 --- a/FileSets/v3.20~18/Multi.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/ObjectAcConnection.qml b/FileSets/v3.20~18/ObjectAcConnection.qml deleted file mode 120000 index 406d6613..00000000 --- a/FileSets/v3.20~18/ObjectAcConnection.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~18/OverviewAcValuesEnhanced.qml deleted file mode 120000 index 09322f1d..00000000 --- a/FileSets/v3.20~18/OverviewAcValuesEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewBox.qml b/FileSets/v3.20~18/OverviewBox.qml deleted file mode 120000 index 8c3baac0..00000000 --- a/FileSets/v3.20~18/OverviewBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewConnection.qml b/FileSets/v3.20~18/OverviewConnection.qml deleted file mode 120000 index 52cb8f85..00000000 --- a/FileSets/v3.20~18/OverviewConnection.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewConnectionEnd.qml b/FileSets/v3.20~18/OverviewConnectionEnd.qml deleted file mode 120000 index 04bf981f..00000000 --- a/FileSets/v3.20~18/OverviewConnectionEnd.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewFlowComplex.qml b/FileSets/v3.20~18/OverviewFlowComplex.qml deleted file mode 120000 index 6089ae4c..00000000 --- a/FileSets/v3.20~18/OverviewFlowComplex.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~18/OverviewGeneratorEnhanced.qml deleted file mode 120000 index ebdde7dc..00000000 --- a/FileSets/v3.20~18/OverviewGeneratorEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~18/OverviewGeneratorRelayEnhanced.qml deleted file mode 120000 index 54b24f30..00000000 --- a/FileSets/v3.20~18/OverviewGeneratorRelayEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewGridParallel.qml b/FileSets/v3.20~18/OverviewGridParallel.qml deleted file mode 120000 index c31a5a0f..00000000 --- a/FileSets/v3.20~18/OverviewGridParallel.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewHub.qml b/FileSets/v3.20~18/OverviewHub.qml deleted file mode 120000 index 9f251775..00000000 --- a/FileSets/v3.20~18/OverviewHub.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewHubEnhanced.qml b/FileSets/v3.20~18/OverviewHubEnhanced.qml deleted file mode 120000 index 0c37301c..00000000 --- a/FileSets/v3.20~18/OverviewHubEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewMobileEnhanced.qml b/FileSets/v3.20~18/OverviewMobileEnhanced.qml deleted file mode 120000 index 79cb1fcb..00000000 --- a/FileSets/v3.20~18/OverviewMobileEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewSolarCharger.qml b/FileSets/v3.20~18/OverviewSolarCharger.qml deleted file mode 120000 index 73220270..00000000 --- a/FileSets/v3.20~18/OverviewSolarCharger.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewSolarInverter.qml b/FileSets/v3.20~18/OverviewSolarInverter.qml deleted file mode 120000 index dd6f7b40..00000000 --- a/FileSets/v3.20~18/OverviewSolarInverter.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewTankDelegate.qml b/FileSets/v3.20~18/OverviewTankDelegate.qml deleted file mode 120000 index 9ac457b6..00000000 --- a/FileSets/v3.20~18/OverviewTankDelegate.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewTanks.qml b/FileSets/v3.20~18/OverviewTanks.qml deleted file mode 120000 index 975b464a..00000000 --- a/FileSets/v3.20~18/OverviewTanks.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~18/OverviewTanksTempsDigInputs.qml deleted file mode 120000 index 6cd0cfc3..00000000 --- a/FileSets/v3.20~18/OverviewTanksTempsDigInputs.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/PageGenerator.qml b/FileSets/v3.20~18/PageGenerator.qml deleted file mode 120000 index 05b5cccb..00000000 --- a/FileSets/v3.20~18/PageGenerator.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/PageMain.qml b/FileSets/v3.20~18/PageMain.qml deleted file mode 120000 index 444dec5f..00000000 --- a/FileSets/v3.20~18/PageMain.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~33/PageMain.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/PageSettingsDisplay.qml b/FileSets/v3.20~18/PageSettingsDisplay.qml deleted file mode 100644 index d998c7ae..00000000 --- a/FileSets/v3.20~18/PageSettingsDisplay.qml +++ /dev/null @@ -1,143 +0,0 @@ -//////// modified to add GuiMods controls - -import QtQuick 1.1 -import com.victron.velib 1.0 -import "utils.js" as Utils - -MbPage { - id: root - property string bindPrefix: "com.victronenergy.settings/Settings/Gui" - - model: VisibleItemModel { - MbSwitch { - id: autoBrightness - name: qsTr("Adaptive brightness") - bind: Utils.path(bindPrefix, "/AutoBrightness") - show: vePlatform.hasAutoBrightness - onClicked: vePlatform.autoBrightness = checked; - } - - // note: the backlight is changed during edit, and saved afterwards - MbItemSlider { - id: backlight - show: vePlatform.hasBacklight && !(vePlatform.hasAutoBrightness && autoBrightness.checked) - icondId: "icon-items-brightness" - directUpdates: true - item { - min: 1 - max: vePlatform.maxBrightness - step: 1 - value: vePlatform.brightness - onValueChanged: if (editMode) vePlatform.brightness = item.value; - } - writeAccessLevel: User.AccessUser - onEditModeChanged: if (!editMode) storedBacklight.setValue(item.value) - - VBusItem { - id: storedBacklight - bind: Utils.path(bindPrefix, "/Brightness") - } - } - - MbItemOptions { - show: vePlatform.hasScreenSaver - description: qsTr("Display off time") - bind: Utils.path(bindPrefix, "/DisplayOff") - writeAccessLevel: User.AccessUser - possibleValues: [ - MbOption { description: qsTr("10 sec"); value: 10 }, - MbOption { description: qsTr("30 sec"); value: 30 }, - MbOption { description: qsTr("1 min"); value: 60 }, - MbOption { description: qsTr("10 min"); value: 600 }, - MbOption { description: qsTr("30 min"); value: 1800 }, - MbOption { description: qsTr("Never"); value: 0 } - ] - } - - ////// GuiMods — DarkMode - MbSwitch - { - id: colorScheme - bind: "com.victronenergy.settings/Settings/GuiMods/DarkMode" - name: qsTr ("Dark Mode") - writeAccessLevel: User.AccessUser - } - - MbSwitch { - bind: Utils.path(bindPrefix, "/MobileOverview") - name: qsTr("Show boat & motorhome overview") - // When enabled set OverviewMobile as default overview - onClicked: if (checked) defaultOverview.setValue("OverviewMobile") - VBusItem { id: defaultOverview; bind: "com.victronenergy.settings/Settings/Gui/DefaultOverview" } - } - - MbSwitch { - bind: Utils.path(bindPrefix, "/TanksOverview") - name: qsTr("Show tanks overview") - } - - //////// add Gui Mods menu - MbSubMenu { - id: guiModsMenu - description: qsTr("Gui Mods") - subpage: Component { - PageSettingsGuiMods { } - } - } - - MbItemOptions { - id: languageSelect - description: qsTr("Language") - writeAccessLevel: User.AccessUser - bind: Utils.path(bindPrefix, "/Language") - - // NOTE: do make sure application.cpp returns the correct fontForLanguage. - // The current font might not be able to display these values / the default - // font might not be contain the characters required for the selected language. - possibleValues: [ - MbOptionLang { description: "English"; value: "en" }, - MbOptionLang { description: "Čeština"; value: "cs" }, - MbOptionLang { description: "Dansk"; value: "da" }, - MbOptionLang { description: "Deutsch"; value: "de" }, - MbOptionLang { description: "Español"; value: "es" }, - MbOptionLang { description: "Français"; value: "fr" }, - MbOptionLang { description: "Italiano"; value: "it" }, - MbOptionLang { description: "Nederlands"; value: "nl" }, - MbOptionLang { description: "Polski"; value: "pl" }, - MbOptionLang { description: "Русский"; value: "ru" }, - MbOptionLang { description: "Română"; value: "ro" }, - MbOptionLang { description: "Svenska"; value: "se" }, - MbOptionLang { description: "ไทย"; value: "th" }, - MbOptionLang { description: "Türkçe"; value: "tr" }, - MbOptionLang { description: "中文"; value: "zh" }, - MbOptionLang { description: "العربية"; value: "ar" } - ] - } - - MbSubMenu { - description: qsTr("Units") - subpage: Component { - PageSettingsDisplayUnits { - title: qsTr("Units") - } - } - } - - MbItemOptions { - property VBusItem updateFeed: VBusItem { bind: "com.victronenergy.settings/Settings/System/ReleaseType" } - show: vePlatform.isGuiv2Installed() && vePlatform.displayPresent() && updateFeed.value >= Updater.FirmwareCandidate - bind: "com.victronenergy.settings/Settings/Gui/RunningVersion" - description: "UI version" - possibleValues: [ - MbOption { description: "Standard version"; value: 1 }, - MbOption { description: "Beta version (Check the beta announcement first)"; value: 2 } - ] - onOptionSelected: { - if (newValue === 2) { - vePlatform.splash("Starting the beta UI") - Qt.quit() - } - } - } - } -} diff --git a/FileSets/v3.20~18/PageSettingsDisplay.qml.orig b/FileSets/v3.20~18/PageSettingsDisplay.qml.orig deleted file mode 100644 index 0f7ab8e7..00000000 --- a/FileSets/v3.20~18/PageSettingsDisplay.qml.orig +++ /dev/null @@ -1,123 +0,0 @@ -import QtQuick 1.1 -import com.victron.velib 1.0 -import "utils.js" as Utils - -MbPage { - id: root - property string bindPrefix: "com.victronenergy.settings/Settings/Gui" - - model: VisibleItemModel { - MbSwitch { - id: autoBrightness - name: qsTr("Adaptive brightness") - bind: Utils.path(bindPrefix, "/AutoBrightness") - show: vePlatform.hasAutoBrightness - onClicked: vePlatform.autoBrightness = checked; - } - - // note: the backlight is changed during edit, and saved afterwards - MbItemSlider { - id: backlight - show: vePlatform.hasBacklight && !(vePlatform.hasAutoBrightness && autoBrightness.checked) - icondId: "icon-items-brightness" - directUpdates: true - item { - min: 1 - max: vePlatform.maxBrightness - step: 1 - value: vePlatform.brightness - onValueChanged: if (editMode) vePlatform.brightness = item.value; - } - writeAccessLevel: User.AccessUser - onEditModeChanged: if (!editMode) storedBacklight.setValue(item.value) - - VBusItem { - id: storedBacklight - bind: Utils.path(bindPrefix, "/Brightness") - } - } - - MbItemOptions { - show: vePlatform.hasScreenSaver - description: qsTr("Display off time") - bind: Utils.path(bindPrefix, "/DisplayOff") - writeAccessLevel: User.AccessUser - possibleValues: [ - MbOption { description: qsTr("10 sec"); value: 10 }, - MbOption { description: qsTr("30 sec"); value: 30 }, - MbOption { description: qsTr("1 min"); value: 60 }, - MbOption { description: qsTr("10 min"); value: 600 }, - MbOption { description: qsTr("30 min"); value: 1800 }, - MbOption { description: qsTr("Never"); value: 0 } - ] - } - - MbSwitch { - bind: Utils.path(bindPrefix, "/MobileOverview") - name: qsTr("Show boat & motorhome overview") - // When enabled set OverviewMobile as default overview - onClicked: if (checked) defaultOverview.setValue("OverviewMobile") - VBusItem { id: defaultOverview; bind: "com.victronenergy.settings/Settings/Gui/DefaultOverview" } - } - - MbSwitch { - bind: Utils.path(bindPrefix, "/TanksOverview") - name: qsTr("Show tanks overview") - } - - MbItemOptions { - id: languageSelect - description: qsTr("Language") - writeAccessLevel: User.AccessUser - bind: Utils.path(bindPrefix, "/Language") - - // NOTE: do make sure application.cpp returns the correct fontForLanguage. - // The current font might not be able to display these values / the default - // font might not be contain the characters required for the selected language. - possibleValues: [ - MbOptionLang { description: "English"; value: "en" }, - MbOptionLang { description: "Čeština"; value: "cs" }, - MbOptionLang { description: "Dansk"; value: "da" }, - MbOptionLang { description: "Deutsch"; value: "de" }, - MbOptionLang { description: "Español"; value: "es" }, - MbOptionLang { description: "Français"; value: "fr" }, - MbOptionLang { description: "Italiano"; value: "it" }, - MbOptionLang { description: "Nederlands"; value: "nl" }, - MbOptionLang { description: "Polski"; value: "pl" }, - MbOptionLang { description: "Русский"; value: "ru" }, - MbOptionLang { description: "Română"; value: "ro" }, - MbOptionLang { description: "Svenska"; value: "se" }, - MbOptionLang { description: "ไทย"; value: "th" }, - MbOptionLang { description: "Türkçe"; value: "tr" }, - MbOptionLang { description: "中文"; value: "zh" }, - MbOptionLang { description: "العربية"; value: "ar" } - ] - } - - MbSubMenu { - description: qsTr("Units") - subpage: Component { - PageSettingsDisplayUnits { - title: qsTr("Units") - } - } - } - - MbItemOptions { - property VBusItem updateFeed: VBusItem { bind: "com.victronenergy.settings/Settings/System/ReleaseType" } - show: vePlatform.isGuiv2Installed() && vePlatform.displayPresent() && updateFeed.value >= Updater.FirmwareCandidate - bind: "com.victronenergy.settings/Settings/Gui/RunningVersion" - description: "UI version" - possibleValues: [ - MbOption { description: "Standard version"; value: 1 }, - MbOption { description: "Beta version (Check the beta announcement first)"; value: 2 } - ] - onOptionSelected: { - if (newValue === 2) { - vePlatform.splash("Starting the beta UI") - Qt.quit() - } - } - } - } -} diff --git a/FileSets/v3.20~18/PageSettingsGenerator.qml b/FileSets/v3.20~18/PageSettingsGenerator.qml deleted file mode 120000 index 54543635..00000000 --- a/FileSets/v3.20~18/PageSettingsGenerator.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/PageSettingsGuiMods.qml b/FileSets/v3.20~18/PageSettingsGuiMods.qml deleted file mode 120000 index c4dc4998..00000000 --- a/FileSets/v3.20~18/PageSettingsGuiMods.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~37/PageSettingsGuiMods.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/PageSettingsRelay.qml b/FileSets/v3.20~18/PageSettingsRelay.qml deleted file mode 120000 index e083e872..00000000 --- a/FileSets/v3.20~18/PageSettingsRelay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/PowerGauge.qml b/FileSets/v3.20~18/PowerGauge.qml deleted file mode 120000 index 2ed81452..00000000 --- a/FileSets/v3.20~18/PowerGauge.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/Tile.qml b/FileSets/v3.20~18/Tile.qml deleted file mode 120000 index db98506f..00000000 --- a/FileSets/v3.20~18/Tile.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/TileDigIn.qml b/FileSets/v3.20~18/TileDigIn.qml deleted file mode 120000 index c6408a84..00000000 --- a/FileSets/v3.20~18/TileDigIn.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/TileRelay.qml b/FileSets/v3.20~18/TileRelay.qml deleted file mode 120000 index 200caf92..00000000 --- a/FileSets/v3.20~18/TileRelay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/TileText.qml b/FileSets/v3.20~18/TileText.qml deleted file mode 120000 index 8f17d6b3..00000000 --- a/FileSets/v3.20~18/TileText.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/UNUSED_FILE_SET b/FileSets/v3.20~18/UNUSED_FILE_SET deleted file mode 100644 index e69de29b..00000000 diff --git a/FileSets/v3.20~18/dbus_generator.py b/FileSets/v3.20~18/dbus_generator.py deleted file mode 120000 index f0d38f59..00000000 --- a/FileSets/v3.20~18/dbus_generator.py +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~18/dbus_systemcalc.py b/FileSets/v3.20~18/dbus_systemcalc.py deleted file mode 100755 index cdedbc3f..00000000 --- a/FileSets/v3.20~18/dbus_systemcalc.py +++ /dev/null @@ -1,1344 +0,0 @@ -#!/usr/bin/python3 -u -# -*- coding: utf-8 -*- - -#### modified for GuiMods - -from dbus.mainloop.glib import DBusGMainLoop -import dbus -import argparse -import sys -import os -import json -import time -import re -from gi.repository import GLib - -# Victron packages -sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) -from vedbus import VeDbusService -from ve_utils import get_vrm_portal_id, exit_on_error -from dbusmonitor import DbusMonitor -from settingsdevice import SettingsDevice -from logger import setup_logging -import delegates -from sc_utils import safeadd as _safeadd, safemax as _safemax - -softwareVersion = '2.136' - -class SystemCalc: - STATE_IDLE = 0 - STATE_CHARGING = 1 - STATE_DISCHARGING = 2 - BATSERVICE_DEFAULT = 'default' - BATSERVICE_NOBATTERY = 'nobattery' - def __init__(self): - # Why this dummy? Because DbusMonitor expects these values to be there, even though we don't - # need them. So just add some dummy data. This can go away when DbusMonitor is more generic. - dummy = {'code': None, 'whenToLog': 'configChange', 'accessLevel': None} - dbus_tree = { - 'com.victronenergy.solarcharger': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Load/I': dummy, - '/FirmwareVersion': dummy}, - 'com.victronenergy.battery': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/DeviceInstance': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/1/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Soc': dummy, - '/Sense/Current': dummy, - '/TimeToGo': dummy, - '/ConsumedAmphours': dummy, - '/ProductId': dummy, - '/CustomName': dummy, - '/Info/MaxChargeVoltage': dummy}, - 'com.victronenergy.vebus' : { - '/Ac/ActiveIn/ActiveInput': dummy, - '/Ac/ActiveIn/L1/P': dummy, - '/Ac/ActiveIn/L2/P': dummy, - '/Ac/ActiveIn/L3/P': dummy, - '/Ac/ActiveIn/L1/I': dummy, - '/Ac/ActiveIn/L2/I': dummy, - '/Ac/ActiveIn/L3/I': dummy, - '/Ac/Out/L1/P': dummy, - '/Ac/Out/L2/P': dummy, - '/Ac/Out/L3/P': dummy, - '/Ac/Out/L1/I': dummy, - '/Ac/Out/L2/I': dummy, - '/Ac/Out/L3/I': dummy, -#### add for GuiMods - '/Ac/Out/L1/V': dummy, - '/Ac/Out/L2/V': dummy, - '/Ac/Out/L3/V': dummy, - '/Ac/Out/L1/F': dummy, - '/Ac/Out/L2/F': dummy, - '/Ac/Out/L3/F': dummy, - '/Ac/ActiveIn/L1/V': dummy, - '/Ac/ActiveIn/L2/V': dummy, - '/Ac/ActiveIn/L3/V': dummy, - '/Ac/ActiveIn/L1/F': dummy, - '/Ac/ActiveIn/L2/F': dummy, - '/Ac/ActiveIn/L3/F': dummy, - - '/Connected': dummy, - '/ProductId': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Mode': dummy, - '/State': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Soc': dummy}, - 'com.victronenergy.fuelcell': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy}, - 'com.victronenergy.charger': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/1/Voltage': dummy, - '/Dc/1/Current': dummy, - '/Dc/2/Voltage': dummy, - '/Dc/2/Current': dummy}, - 'com.victronenergy.grid' : { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/ProductId' : dummy, - '/DeviceType' : dummy, - '/Ac/L1/Power': dummy, - '/Ac/L2/Power': dummy, - '/Ac/L3/Power': dummy, - '/Ac/L1/Current': dummy, - '/Ac/L2/Current': dummy, - '/Ac/L3/Current': dummy, -#### add for GuiMods - '/Ac/L1/Voltage': dummy, - '/Ac/L2/Voltage': dummy, - '/Ac/L3/Voltage': dummy, - '/Ac/L1/Frequency': dummy, - '/Ac/L2/Frequency': dummy, - '/Ac/L3/Frequency': dummy}, - 'com.victronenergy.genset' : { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/ProductId' : dummy, - '/DeviceType' : dummy, - '/Ac/L1/Power': dummy, - '/Ac/L2/Power': dummy, - '/Ac/L3/Power': dummy, - '/Ac/L1/Current': dummy, - '/Ac/L2/Current': dummy, - '/Ac/L3/Current': dummy, -#### add for GuiMods - '/Ac/L1/Voltage': dummy, - '/Ac/L2/Voltage': dummy, - '/Ac/L3/Voltage': dummy, - '/Ac/L1/Frequency': dummy, - '/Ac/L2/Frequency': dummy, - '/Ac/L3/Frequency': dummy, - - '/StarterVoltage': dummy}, - 'com.victronenergy.settings' : { - '/Settings/SystemSetup/AcInput1' : dummy, - '/Settings/SystemSetup/AcInput2' : dummy, - '/Settings/CGwacs/RunWithoutGridMeter' : dummy, - '/Settings/System/TimeZone' : dummy}, - 'com.victronenergy.temperature': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy}, - 'com.victronenergy.inverter': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Ac/Out/L1/P': dummy, - '/Ac/Out/L1/S': dummy, - '/Ac/Out/L1/V': dummy, - '/Ac/Out/L1/I': dummy, -#### add for GuiMods - '/Ac/Out/L1/F': dummy, - - '/Yield/Power': dummy, - '/Soc': dummy}, - 'com.victronenergy.multi': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Ac/ActiveIn/ActiveInput': dummy, - '/Ac/In/1/Type': dummy, - '/Ac/In/2/Type': dummy, - '/Ac/In/1/L1/P': dummy, - '/Ac/In/1/L1/I': dummy, - '/Ac/In/2/L1/P': dummy, - '/Ac/In/2/L1/I': dummy, - '/Ac/Out/L1/P': dummy, - '/Ac/Out/L1/V': dummy, - '/Ac/Out/L1/I': dummy, -#### add for GuiMods - '/Ac/L1/F': dummy, - - '/Yield/Power': dummy, - '/Soc': dummy}, - 'com.victronenergy.dcsystem': { - '/Dc/0/Voltage': dummy, - '/Dc/0/Power': dummy - }, - 'com.victronenergy.alternator': { - '/Dc/0/Power': dummy - }, -#### added for GuiMods - 'com.victronenergy.dcsource': { - '/Dc/0/Power': dummy, - '/Settings/MonitorMode': dummy - }, - 'com.victronenergy.motordrive': - { - '/Dc/0/Power': dummy - } - } - - self._modules = [ - delegates.Multi(), - delegates.HubTypeSelect(), - delegates.VebusSocWriter(), - delegates.ServiceMapper(), - delegates.RelayState(), - delegates.BuzzerControl(), - delegates.LgCircuitBreakerDetect(), - delegates.BatterySoc(self), - delegates.Dvcc(self), - delegates.BatterySense(self), - delegates.BatterySettings(self), - delegates.SystemState(self), - delegates.BatteryLife(), - delegates.ScheduledCharging(), - delegates.SourceTimers(), - delegates.BatteryData(), - delegates.Gps(), - delegates.AcInputs(), - delegates.GensetStartStop(), - delegates.SocSync(self), - delegates.PvInverters(), - delegates.BatteryService(self), - delegates.CanBatterySense(), - delegates.DynamicEss()] - - for m in self._modules: - for service, paths in m.get_input(): - s = dbus_tree.setdefault(service, {}) - for path in paths: - s[path] = dummy - - self._dbusmonitor = self._create_dbus_monitor(dbus_tree, valueChangedCallback=self._dbus_value_changed, - deviceAddedCallback=self._device_added, deviceRemovedCallback=self._device_removed) - - # Connect to localsettings - supported_settings = { - 'batteryservice': ['/Settings/SystemSetup/BatteryService', self.BATSERVICE_DEFAULT, 0, 0], - 'hasdcsystem': ['/Settings/SystemSetup/HasDcSystem', 0, 0, 1], - 'useacout': ['/Settings/SystemSetup/HasAcOutSystem', 1, 0, 1]} - - for m in self._modules: - for setting in m.get_settings(): - supported_settings[setting[0]] = list(setting[1:]) - - self._settings = self._create_settings(supported_settings, self._handlechangedsetting) - - self._dbusservice = self._create_dbus_service() - - for m in self._modules: - m.set_sources(self._dbusmonitor, self._settings, self._dbusservice) - - # At this moment, VRM portal ID is the MAC address of the CCGX. Anyhow, it should be string uniquely - # identifying the CCGX. - self._dbusservice.add_path('/Serial', value=get_vrm_portal_id()) - self._dbusservice.add_path( - '/AvailableBatteryServices', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/AvailableBatteryMeasurements', value=None) - self._dbusservice.add_path( - '/AutoSelectedBatteryService', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/AutoSelectedBatteryMeasurement', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/ActiveBatteryService', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/Dc/Battery/BatteryService', value=None) - self._summeditems = { - '/Ac/Grid/L1/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L2/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L3/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L1/Current': {'gettext': '%.1F A'}, - '/Ac/Grid/L2/Current': {'gettext': '%.1F A'}, - '/Ac/Grid/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Grid/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/Grid/ProductId': {'gettext': '%s'}, - '/Ac/Grid/DeviceType': {'gettext': '%s'}, - '/Ac/Genset/L1/Power': {'gettext': '%.0F W'}, - '/Ac/Genset/L2/Power': {'gettext': '%.0F W'}, - '/Ac/Genset/L3/Power': {'gettext': '%.0F W'}, - '/Ac/Genset/L1/Current': {'gettext': '%.1F A'}, - '/Ac/Genset/L2/Current': {'gettext': '%.1F A'}, - '/Ac/Genset/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Genset/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/Genset/ProductId': {'gettext': '%s'}, - '/Ac/Genset/DeviceType': {'gettext': '%s'}, - '/Ac/ConsumptionOnOutput/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L1/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L2/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L3/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L1/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnOutput/L2/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnOutput/L3/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnInput/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L1/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L2/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L3/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L1/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnInput/L2/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnInput/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/Consumption/L1/Power': {'gettext': '%.0F W'}, - '/Ac/Consumption/L2/Power': {'gettext': '%.0F W'}, - '/Ac/Consumption/L3/Power': {'gettext': '%.0F W'}, - '/Ac/Consumption/L1/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/L2/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/L3/Current': {'gettext': '%.1F A'}, - '/Dc/Pv/Power': {'gettext': '%.0F W'}, - '/Dc/Pv/Current': {'gettext': '%.1F A'}, - '/Dc/Battery/Voltage': {'gettext': '%.2F V'}, - '/Dc/Battery/VoltageService': {'gettext': '%s'}, - '/Dc/Battery/Current': {'gettext': '%.1F A'}, - '/Dc/Battery/Power': {'gettext': '%.0F W'}, - '/Dc/Battery/State': {'gettext': '%s'}, - '/Dc/Battery/TimeToGo': {'gettext': '%.0F s'}, - '/Dc/Battery/ConsumedAmphours': {'gettext': '%.1F Ah'}, - '/Dc/Battery/ProductId': {'gettext': '0x%x'}, - '/Dc/Charger/Power': {'gettext': '%.0F %%'}, - '/Dc/FuelCell/Power': {'gettext': '%.0F %%'}, - '/Dc/Alternator/Power': {'gettext': '%.0F W'}, - '/Dc/Vebus/Current': {'gettext': '%.1F A'}, - '/Dc/Vebus/Power': {'gettext': '%.0F W'}, - '/Dc/System/Power': {'gettext': '%.0F W'}, - '/Dc/System/MeasurementType': {'gettext': '%d'}, - '/Ac/ActiveIn/Source': {'gettext': '%s'}, - '/Ac/ActiveIn/L1/Power': {'gettext': '%.0F W'}, - '/Ac/ActiveIn/L2/Power': {'gettext': '%.0F W'}, - '/Ac/ActiveIn/L3/Power': {'gettext': '%.0F W'}, - '/Ac/ActiveIn/L1/Current': {'gettext': '%.1F A'}, - '/Ac/ActiveIn/L2/Current': {'gettext': '%.1F A'}, - '/Ac/ActiveIn/L3/Current': {'gettext': '%.1F A'}, - '/Ac/ActiveIn/NumberOfPhases': {'gettext': '%d'}, -#### added for GuiMods - '/Dc/WindGenerator/Power': {'gettext': '%.0F W'}, - '/Dc/MotorDrive/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L1/Voltage': {'gettext': '%.1F V'}, - '/Ac/Grid/L2/Voltage': {'gettext': '%.1F V'}, - '/Ac/Grid/L3/Voltage': {'gettext': '%.1F V'}, - '/Ac/Grid/Frequency': {'gettext': '%.1F Hz'}, - '/Ac/Genset/L1/Voltage': {'gettext': '%.1F V'}, - '/Ac/Genset/L2/Voltage': {'gettext': '%.1F V'}, - '/Ac/Genset/L3/Voltage': {'gettext': '%.1F V'}, - '/Ac/Genset/Frequency': {'gettext': '%.1F Hz'}, - '/Ac/ConsumptionOnOutput/L1/Voltage': {'gettext': '%.1F V'}, - '/Ac/ConsumptionOnOutput/L2/Voltage': {'gettext': '%.1F V'}, - '/Ac/ConsumptionOnOutput/L3/Voltage': {'gettext': '%.1F V'}, - '/Ac/ConsumptionOnOutput/Frequency': {'gettext': '%.1F Hz'}, - '/Ac/ConsumptionOnInput/L1/Voltage': {'gettext': '%.1F V'}, - '/Ac/ConsumptionOnInput/L2/Voltage': {'gettext': '%.1F V'}, - '/Ac/ConsumptionOnInput/L3/Voltage': {'gettext': '%.1F V'}, - '/Ac/ConsumptionOnInput/Frequency': {'gettext': '%.1F Hz'}, - '/Ac/Consumption/L1/Voltage': {'gettext': '%.1F V'}, - '/Ac/Consumption/L2/Voltage': {'gettext': '%.1F V'}, - '/Ac/Consumption/L3/Voltage': {'gettext': '%.1F V'}, - '/Ac/Consumption/Frequency': {'gettext': '%.1F Hz'}, - '/Ac/ActiveIn/L1/Voltage': {'gettext': '%.1F V'}, - '/Ac/ActiveIn/L2/Voltage': {'gettext': '%.1F V'}, - '/Ac/ActiveIn/L3/Voltage': {'gettext': '%.1F V'}, - '/Ac/ActiveIn/Frequency': {'gettext': '%.1F Hz'}, - } - - for m in self._modules: - self._summeditems.update(m.get_output()) - - for path in self._summeditems.keys(): - self._dbusservice.add_path(path, value=None, gettextcallback=self._gettext) - - self._batteryservice = None - self._determinebatteryservice() - - if self._batteryservice is None: - logger.info("Battery service initialized to None (setting == %s)" % - self._settings['batteryservice']) - - self._changed = True - for service, instance in self._dbusmonitor.get_service_list().items(): - self._device_added(service, instance, do_service_change=False) - -#### added for GuiMods - self.dcSystemPower = [0, 0, 0] - - self._handleservicechange() - self._updatevalues() - - GLib.timeout_add(1000, exit_on_error, self._handletimertick) - - def _create_dbus_monitor(self, *args, **kwargs): - raise Exception("This function should be overridden") - - def _create_settings(self, *args, **kwargs): - raise Exception("This function should be overridden") - - def _create_dbus_service(self): - raise Exception("This function should be overridden") - - def _handlechangedsetting(self, setting, oldvalue, newvalue): - self._determinebatteryservice() - self._changed = True - - # Give our delegates a chance to react on a settings change - for m in self._modules: - m.settings_changed(setting, oldvalue, newvalue) - - def _find_device_instance(self, serviceclass, instance): - """ Gets a mapping of services vs DeviceInstance using - get_service_list. Then searches for the specified DeviceInstance - and returns the service name. """ - services = self._dbusmonitor.get_service_list(classfilter=serviceclass) - - for k, v in services.items(): - if v == instance: - return k - return None - - def _determinebatteryservice(self): - auto_battery_service = self._autoselect_battery_service() - auto_battery_measurement = None - auto_selected = False - if auto_battery_service is not None: - services = self._dbusmonitor.get_service_list() - if auto_battery_service in services: - auto_battery_measurement = \ - self._get_instance_service_name(auto_battery_service, services[auto_battery_service]) - auto_battery_measurement = auto_battery_measurement.replace('.', '_').replace('/', '_') + '/Dc/0' - self._dbusservice['/AutoSelectedBatteryMeasurement'] = auto_battery_measurement - - if self._settings['batteryservice'] == self.BATSERVICE_DEFAULT: - auto_selected = True - newbatteryservice = auto_battery_service - self._dbusservice['/AutoSelectedBatteryService'] = ( - 'No battery monitor found' if newbatteryservice is None else - self._get_readable_service_name(newbatteryservice)) - - elif self._settings['batteryservice'] == self.BATSERVICE_NOBATTERY: - self._dbusservice['/AutoSelectedBatteryService'] = None - newbatteryservice = None - - else: - self._dbusservice['/AutoSelectedBatteryService'] = None - - s = self._settings['batteryservice'].split('/') - if len(s) != 2: - logger.error("The battery setting (%s) is invalid!" % self._settings['batteryservice']) - serviceclass = s[0] - instance = int(s[1]) if len(s) == 2 else None - - # newbatteryservice might turn into None if a chosen battery - # monitor no longer exists. Don't auto change the setting (it might - # come back) and don't autoselect another. - newbatteryservice = self._find_device_instance(serviceclass, instance) - - if newbatteryservice != self._batteryservice: - services = self._dbusmonitor.get_service_list() - instance = services.get(newbatteryservice, None) - if instance is None: - battery_service = None - else: - battery_service = self._get_instance_service_name(newbatteryservice, instance) - self._dbusservice['/ActiveBatteryService'] = battery_service - logger.info("Battery service, setting == %s, changed from %s to %s (%s)" % - (self._settings['batteryservice'], self._batteryservice, newbatteryservice, instance)) - - # Battery service has changed. Notify delegates. - self._dbusservice['/Dc/Battery/BatteryService'] = self._batteryservice = newbatteryservice - for m in self._modules: - m.battery_service_changed(auto_selected, self._batteryservice, newbatteryservice) - - def _autoselect_battery_service(self): - # Default setting business logic: - # first try to use a battery service (BMV or Lynx Shunt VE.Can). If there - # is more than one battery service, just use a random one. If no battery service is - # available, check if there are not Solar chargers and no normal chargers. If they are not - # there, assume this is a hub-2, hub-3 or hub-4 system and use VE.Bus SOC. - batteries = self._get_connected_service_list('com.victronenergy.battery') - - # Pick the battery service that has the lowest DeviceInstance, giving - # preference to those with a BMS. - if len(batteries) > 0: - batteries = [ - (not self._dbusmonitor.seen(s, '/Info/MaxChargeVoltage'), i, s) - for s, i in batteries.items()] - return sorted(batteries, key=lambda x: x[:2])[0][2] - - # No battery services, and there is a charger in the system. Abandon - # hope. - if self._get_first_connected_service('com.victronenergy.charger') is not None: - return None - - # Also no Multi, then give up. - vebus_service = self._get_service_having_lowest_instance('com.victronenergy.vebus') - if vebus_service is None: - # No VE.Bus, but maybe there is an inverter with built-in SOC - # tracking, eg RS Smart or Multi RS. - inverter = self._get_service_having_lowest_instance('com.victronenergy.multi') - if inverter and self._dbusmonitor.get_value(inverter[0], '/Soc') is not None: - return inverter[0] - - inverter = self._get_service_having_lowest_instance('com.victronenergy.inverter') - if inverter and self._dbusmonitor.get_value(inverter[0], '/Soc') is not None: - return inverter[0] - - return None - - # There is a Multi, it supports tracking external charge current from - # solarchargers, and there are no DC loads. Then use it. - if self._dbusmonitor.get_value( - vebus_service[0], '/ExtraBatteryCurrent') is not None \ - and self._get_first_connected_service('com.victronenergy.dcsystem') is None \ - and self._settings['hasdcsystem'] == 0: - return vebus_service[0] - - # Multi does not support tracking solarcharger current, and we have - # solar chargers. Then we cannot use it. - if self._get_first_connected_service('com.victronenergy.solarcharger') is not None: - return None - - # Only a Multi, no other chargers. Then we can use it. - return vebus_service[0] - - @property - def batteryservice(self): - return self._batteryservice - - # Called on a one second timer - def _handletimertick(self): - if self._changed: - self._updatevalues() - self._changed = False - - return True # keep timer running - - def _updatevalues(self): - # ==== PREPARATIONS ==== - newvalues = {} - - # Set the user timezone - if 'TZ' not in os.environ: - tz = self._dbusmonitor.get_value('com.victronenergy.settings', '/Settings/System/TimeZone') - if tz is not None: - os.environ['TZ'] = tz - time.tzset() - - # Determine values used in logic below - vebusses = self._dbusmonitor.get_service_list('com.victronenergy.vebus') - vebuspower = 0 - for vebus in vebusses: - v = self._dbusmonitor.get_value(vebus, '/Dc/0/Voltage') - i = self._dbusmonitor.get_value(vebus, '/Dc/0/Current') - if v is not None and i is not None: - vebuspower += v * i - - # ==== PVINVERTERS ==== - # Work is done in pv-inverter delegate. Ideally all of this should - # happen in update_values in the delegate, but these values are - # used below in calculating consumption, so until this is less - # unwieldy this has to stay here. - # TODO this can go away once consumption below no longer relies - # on these values, or has moved to its own delegate. - newvalues.update(delegates.PvInverters.instance.get_totals()) - self._compute_number_of_phases('/Ac/PvOnGrid', newvalues) - self._compute_number_of_phases('/Ac/PvOnOutput', newvalues) - self._compute_number_of_phases('/Ac/PvOnGenset', newvalues) - - # ==== SOLARCHARGERS ==== - solarchargers = self._dbusmonitor.get_service_list('com.victronenergy.solarcharger') - solarcharger_batteryvoltage = None - solarcharger_batteryvoltage_service = None - solarchargers_charge_power = 0 - solarchargers_loadoutput_power = None - - for solarcharger in solarchargers: - v = self._dbusmonitor.get_value(solarcharger, '/Dc/0/Voltage') - if v is None: - continue - i = self._dbusmonitor.get_value(solarcharger, '/Dc/0/Current') - if i is None: - continue - l = self._dbusmonitor.get_value(solarcharger, '/Load/I', 0) - - if l is not None: - if solarchargers_loadoutput_power is None: - solarchargers_loadoutput_power = l * v - else: - solarchargers_loadoutput_power += l * v - - solarchargers_charge_power += v * i - - # Note that this path is not in the _summeditems{}, making for it to not be - # published on D-Bus. Which fine. The only one needing it is the vebussocwriter- - # delegate. - if '/Dc/Pv/ChargeCurrent' not in newvalues: - newvalues['/Dc/Pv/ChargeCurrent'] = i - else: - newvalues['/Dc/Pv/ChargeCurrent'] += i - - if '/Dc/Pv/Power' not in newvalues: - newvalues['/Dc/Pv/Power'] = v * _safeadd(i, l) - newvalues['/Dc/Pv/Current'] = _safeadd(i, l) - solarcharger_batteryvoltage = v - solarcharger_batteryvoltage_service = solarcharger - else: - newvalues['/Dc/Pv/Power'] += v * _safeadd(i, l) - newvalues['/Dc/Pv/Current'] += _safeadd(i, l) - - # ==== FUELCELLS ==== - fuelcells = self._dbusmonitor.get_service_list('com.victronenergy.fuelcell') - fuelcell_batteryvoltage = None - fuelcell_batteryvoltage_service = None - for fuelcell in fuelcells: - # Assume the battery connected to output 0 is the main battery - v = self._dbusmonitor.get_value(fuelcell, '/Dc/0/Voltage') - if v is None: - continue - - fuelcell_batteryvoltage = v - fuelcell_batteryvoltage_service = fuelcell - - i = self._dbusmonitor.get_value(fuelcell, '/Dc/0/Current') - if i is None: - continue - - if '/Dc/FuelCell/Power' not in newvalues: - newvalues['/Dc/FuelCell/Power'] = v * i - else: - newvalues['/Dc/FuelCell/Power'] += v * i - - # ==== ALTERNATOR ==== - alternators = self._dbusmonitor.get_service_list('com.victronenergy.alternator') - for alternator in alternators: -#### modified for GuiMods - # some alternators do not provide a valid power value if not running - # or below a minimum power/current - # so fill in a zero power so that the systemcalc power becomes valid - # Assume the battery connected to output 0 is the main battery - p = self._dbusmonitor.get_value(alternator, '/Dc/0/Power') - if p is None: - #### continue - p = 0 - - if '/Dc/Alternator/Power' not in newvalues: - newvalues['/Dc/Alternator/Power'] = p - else: - newvalues['/Dc/Alternator/Power'] += p - - -#### added for GuiMods - # ==== MOTOR DRIVE ==== - motordrives = self._dbusmonitor.get_service_list('com.victronenergy.motordrive') - for motordrive in motordrives: - p = self._dbusmonitor.get_value(motordrive, '/Dc/0/Power') - if p is None: - p = 0 - - if '/Dc/MotorDrive/Power' not in newvalues: - newvalues['/Dc/MotorDrive/Power'] = p - else: - newvalues['/Dc/MotorDrive/Power'] += p - -#### added for GuiMods - # ==== DC SOURCES ==== - dcSources = self._dbusmonitor.get_service_list('com.victronenergy.dcsource') - for dcSource in dcSources: - monitorMode = self._dbusmonitor.get_value(dcSource,'/Settings/MonitorMode') - # ==== WIND GENERATOR ==== - if monitorMode == -8: - p = self._dbusmonitor.get_value(dcSource, '/Dc/0/Power') - if p is None: - continue - if '/Dc/WindGenerator/Power' not in newvalues: - newvalues['/Dc/WindGenerator/Power'] = p - else: - newvalues['/Dc/WindGenerator/Power'] += p - - # ==== CHARGERS ==== - chargers = self._dbusmonitor.get_service_list('com.victronenergy.charger') - charger_batteryvoltage = None - charger_batteryvoltage_service = None - for charger in chargers: - # Assume the battery connected to output 0 is the main battery - v = self._dbusmonitor.get_value(charger, '/Dc/0/Voltage') - if v is None: - continue - - charger_batteryvoltage = v - charger_batteryvoltage_service = charger - - i = self._dbusmonitor.get_value(charger, '/Dc/0/Current') - if i is None: - continue - - if '/Dc/Charger/Power' not in newvalues: - newvalues['/Dc/Charger/Power'] = v * i - else: - newvalues['/Dc/Charger/Power'] += v * i - - # ==== Other Inverters and Inverter/Chargers ==== - _other_inverters = sorted((di, s) for s, di in self._dbusmonitor.get_service_list('com.victronenergy.multi').items()) + \ - sorted((di, s) for s, di in self._dbusmonitor.get_service_list('com.victronenergy.inverter').items()) - non_vebus_inverters = [x[1] for x in _other_inverters] - non_vebus_inverter = None - if non_vebus_inverters: - non_vebus_inverter = non_vebus_inverters[0] - - # For RS Smart and Multi RS, add PV to the yield - for i in non_vebus_inverters: - if (pv_yield := self._dbusmonitor.get_value(i, "/Yield/Power")) is not None: - newvalues['/Dc/Pv/Power'] = newvalues.get('/Dc/Pv/Power', 0) + pv_yield - - # Used lower down, possibly needed for battery values as well - dcsystems = self._dbusmonitor.get_service_list('com.victronenergy.dcsystem') - - # ==== BATTERY ==== - if self._batteryservice is not None: - batteryservicetype = self._batteryservice.split('.')[2] - assert batteryservicetype in ('battery', 'vebus', 'inverter', 'multi') - - newvalues['/Dc/Battery/TimeToGo'] = self._dbusmonitor.get_value(self._batteryservice,'/TimeToGo') - newvalues['/Dc/Battery/ConsumedAmphours'] = self._dbusmonitor.get_value(self._batteryservice,'/ConsumedAmphours') - newvalues['/Dc/Battery/ProductId'] = self._dbusmonitor.get_value(self._batteryservice, '/ProductId') - - if batteryservicetype in ('battery', 'inverter', 'multi'): - newvalues['/Dc/Battery/Voltage'] = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Voltage') - newvalues['/Dc/Battery/VoltageService'] = self._batteryservice - newvalues['/Dc/Battery/Current'] = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Current') - newvalues['/Dc/Battery/Power'] = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Power') - - elif batteryservicetype == 'vebus': - vebus_voltage = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Voltage') - vebus_current = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Current') - vebus_power = None if vebus_voltage is None or vebus_current is None else vebus_current * vebus_voltage - newvalues['/Dc/Battery/Voltage'] = vebus_voltage - newvalues['/Dc/Battery/VoltageService'] = self._batteryservice - if self._settings['hasdcsystem'] == 1 or dcsystems: - # hasdcsystem will normally disqualify the multi from being - # auto-selected as battery monitor, so the only way we're - # here is if the user explicitly selected the multi as the - # battery service - newvalues['/Dc/Battery/Current'] = vebus_current - if vebus_power is not None: - newvalues['/Dc/Battery/Power'] = vebus_power - else: - battery_power = _safeadd(solarchargers_charge_power, vebus_power) - newvalues['/Dc/Battery/Current'] = battery_power / vebus_voltage if vebus_voltage is not None and vebus_voltage > 0 else None - newvalues['/Dc/Battery/Power'] = battery_power - - - p = newvalues.get('/Dc/Battery/Power', None) - if p is not None: - if p > 30: - newvalues['/Dc/Battery/State'] = self.STATE_CHARGING - elif p < -30: - newvalues['/Dc/Battery/State'] = self.STATE_DISCHARGING - else: - newvalues['/Dc/Battery/State'] = self.STATE_IDLE - - else: - # The battery service is not a BMS/BMV or a suitable vebus. A - # suitable vebus is defined as one explicitly selected by the user, - # or one that was automatically selected for SOC tracking. We may - # however still have a VE.Bus, just not one that can accurately - # track SOC. If we have one, use it as voltage source. Otherwise - # try a solar charger, a charger, a vedirect inverter or a dcsource - # as fallbacks. - batteryservicetype = None - vebusses = self._dbusmonitor.get_service_list('com.victronenergy.vebus') - for vebus in vebusses: - v = self._dbusmonitor.get_value(vebus, '/Dc/0/Voltage') - s = self._dbusmonitor.get_value(vebus, '/State') - if v is not None and s not in (0, None): - newvalues['/Dc/Battery/Voltage'] = v - newvalues['/Dc/Battery/VoltageService'] = vebus - break # Skip the else below - else: - # No suitable vebus voltage, try other devices - if non_vebus_inverter is not None and (v := self._dbusmonitor.get_value(non_vebus_inverter, '/Dc/0/Voltage')) is not None: - newvalues['/Dc/Battery/Voltage'] = v - newvalues['/Dc/Battery/VoltageService'] = non_vebus_inverter - elif solarcharger_batteryvoltage is not None: - newvalues['/Dc/Battery/Voltage'] = solarcharger_batteryvoltage - newvalues['/Dc/Battery/VoltageService'] = solarcharger_batteryvoltage_service - elif charger_batteryvoltage is not None: - newvalues['/Dc/Battery/Voltage'] = charger_batteryvoltage - newvalues['/Dc/Battery/VoltageService'] = charger_batteryvoltage_service - elif fuelcell_batteryvoltage is not None: - newvalues['/Dc/Battery/Voltage'] = fuelcell_batteryvoltage - newvalues['/Dc/Battery/VoltageService'] = fuelcell_batteryvoltage_service - elif dcsystems: - # Get voltage from first dcsystem - s = next(iter(dcsystems.keys())) - v = self._dbusmonitor.get_value(s, '/Dc/0/Voltage') - if v is not None: - newvalues['/Dc/Battery/Voltage'] = v - newvalues['/Dc/Battery/VoltageService'] = s - - # We have no suitable battery monitor, so power and current data - # is not available. We can however calculate it from other values, - # if we have at least a battery voltage. - if '/Dc/Battery/Voltage' in newvalues: - dcsystempower = _safeadd(0, *(self._dbusmonitor.get_value(s, - '/Dc/0/Power', 0) for s in dcsystems)) - if dcsystems or self._settings['hasdcsystem'] == 0: - # Either DC loads are monitored, or there are no - # unmonitored DC loads or chargers: derive battery watts - # and amps from vebus, solarchargers, chargers and measured - # loads. - p = solarchargers_charge_power + newvalues.get('/Dc/Charger/Power', 0) + vebuspower - dcsystempower - voltage = newvalues['/Dc/Battery/Voltage'] - newvalues['/Dc/Battery/Current'] = p / voltage if voltage > 0 else None - newvalues['/Dc/Battery/Power'] = p - - # ==== SYSTEM POWER ==== - # Look for dcsytem devices, add them together. Otherwise, if enabled, - # calculate it - if dcsystems: - newvalues['/Dc/System/MeasurementType'] = 1 # measured - newvalues['/Dc/System/Power'] = 0 - for meter in dcsystems: - newvalues['/Dc/System/Power'] = _safeadd(newvalues['/Dc/System/Power'], - self._dbusmonitor.get_value(meter, '/Dc/0/Power')) - elif self._settings['hasdcsystem'] == 1 and batteryservicetype == 'battery': - # Calculate power being generated/consumed by not measured devices in the network. - # For MPPTs, take all the power, including power going out of the load output. - # /Dc/System: positive: consuming power - # VE.Bus: Positive: current flowing from the Multi to the dc system or battery - # Solarcharger & other chargers: positive: charging - # battery: Positive: charging battery. - # battery = solarcharger + charger + ve.bus - system - - battery_power = newvalues.get('/Dc/Battery/Power') - if battery_power is not None: - dc_pv_power = newvalues.get('/Dc/Pv/Power', 0) - charger_power = newvalues.get('/Dc/Charger/Power', 0) - fuelcell_power = newvalues.get('/Dc/FuelCell/Power', 0) - alternator_power = newvalues.get('/Dc/Alternator/Power', 0) -#### added for GuiMods - windgen_power = newvalues.get('/Dc/WindGenerator/Power', 0) - motordrive_power = newvalues.get('/Dc/MotorDrive/Power', 0) - - # If there are VE.Direct inverters, remove their power from the - # DC estimate. This is done using the AC value when the DC - # power values are not available. - inverter_power = 0 - for i in non_vebus_inverters: - inverter_current = self._dbusmonitor.get_value(i, '/Dc/0/Current') - if inverter_current is not None: - inverter_power += self._dbusmonitor.get_value( - i, '/Dc/0/Voltage', 0) * inverter_current - else: - inverter_power -= self._dbusmonitor.get_value( - i, '/Ac/Out/L1/V', 0) * self._dbusmonitor.get_value( - i, '/Ac/Out/L1/I', 0) - newvalues['/Dc/System/MeasurementType'] = 0 # estimated - # FIXME In future we will subtract alternator power from the - # calculated DC power, because it will be individually - # displayed. For now, we leave it out so that in the current - # version of Venus it does not break user's expectations. - #newvalues['/Dc/System/Power'] = dc_pv_power + charger_power + fuelcell_power + vebuspower + inverter_power - battery_power - alternator_power -#### changed for GuiMods - # average DC system power over 3 passes (seconds) to minimize wild swings in displayed value - self.dcSystemPower[2] = self.dcSystemPower[1] - self.dcSystemPower[1] = self.dcSystemPower[0] - self.dcSystemPower[0] = dc_pv_power + charger_power + fuelcell_power + vebuspower + inverter_power - battery_power + alternator_power + windgen_power - motordrive_power - newvalues['/Dc/System/Power'] = (self.dcSystemPower[0] + self.dcSystemPower[1] + self.dcSystemPower[2]) / 3 - - elif self._settings['hasdcsystem'] == 1 and solarchargers_loadoutput_power is not None: - newvalues['/Dc/System/MeasurementType'] = 0 # estimated - newvalues['/Dc/System/Power'] = solarchargers_loadoutput_power - - # ==== Vebus ==== - multi_path = getattr(delegates.Multi.instance.multi, 'service', None) - if multi_path is not None: - dc_current = self._dbusmonitor.get_value(multi_path, '/Dc/0/Current') - newvalues['/Dc/Vebus/Current'] = dc_current - dc_power = self._dbusmonitor.get_value(multi_path, '/Dc/0/Power') - # Just in case /Dc/0/Power is not available - if dc_power == None and dc_current is not None: - dc_voltage = self._dbusmonitor.get_value(multi_path, '/Dc/0/Voltage') - if dc_voltage is not None: - dc_power = dc_voltage * dc_current - # Note that there is also vebuspower, which is the total DC power summed over all multis. - # However, this value cannot be combined with /Dc/Multi/Current, because it does not make sense - # to add the Dc currents of all multis if they do not share the same DC voltage. - newvalues['/Dc/Vebus/Power'] = dc_power - - # ===== AC IN SOURCE ===== - ac_in_source = None - active_input = None - if multi_path is None: - # Check if we have an non-VE.Bus inverter. - if non_vebus_inverter is not None: - if (active_input := self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/ActiveIn/ActiveInput')) is not None and \ - active_input in (0, 1) and \ - (active_type := self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/{}/Type'.format(active_input + 1))) is not None: - ac_in_source = active_type - else: - ac_in_source = 240 - else: - active_input = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/ActiveInput') - if active_input == 0xF0: - # Not connected - ac_in_source = 240 - elif active_input is not None: - settings_path = '/Settings/SystemSetup/AcInput%s' % (active_input + 1) - ac_in_source = self._dbusmonitor.get_value('com.victronenergy.settings', settings_path) - newvalues['/Ac/ActiveIn/Source'] = ac_in_source - - # ===== GRID METERS & CONSUMPTION ==== - grid_meter = delegates.AcInputs.instance.gridmeter - genset_meter = delegates.AcInputs.instance.gensetmeter - - # Make an educated guess as to what is being consumed from an AC source. If ac_in_source - # indicates grid, genset or shore, we use that. If the Multi is off, or disconnected through - # a relay assistant or otherwise, then assume the presence of a .grid or .genset service indicates - # presence of that AC source. If both are available, then give up. This decision making is here - # so the GUI has something to present even if the Multi is off. - ac_in_guess = ac_in_source - if ac_in_guess in (None, 0xF0): - if genset_meter is None and grid_meter is not None: - ac_in_guess = 1 - elif grid_meter is None and genset_meter is not None: - ac_in_guess = 2 - - consumption = { "L1" : None, "L2" : None, "L3" : None } - currentconsumption = { "L1" : None, "L2" : None, "L3" : None } - -#### added for GuiMods - voltageIn = { "L1" : None, "L2" : None, "L3" : None } - voltageOut = { "L1" : None, "L2" : None, "L3" : None } - frequencyIn = None - frequencyOut = None - - for device_type, em, _types in (('Grid', grid_meter, (1, 3)), ('Genset', genset_meter, (2,))): - # If a grid meter is present we use values from it. If not, we look at the multi. If it has - # AcIn1 or AcIn2 connected to the grid, we use those values. - # com.victronenergy.grid.??? indicates presence of an energy meter used as grid meter. - # com.victronenergy.vebus.???/Ac/ActiveIn/ActiveInput: decides which whether we look at AcIn1 - # or AcIn2 as possible grid connection. - uses_active_input = ac_in_source in _types - for phase in consumption: - p = None - mc = None - pvpower = newvalues.get('/Ac/PvOn%s/%s/Power' % (device_type, phase)) - pvcurrent = newvalues.get('/Ac/PvOn%s/%s/Current' % (device_type, phase)) - if em is not None: - p = self._dbusmonitor.get_value(em.service, '/Ac/%s/Power' % phase) - mc = self._dbusmonitor.get_value(em.service, '/Ac/%s/Current' % phase) -#### added for GuiMods - if voltageIn[phase] == None: - voltageIn[phase] = self._dbusmonitor.get_value(em.service, '/Ac/%s/Voltage' % phase) - if frequencyIn == None: - frequencyIn = self._dbusmonitor.get_value(em.service, '/Ac/%s/Frequency' % phase) - - # Compute consumption between energy meter and multi (meter power - multi AC in) and - # add an optional PV inverter on input to the mix. - c = None - cc = None - if uses_active_input: - if multi_path is not None: - try: - c = _safeadd(c, -self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/P' % phase)) - cc = _safeadd(cc, -self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/I' % phase)) -#### added for GuiMods - if voltageIn[phase] == None: - voltageIn[phase] = self._dbusmonitor.get_value(em.service, '/Ac/ActiveIn/%s/V' % phase) - if frequencyIn == None: - frequencyIn = self._dbusmonitor.get_value(em.service, '/Ac/ActiveIn/%s/F' % phase) - - except TypeError: - pass - elif non_vebus_inverter is not None and active_input in (0, 1): - try: - c = _safeadd(c, -self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/P' % (active_input+1, phase))) - cc = _safeadd(cc, -self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/I' % (active_input+1, phase))) -#### added for GuiMods - if voltageIn[phase] == None: - voltageIn[phase] = self._dbusmonitor.get_value(em.service, '/Ac/In/%d/%s/V' % (active_input+1, phase)) - if frequencyIn == None: - frequencyIn = self._dbusmonitor.get_value(em.service, '/Ac/In/%d/%s/F' % (active_input+1, phase)) - - except TypeError: - pass - - # If there's any power coming from a PV inverter in the inactive AC in (which is unlikely), - # it will still be used, because there may also be a load in the same ACIn consuming - # power, or the power could be fed back to the net. - c = _safeadd(c, p, pvpower) - cc = _safeadd(cc, mc, pvcurrent) - consumption[phase] = _safeadd(consumption[phase], _safemax(0, c)) - currentconsumption[phase] = _safeadd(currentconsumption[phase], _safemax(0, cc)) - else: - if uses_active_input: - if multi_path is not None and ( - p := self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/P' % phase)) is not None: - consumption[phase] = _safeadd(0, consumption[phase]) - currentconsumption[phase] = _safeadd(0, currentconsumption[phase]) - mc = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/I' % phase) -#### added for GuiMods - if voltageIn[phase] == None: - voltageIn[phase] = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/V' % phase) - if frequencyIn == None: - freq = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/F' % phase) - if freq != None: - frequencyIn = freq - - elif non_vebus_inverter is not None and active_input in (0, 1): - p = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/P' % (active_input + 1, phase)) - mc = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/I' % (active_input + 1, phase)) -#### added for GuiMods - if voltageIn[phase] == None: - voltageIn[phase] = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/V' % (active_input + 1, phase)) - if frequencyIn == None: - frequencyIn = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/F' % (active_input + 1, phase)) - - if p is not None: - consumption[phase] = _safeadd(0, consumption[phase]) - currentconsumption[phase] = _safeadd(0, currentconsumption[phase]) - - # No relevant energy meter present. Assume there is no load between the grid and the multi. - # There may be a PV inverter present though (Hub-3 setup). - try: - p = _safeadd(p, -pvpower) - mc = _safeadd(mc, -pvcurrent) - except TypeError: - pass - - newvalues['/Ac/%s/%s/Power' % (device_type, phase)] = p - newvalues['/Ac/%s/%s/Current' % (device_type, phase)] = mc -#### added for GuiMods - if p != None: - newvalues['/Ac/%s/%s/Voltage' % (device_type, phase)] = voltageIn[phase] - newvalues['/Ac/%s/Frequency' % (device_type)] = frequencyIn - - if ac_in_guess in _types: - newvalues['/Ac/ActiveIn/%s/Power' % phase] = p - newvalues['/Ac/ActiveIn/%s/Current' % phase] = mc -#### added for GuiMods - if p != None: - newvalues['/Ac/ActiveIn/%s/Voltage' % (phase,)] = voltageIn[phase] - newvalues['/Ac/ActiveIn/Frequency'] = frequencyIn - - self._compute_number_of_phases('/Ac/%s' % device_type, newvalues) - self._compute_number_of_phases('/Ac/ActiveIn', newvalues) - - product_id = None - device_type_id = None - if em is not None: - product_id = em.product_id - device_type_id = em.device_type - if product_id is None and uses_active_input: - if multi_path is not None: - product_id = self._dbusmonitor.get_value(multi_path, '/ProductId') - elif non_vebus_inverter is not None: - product_id = self._dbusmonitor.get_value(non_vebus_inverter, '/ProductId') - newvalues['/Ac/%s/ProductId' % device_type] = product_id - newvalues['/Ac/%s/DeviceType' % device_type] = device_type_id - - # If we have an ESS system and RunWithoutGridMeter is set, there cannot be load on the AC-In, so it - # must be on AC-Out. Hence we do calculate AC-Out consumption even if 'useacout' is disabled. - # Similarly all load are by definition on the output if this is not an ESS system. - use_ac_out = \ - self._settings['useacout'] == 1 or \ - (multi_path is not None and self._dbusmonitor.get_value(multi_path, '/Hub4/AssistantId') not in (4, 5)) or \ - self._dbusmonitor.get_value('com.victronenergy.settings', '/Settings/CGwacs/RunWithoutGridMeter') == 1 - for phase in consumption: - c = None - a = None - if use_ac_out: - c = newvalues.get('/Ac/PvOnOutput/%s/Power' % phase) - a = newvalues.get('/Ac/PvOnOutput/%s/Current' % phase) -#### added for GuiMods - if voltageOut[phase] == None: - voltageOut[phase] = newvalues.get('/Ac/PvOnOutput/%s/Voltage' % phase) - if frequencyOut == None: - frequencyOut = newvalues.get('/Ac/PvOnOutput/%s/Frequency' % phase) - - if multi_path is None: - for inv in non_vebus_inverters: - ac_out = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/P' % phase) - i = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/I' % phase) -#### added for GuiMods - if voltageOut[phase] == None: - voltageOut[phase] = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/V' % phase) - if frequencyOut == None: - frequencyOut = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/F' % phase) - - # Some models don't show power, try apparent power, - # else calculate it - if ac_out is None: - ac_out = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/S' % phase) - if ac_out is None: -#### modified for GuiMods - # u = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/V' % phase) - if None not in (i, voltageOut[phase]): - ac_out = i * voltageOut[phase] - c = _safeadd(c, ac_out) - a = _safeadd(a, i) - else: - ac_out = self._dbusmonitor.get_value(multi_path, '/Ac/Out/%s/P' % phase) - c = _safeadd(c, ac_out) - i_out = self._dbusmonitor.get_value(multi_path, '/Ac/Out/%s/I' % phase) - a = _safeadd(a, i_out) -#### added for GuiMods - if voltageOut[phase] == None: - voltageOut[phase] = self._dbusmonitor.get_value(multi_path, '/Ac/Out/%s/V' % phase) - if frequencyOut == None: - frequencyOut = self._dbusmonitor.get_value(multi_path, '/Ac/Out/%s/F' % phase) - c = _safemax(0, c) - a = _safemax(0, a) - newvalues['/Ac/ConsumptionOnOutput/%s/Power' % phase] = c - newvalues['/Ac/ConsumptionOnOutput/%s/Current' % phase] = a - newvalues['/Ac/ConsumptionOnInput/%s/Power' % phase] = consumption[phase] - newvalues['/Ac/ConsumptionOnInput/%s/Current' % phase] = currentconsumption[phase] - newvalues['/Ac/Consumption/%s/Power' % phase] = _safeadd(consumption[phase], c) - newvalues['/Ac/Consumption/%s/Current' % phase] = _safeadd(currentconsumption[phase], a) -#### added for GuiMods - newvalues['/Ac/ConsumptionOnOutput/%s/Voltage' % phase] = voltageOut[phase] - newvalues['/Ac/ConsumptionOnInput/%s/Voltage' % phase] = voltageIn[phase] - if voltageOut[phase] != None: - newvalues['/Ac/Consumption/%s/Voltage' % phase] = voltageOut[phase] - elif voltageIn[phase] != None: - newvalues['/Ac/Consumption/%s/Voltage' % phase] = voltageIn[phase] - if frequencyIn != None: - newvalues['/Ac/ConsumptionOnInput/Frequency'] = frequencyIn - if frequencyOut != None: - newvalues['/Ac/ConsumptionOnOutput/Frequency'] = frequencyOut - if frequencyOut != None: - newvalues['/Ac/Consumption/Frequency'] = frequencyOut - elif frequencyIn != None: - newvalues['/Ac/Consumption/Frequency'] = frequencyIn - - self._compute_number_of_phases('/Ac/Consumption', newvalues) - self._compute_number_of_phases('/Ac/ConsumptionOnOutput', newvalues) - self._compute_number_of_phases('/Ac/ConsumptionOnInput', newvalues) - - for m in self._modules: - m.update_values(newvalues) - - # ==== UPDATE DBUS ITEMS ==== - with self._dbusservice as sss: - for path in self._summeditems.keys(): - # Why the None? Because we want to invalidate things we don't have anymore. - sss[path] = newvalues.get(path, None) - - def _handleservicechange(self): - # Update the available battery monitor services, used to populate the dropdown in the settings. - # Below code makes a dictionary. The key is [dbuserviceclass]/[deviceinstance]. For example - # "battery/245". The value is the name to show to the user in the dropdown. The full dbus- - # servicename, ie 'com.victronenergy.vebus.ttyO1' is not used, since the last part of that is not - # fixed. dbus-serviceclass name and the device instance are already fixed, so best to use those. - - services = self._get_connected_service_list('com.victronenergy.vebus') - services.update(self._get_connected_service_list('com.victronenergy.battery')) - services.update({k: v for k, v in self._get_connected_service_list( - 'com.victronenergy.multi').items() if self._dbusmonitor.get_value(k, '/Soc') is not None}) - services.update({k: v for k, v in self._get_connected_service_list( - 'com.victronenergy.inverter').items() if self._dbusmonitor.get_value(k, '/Soc') is not None}) - - ul = {self.BATSERVICE_DEFAULT: 'Automatic', self.BATSERVICE_NOBATTERY: 'No battery monitor'} - for servicename, instance in services.items(): - key = self._get_instance_service_name(servicename, instance) - ul[key] = self._get_readable_service_name(servicename) - self._dbusservice['/AvailableBatteryServices'] = json.dumps(ul) - - ul = {self.BATSERVICE_DEFAULT: 'Automatic', self.BATSERVICE_NOBATTERY: 'No battery monitor'} - # For later: for device supporting multiple Dc measurement we should add entries for /Dc/1 etc as - # well. - for servicename, instance in services.items(): - key = self._get_instance_service_name(servicename, instance).replace('.', '_').replace('/', '_') + '/Dc/0' - ul[key] = self._get_readable_service_name(servicename) - self._dbusservice['/AvailableBatteryMeasurements'] = ul - - self._determinebatteryservice() - - self._changed = True - - def _get_readable_service_name(self, servicename): - return '%s on %s' % ( - self._dbusmonitor.get_value(servicename, '/ProductName'), - self._dbusmonitor.get_value(servicename, '/Mgmt/Connection')) - - def _get_instance_service_name(self, service, instance): - return '%s/%s' % ('.'.join(service.split('.')[0:3]), instance) - - def _remove_unconnected_services(self, services): - # Workaround: because com.victronenergy.vebus is available even when there is no vebus product - # connected, remove any service that is not connected. Previously we used - # /State since mandatory path /Connected is not implemented in mk2dbus, - # but this has since been resolved. - for servicename in list(services.keys()): - if (self._dbusmonitor.get_value(servicename, '/Connected') != 1 - or self._dbusmonitor.get_value(servicename, '/ProductName') is None - or self._dbusmonitor.get_value(servicename, '/Mgmt/Connection') is None): - del services[servicename] - - def _dbus_value_changed(self, dbusServiceName, dbusPath, dict, changes, deviceInstance): - self._changed = True - - # Workaround because com.victronenergy.vebus is available even when there is no vebus product - # connected. - if (dbusPath in ['/Connected', '/ProductName', '/Mgmt/Connection'] or - (dbusPath == '/State' and dbusServiceName.split('.')[0:3] == ['com', 'victronenergy', 'vebus'])): - self._handleservicechange() - - # Track the timezone changes - if dbusPath == '/Settings/System/TimeZone': - tz = changes.get('Value') - if tz is not None: - os.environ['TZ'] = tz - time.tzset() - - def _device_added(self, service, instance, do_service_change=True): - if do_service_change: - self._handleservicechange() - - for m in self._modules: - m.device_added(service, instance, do_service_change) - - def _device_removed(self, service, instance): - self._handleservicechange() - - for m in self._modules: - m.device_removed(service, instance) - - def _gettext(self, path, value): - if path == '/Dc/Battery/State': - state = {self.STATE_IDLE: 'Idle', self.STATE_CHARGING: 'Charging', - self.STATE_DISCHARGING: 'Discharging'} - return state[value] - item = self._summeditems.get(path) - if item is not None: - return item['gettext'] % value - return str(value) - - def _compute_number_of_phases(self, path, newvalues): - number_of_phases = None - for phase in range(1, 4): - p = newvalues.get('%s/L%s/Power' % (path, phase)) - if p is not None: - number_of_phases = phase - newvalues[path + '/NumberOfPhases'] = number_of_phases - - def _get_connected_service_list(self, classfilter=None): - services = self._dbusmonitor.get_service_list(classfilter=classfilter) - self._remove_unconnected_services(services) - return services - - # returns a servicename string - def _get_first_connected_service(self, classfilter): - services = self._get_connected_service_list(classfilter=classfilter) - if len(services) == 0: - return None - return next(iter(services.items()), (None,))[0] - - # returns a tuple (servicename, instance) - def _get_service_having_lowest_instance(self, classfilter=None): - services = self._get_connected_service_list(classfilter=classfilter) - if len(services) == 0: - return None - - # sort the dict by value; returns list of tuples: (value, key) - s = sorted((value, key) for (key, value) in services.items()) - return (s[0][1], s[0][0]) - - -class DbusSystemCalc(SystemCalc): - def _create_dbus_monitor(self, *args, **kwargs): - return DbusMonitor(*args, **kwargs) - - def _create_settings(self, *args, **kwargs): - bus = dbus.SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else dbus.SystemBus() - return SettingsDevice(bus, *args, timeout=10, **kwargs) - - def _create_dbus_service(self): - venusversion, venusbuildtime = self._get_venus_versioninfo() - - dbusservice = VeDbusService('com.victronenergy.system') - dbusservice.add_mandatory_paths( - processname=__file__, - processversion=softwareVersion, - connection='data from other dbus processes', - deviceinstance=0, - productid=None, - productname=None, - firmwareversion=venusversion, - hardwareversion=None, - connected=1) - dbusservice.add_path('/FirmwareBuild', value=venusbuildtime) - return dbusservice - - def _get_venus_versioninfo(self): - try: - with open("/opt/victronenergy/version", "r") as fp: - version, software, buildtime = fp.read().split('\n')[:3] - major, minor, _, rev = re.compile('v([0-9]*)\.([0-9]*)(~([0-9]*))?').match(version).groups() - return (int(major, 16)<<16)+(int(minor, 16)<<8)+(0 if rev is None else int(rev, 16)), buildtime - except Exception: - pass - return 0, '0' - -if __name__ == "__main__": - # Argument parsing - parser = argparse.ArgumentParser( - description='Converts readings from AC-Sensors connected to a VE.Bus device in a pvinverter ' + - 'D-Bus service.' - ) - - parser.add_argument("-d", "--debug", help="set logging level to debug", - action="store_true") - - args = parser.parse_args() - - print("-------- dbus_systemcalc, v" + softwareVersion + " is starting up --------") - logger = setup_logging(args.debug) - - # Have a mainloop, so we can send/receive asynchronous calls to and from dbus - DBusGMainLoop(set_as_default=True) - - systemcalc = DbusSystemCalc() - - # Start and run the mainloop - logger.info("Starting mainloop, responding only on events") - mainloop = GLib.MainLoop() - mainloop.run() diff --git a/FileSets/v3.20~18/dbus_systemcalc.py.orig b/FileSets/v3.20~18/dbus_systemcalc.py.orig deleted file mode 100755 index 0933d8f5..00000000 --- a/FileSets/v3.20~18/dbus_systemcalc.py.orig +++ /dev/null @@ -1,1146 +0,0 @@ -#!/usr/bin/python3 -u -# -*- coding: utf-8 -*- - -from dbus.mainloop.glib import DBusGMainLoop -import dbus -import argparse -import sys -import os -import json -import time -import re -from gi.repository import GLib - -# Victron packages -sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) -from vedbus import VeDbusService -from ve_utils import get_vrm_portal_id, exit_on_error -from dbusmonitor import DbusMonitor -from settingsdevice import SettingsDevice -from logger import setup_logging -import delegates -from sc_utils import safeadd as _safeadd, safemax as _safemax - -softwareVersion = '2.136' - -class SystemCalc: - STATE_IDLE = 0 - STATE_CHARGING = 1 - STATE_DISCHARGING = 2 - BATSERVICE_DEFAULT = 'default' - BATSERVICE_NOBATTERY = 'nobattery' - def __init__(self): - # Why this dummy? Because DbusMonitor expects these values to be there, even though we don't - # need them. So just add some dummy data. This can go away when DbusMonitor is more generic. - dummy = {'code': None, 'whenToLog': 'configChange', 'accessLevel': None} - dbus_tree = { - 'com.victronenergy.solarcharger': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Load/I': dummy, - '/FirmwareVersion': dummy}, - 'com.victronenergy.battery': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/DeviceInstance': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/1/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Soc': dummy, - '/Sense/Current': dummy, - '/TimeToGo': dummy, - '/ConsumedAmphours': dummy, - '/ProductId': dummy, - '/CustomName': dummy, - '/Info/MaxChargeVoltage': dummy}, - 'com.victronenergy.vebus' : { - '/Ac/ActiveIn/ActiveInput': dummy, - '/Ac/ActiveIn/L1/P': dummy, - '/Ac/ActiveIn/L2/P': dummy, - '/Ac/ActiveIn/L3/P': dummy, - '/Ac/ActiveIn/L1/I': dummy, - '/Ac/ActiveIn/L2/I': dummy, - '/Ac/ActiveIn/L3/I': dummy, - '/Ac/Out/L1/P': dummy, - '/Ac/Out/L2/P': dummy, - '/Ac/Out/L3/P': dummy, - '/Ac/Out/L1/I': dummy, - '/Ac/Out/L2/I': dummy, - '/Ac/Out/L3/I': dummy, - '/Connected': dummy, - '/ProductId': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Mode': dummy, - '/State': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Soc': dummy}, - 'com.victronenergy.fuelcell': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy}, - 'com.victronenergy.charger': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/1/Voltage': dummy, - '/Dc/1/Current': dummy, - '/Dc/2/Voltage': dummy, - '/Dc/2/Current': dummy}, - 'com.victronenergy.grid' : { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/ProductId' : dummy, - '/DeviceType' : dummy, - '/Ac/L1/Power': dummy, - '/Ac/L2/Power': dummy, - '/Ac/L3/Power': dummy, - '/Ac/L1/Current': dummy, - '/Ac/L2/Current': dummy, - '/Ac/L3/Current': dummy}, - 'com.victronenergy.genset' : { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/ProductId' : dummy, - '/DeviceType' : dummy, - '/Ac/L1/Power': dummy, - '/Ac/L2/Power': dummy, - '/Ac/L3/Power': dummy, - '/Ac/L1/Current': dummy, - '/Ac/L2/Current': dummy, - '/Ac/L3/Current': dummy, - '/StarterVoltage': dummy}, - 'com.victronenergy.settings' : { - '/Settings/SystemSetup/AcInput1' : dummy, - '/Settings/SystemSetup/AcInput2' : dummy, - '/Settings/CGwacs/RunWithoutGridMeter' : dummy, - '/Settings/System/TimeZone' : dummy}, - 'com.victronenergy.temperature': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy}, - 'com.victronenergy.inverter': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Ac/Out/L1/P': dummy, - '/Ac/Out/L1/S': dummy, - '/Ac/Out/L1/V': dummy, - '/Ac/Out/L1/I': dummy, - '/Yield/Power': dummy, - '/Soc': dummy}, - 'com.victronenergy.multi': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Ac/ActiveIn/ActiveInput': dummy, - '/Ac/In/1/Type': dummy, - '/Ac/In/2/Type': dummy, - '/Ac/In/1/L1/P': dummy, - '/Ac/In/1/L1/I': dummy, - '/Ac/In/2/L1/P': dummy, - '/Ac/In/2/L1/I': dummy, - '/Ac/Out/L1/P': dummy, - '/Ac/Out/L1/V': dummy, - '/Ac/Out/L1/I': dummy, - '/Yield/Power': dummy, - '/Soc': dummy}, - 'com.victronenergy.dcsystem': { - '/Dc/0/Voltage': dummy, - '/Dc/0/Power': dummy - }, - 'com.victronenergy.alternator': { - '/Dc/0/Power': dummy - } - } - - self._modules = [ - delegates.Multi(), - delegates.HubTypeSelect(), - delegates.VebusSocWriter(), - delegates.ServiceMapper(), - delegates.RelayState(), - delegates.BuzzerControl(), - delegates.LgCircuitBreakerDetect(), - delegates.BatterySoc(self), - delegates.Dvcc(self), - delegates.BatterySense(self), - delegates.BatterySettings(self), - delegates.SystemState(self), - delegates.BatteryLife(), - delegates.ScheduledCharging(), - delegates.SourceTimers(), - delegates.BatteryData(), - delegates.Gps(), - delegates.AcInputs(), - delegates.GensetStartStop(), - delegates.SocSync(self), - delegates.PvInverters(), - delegates.BatteryService(self), - delegates.CanBatterySense(), - delegates.DynamicEss()] - - for m in self._modules: - for service, paths in m.get_input(): - s = dbus_tree.setdefault(service, {}) - for path in paths: - s[path] = dummy - - self._dbusmonitor = self._create_dbus_monitor(dbus_tree, valueChangedCallback=self._dbus_value_changed, - deviceAddedCallback=self._device_added, deviceRemovedCallback=self._device_removed) - - # Connect to localsettings - supported_settings = { - 'batteryservice': ['/Settings/SystemSetup/BatteryService', self.BATSERVICE_DEFAULT, 0, 0], - 'hasdcsystem': ['/Settings/SystemSetup/HasDcSystem', 0, 0, 1], - 'useacout': ['/Settings/SystemSetup/HasAcOutSystem', 1, 0, 1]} - - for m in self._modules: - for setting in m.get_settings(): - supported_settings[setting[0]] = list(setting[1:]) - - self._settings = self._create_settings(supported_settings, self._handlechangedsetting) - - self._dbusservice = self._create_dbus_service() - - for m in self._modules: - m.set_sources(self._dbusmonitor, self._settings, self._dbusservice) - - # At this moment, VRM portal ID is the MAC address of the CCGX. Anyhow, it should be string uniquely - # identifying the CCGX. - self._dbusservice.add_path('/Serial', value=get_vrm_portal_id()) - self._dbusservice.add_path( - '/AvailableBatteryServices', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/AvailableBatteryMeasurements', value=None) - self._dbusservice.add_path( - '/AutoSelectedBatteryService', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/AutoSelectedBatteryMeasurement', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/ActiveBatteryService', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/Dc/Battery/BatteryService', value=None) - self._summeditems = { - '/Ac/Grid/L1/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L2/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L3/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L1/Current': {'gettext': '%.1F A'}, - '/Ac/Grid/L2/Current': {'gettext': '%.1F A'}, - '/Ac/Grid/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Grid/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/Grid/ProductId': {'gettext': '%s'}, - '/Ac/Grid/DeviceType': {'gettext': '%s'}, - '/Ac/Genset/L1/Power': {'gettext': '%.0F W'}, - '/Ac/Genset/L2/Power': {'gettext': '%.0F W'}, - '/Ac/Genset/L3/Power': {'gettext': '%.0F W'}, - '/Ac/Genset/L1/Current': {'gettext': '%.1F A'}, - '/Ac/Genset/L2/Current': {'gettext': '%.1F A'}, - '/Ac/Genset/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Genset/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/Genset/ProductId': {'gettext': '%s'}, - '/Ac/Genset/DeviceType': {'gettext': '%s'}, - '/Ac/ConsumptionOnOutput/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L1/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L2/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L3/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L1/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnOutput/L2/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnOutput/L3/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnInput/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L1/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L2/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L3/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L1/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnInput/L2/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnInput/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/Consumption/L1/Power': {'gettext': '%.0F W'}, - '/Ac/Consumption/L2/Power': {'gettext': '%.0F W'}, - '/Ac/Consumption/L3/Power': {'gettext': '%.0F W'}, - '/Ac/Consumption/L1/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/L2/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/NumberOfPhases': {'gettext': '%.0F W'}, - '/Dc/Pv/Power': {'gettext': '%.0F W'}, - '/Dc/Pv/Current': {'gettext': '%.1F A'}, - '/Dc/Battery/Voltage': {'gettext': '%.2F V'}, - '/Dc/Battery/VoltageService': {'gettext': '%s'}, - '/Dc/Battery/Current': {'gettext': '%.1F A'}, - '/Dc/Battery/Power': {'gettext': '%.0F W'}, - '/Dc/Battery/State': {'gettext': '%s'}, - '/Dc/Battery/TimeToGo': {'gettext': '%.0F s'}, - '/Dc/Battery/ConsumedAmphours': {'gettext': '%.1F Ah'}, - '/Dc/Battery/ProductId': {'gettext': '0x%x'}, - '/Dc/Charger/Power': {'gettext': '%.0F %%'}, - '/Dc/FuelCell/Power': {'gettext': '%.0F %%'}, - '/Dc/Alternator/Power': {'gettext': '%.0F W'}, - '/Dc/Vebus/Current': {'gettext': '%.1F A'}, - '/Dc/Vebus/Power': {'gettext': '%.0F W'}, - '/Dc/System/Power': {'gettext': '%.0F W'}, - '/Dc/System/MeasurementType': {'gettext': '%d'}, - '/Ac/ActiveIn/Source': {'gettext': '%s'}, - '/Ac/ActiveIn/L1/Power': {'gettext': '%.0F W'}, - '/Ac/ActiveIn/L2/Power': {'gettext': '%.0F W'}, - '/Ac/ActiveIn/L3/Power': {'gettext': '%.0F W'}, - '/Ac/ActiveIn/L1/Current': {'gettext': '%.1F A'}, - '/Ac/ActiveIn/L2/Current': {'gettext': '%.1F A'}, - '/Ac/ActiveIn/L3/Current': {'gettext': '%.1F A'}, - '/Ac/ActiveIn/NumberOfPhases': {'gettext': '%d'}, - } - - for m in self._modules: - self._summeditems.update(m.get_output()) - - for path in self._summeditems.keys(): - self._dbusservice.add_path(path, value=None, gettextcallback=self._gettext) - - self._batteryservice = None - self._determinebatteryservice() - - if self._batteryservice is None: - logger.info("Battery service initialized to None (setting == %s)" % - self._settings['batteryservice']) - - self._changed = True - for service, instance in self._dbusmonitor.get_service_list().items(): - self._device_added(service, instance, do_service_change=False) - - self._handleservicechange() - self._updatevalues() - - GLib.timeout_add(1000, exit_on_error, self._handletimertick) - - def _create_dbus_monitor(self, *args, **kwargs): - raise Exception("This function should be overridden") - - def _create_settings(self, *args, **kwargs): - raise Exception("This function should be overridden") - - def _create_dbus_service(self): - raise Exception("This function should be overridden") - - def _handlechangedsetting(self, setting, oldvalue, newvalue): - self._determinebatteryservice() - self._changed = True - - # Give our delegates a chance to react on a settings change - for m in self._modules: - m.settings_changed(setting, oldvalue, newvalue) - - def _find_device_instance(self, serviceclass, instance): - """ Gets a mapping of services vs DeviceInstance using - get_service_list. Then searches for the specified DeviceInstance - and returns the service name. """ - services = self._dbusmonitor.get_service_list(classfilter=serviceclass) - - for k, v in services.items(): - if v == instance: - return k - return None - - def _determinebatteryservice(self): - auto_battery_service = self._autoselect_battery_service() - auto_battery_measurement = None - auto_selected = False - if auto_battery_service is not None: - services = self._dbusmonitor.get_service_list() - if auto_battery_service in services: - auto_battery_measurement = \ - self._get_instance_service_name(auto_battery_service, services[auto_battery_service]) - auto_battery_measurement = auto_battery_measurement.replace('.', '_').replace('/', '_') + '/Dc/0' - self._dbusservice['/AutoSelectedBatteryMeasurement'] = auto_battery_measurement - - if self._settings['batteryservice'] == self.BATSERVICE_DEFAULT: - auto_selected = True - newbatteryservice = auto_battery_service - self._dbusservice['/AutoSelectedBatteryService'] = ( - 'No battery monitor found' if newbatteryservice is None else - self._get_readable_service_name(newbatteryservice)) - - elif self._settings['batteryservice'] == self.BATSERVICE_NOBATTERY: - self._dbusservice['/AutoSelectedBatteryService'] = None - newbatteryservice = None - - else: - self._dbusservice['/AutoSelectedBatteryService'] = None - - s = self._settings['batteryservice'].split('/') - if len(s) != 2: - logger.error("The battery setting (%s) is invalid!" % self._settings['batteryservice']) - serviceclass = s[0] - instance = int(s[1]) if len(s) == 2 else None - - # newbatteryservice might turn into None if a chosen battery - # monitor no longer exists. Don't auto change the setting (it might - # come back) and don't autoselect another. - newbatteryservice = self._find_device_instance(serviceclass, instance) - - if newbatteryservice != self._batteryservice: - services = self._dbusmonitor.get_service_list() - instance = services.get(newbatteryservice, None) - if instance is None: - battery_service = None - else: - battery_service = self._get_instance_service_name(newbatteryservice, instance) - self._dbusservice['/ActiveBatteryService'] = battery_service - logger.info("Battery service, setting == %s, changed from %s to %s (%s)" % - (self._settings['batteryservice'], self._batteryservice, newbatteryservice, instance)) - - # Battery service has changed. Notify delegates. - self._dbusservice['/Dc/Battery/BatteryService'] = self._batteryservice = newbatteryservice - for m in self._modules: - m.battery_service_changed(auto_selected, self._batteryservice, newbatteryservice) - - def _autoselect_battery_service(self): - # Default setting business logic: - # first try to use a battery service (BMV or Lynx Shunt VE.Can). If there - # is more than one battery service, just use a random one. If no battery service is - # available, check if there are not Solar chargers and no normal chargers. If they are not - # there, assume this is a hub-2, hub-3 or hub-4 system and use VE.Bus SOC. - batteries = self._get_connected_service_list('com.victronenergy.battery') - - # Pick the battery service that has the lowest DeviceInstance, giving - # preference to those with a BMS. - if len(batteries) > 0: - batteries = [ - (not self._dbusmonitor.seen(s, '/Info/MaxChargeVoltage'), i, s) - for s, i in batteries.items()] - return sorted(batteries, key=lambda x: x[:2])[0][2] - - # No battery services, and there is a charger in the system. Abandon - # hope. - if self._get_first_connected_service('com.victronenergy.charger') is not None: - return None - - # Also no Multi, then give up. - vebus_service = self._get_service_having_lowest_instance('com.victronenergy.vebus') - if vebus_service is None: - # No VE.Bus, but maybe there is an inverter with built-in SOC - # tracking, eg RS Smart or Multi RS. - inverter = self._get_service_having_lowest_instance('com.victronenergy.multi') - if inverter and self._dbusmonitor.get_value(inverter[0], '/Soc') is not None: - return inverter[0] - - inverter = self._get_service_having_lowest_instance('com.victronenergy.inverter') - if inverter and self._dbusmonitor.get_value(inverter[0], '/Soc') is not None: - return inverter[0] - - return None - - # There is a Multi, it supports tracking external charge current from - # solarchargers, and there are no DC loads. Then use it. - if self._dbusmonitor.get_value( - vebus_service[0], '/ExtraBatteryCurrent') is not None \ - and self._get_first_connected_service('com.victronenergy.dcsystem') is None \ - and self._settings['hasdcsystem'] == 0: - return vebus_service[0] - - # Multi does not support tracking solarcharger current, and we have - # solar chargers. Then we cannot use it. - if self._get_first_connected_service('com.victronenergy.solarcharger') is not None: - return None - - # Only a Multi, no other chargers. Then we can use it. - return vebus_service[0] - - @property - def batteryservice(self): - return self._batteryservice - - # Called on a one second timer - def _handletimertick(self): - if self._changed: - self._updatevalues() - self._changed = False - - return True # keep timer running - - def _updatevalues(self): - # ==== PREPARATIONS ==== - newvalues = {} - - # Set the user timezone - if 'TZ' not in os.environ: - tz = self._dbusmonitor.get_value('com.victronenergy.settings', '/Settings/System/TimeZone') - if tz is not None: - os.environ['TZ'] = tz - time.tzset() - - # Determine values used in logic below - vebusses = self._dbusmonitor.get_service_list('com.victronenergy.vebus') - vebuspower = 0 - for vebus in vebusses: - v = self._dbusmonitor.get_value(vebus, '/Dc/0/Voltage') - i = self._dbusmonitor.get_value(vebus, '/Dc/0/Current') - if v is not None and i is not None: - vebuspower += v * i - - # ==== PVINVERTERS ==== - # Work is done in pv-inverter delegate. Ideally all of this should - # happen in update_values in the delegate, but these values are - # used below in calculating consumption, so until this is less - # unwieldy this has to stay here. - # TODO this can go away once consumption below no longer relies - # on these values, or has moved to its own delegate. - newvalues.update(delegates.PvInverters.instance.get_totals()) - self._compute_number_of_phases('/Ac/PvOnGrid', newvalues) - self._compute_number_of_phases('/Ac/PvOnOutput', newvalues) - self._compute_number_of_phases('/Ac/PvOnGenset', newvalues) - - # ==== SOLARCHARGERS ==== - solarchargers = self._dbusmonitor.get_service_list('com.victronenergy.solarcharger') - solarcharger_batteryvoltage = None - solarcharger_batteryvoltage_service = None - solarchargers_charge_power = 0 - solarchargers_loadoutput_power = None - - for solarcharger in solarchargers: - v = self._dbusmonitor.get_value(solarcharger, '/Dc/0/Voltage') - if v is None: - continue - i = self._dbusmonitor.get_value(solarcharger, '/Dc/0/Current') - if i is None: - continue - l = self._dbusmonitor.get_value(solarcharger, '/Load/I', 0) - - if l is not None: - if solarchargers_loadoutput_power is None: - solarchargers_loadoutput_power = l * v - else: - solarchargers_loadoutput_power += l * v - - solarchargers_charge_power += v * i - - # Note that this path is not in the _summeditems{}, making for it to not be - # published on D-Bus. Which fine. The only one needing it is the vebussocwriter- - # delegate. - if '/Dc/Pv/ChargeCurrent' not in newvalues: - newvalues['/Dc/Pv/ChargeCurrent'] = i - else: - newvalues['/Dc/Pv/ChargeCurrent'] += i - - if '/Dc/Pv/Power' not in newvalues: - newvalues['/Dc/Pv/Power'] = v * _safeadd(i, l) - newvalues['/Dc/Pv/Current'] = _safeadd(i, l) - solarcharger_batteryvoltage = v - solarcharger_batteryvoltage_service = solarcharger - else: - newvalues['/Dc/Pv/Power'] += v * _safeadd(i, l) - newvalues['/Dc/Pv/Current'] += _safeadd(i, l) - - # ==== FUELCELLS ==== - fuelcells = self._dbusmonitor.get_service_list('com.victronenergy.fuelcell') - fuelcell_batteryvoltage = None - fuelcell_batteryvoltage_service = None - for fuelcell in fuelcells: - # Assume the battery connected to output 0 is the main battery - v = self._dbusmonitor.get_value(fuelcell, '/Dc/0/Voltage') - if v is None: - continue - - fuelcell_batteryvoltage = v - fuelcell_batteryvoltage_service = fuelcell - - i = self._dbusmonitor.get_value(fuelcell, '/Dc/0/Current') - if i is None: - continue - - if '/Dc/FuelCell/Power' not in newvalues: - newvalues['/Dc/FuelCell/Power'] = v * i - else: - newvalues['/Dc/FuelCell/Power'] += v * i - - # ==== ALTERNATOR ==== - alternators = self._dbusmonitor.get_service_list('com.victronenergy.alternator') - for alternator in alternators: - # Assume the battery connected to output 0 is the main battery - p = self._dbusmonitor.get_value(alternator, '/Dc/0/Power') - if p is None: - continue - - if '/Dc/Alternator/Power' not in newvalues: - newvalues['/Dc/Alternator/Power'] = p - else: - newvalues['/Dc/Alternator/Power'] += p - - # ==== CHARGERS ==== - chargers = self._dbusmonitor.get_service_list('com.victronenergy.charger') - charger_batteryvoltage = None - charger_batteryvoltage_service = None - for charger in chargers: - # Assume the battery connected to output 0 is the main battery - v = self._dbusmonitor.get_value(charger, '/Dc/0/Voltage') - if v is None: - continue - - charger_batteryvoltage = v - charger_batteryvoltage_service = charger - - i = self._dbusmonitor.get_value(charger, '/Dc/0/Current') - if i is None: - continue - - if '/Dc/Charger/Power' not in newvalues: - newvalues['/Dc/Charger/Power'] = v * i - else: - newvalues['/Dc/Charger/Power'] += v * i - - # ==== Other Inverters and Inverter/Chargers ==== - _other_inverters = sorted((di, s) for s, di in self._dbusmonitor.get_service_list('com.victronenergy.multi').items()) + \ - sorted((di, s) for s, di in self._dbusmonitor.get_service_list('com.victronenergy.inverter').items()) - non_vebus_inverters = [x[1] for x in _other_inverters] - non_vebus_inverter = None - if non_vebus_inverters: - non_vebus_inverter = non_vebus_inverters[0] - - # For RS Smart and Multi RS, add PV to the yield - for i in non_vebus_inverters: - if (pv_yield := self._dbusmonitor.get_value(i, "/Yield/Power")) is not None: - newvalues['/Dc/Pv/Power'] = newvalues.get('/Dc/Pv/Power', 0) + pv_yield - - # Used lower down, possibly needed for battery values as well - dcsystems = self._dbusmonitor.get_service_list('com.victronenergy.dcsystem') - - # ==== BATTERY ==== - if self._batteryservice is not None: - batteryservicetype = self._batteryservice.split('.')[2] - assert batteryservicetype in ('battery', 'vebus', 'inverter', 'multi') - - newvalues['/Dc/Battery/TimeToGo'] = self._dbusmonitor.get_value(self._batteryservice,'/TimeToGo') - newvalues['/Dc/Battery/ConsumedAmphours'] = self._dbusmonitor.get_value(self._batteryservice,'/ConsumedAmphours') - newvalues['/Dc/Battery/ProductId'] = self._dbusmonitor.get_value(self._batteryservice, '/ProductId') - - if batteryservicetype in ('battery', 'inverter', 'multi'): - newvalues['/Dc/Battery/Voltage'] = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Voltage') - newvalues['/Dc/Battery/VoltageService'] = self._batteryservice - newvalues['/Dc/Battery/Current'] = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Current') - newvalues['/Dc/Battery/Power'] = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Power') - - elif batteryservicetype == 'vebus': - vebus_voltage = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Voltage') - vebus_current = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Current') - vebus_power = None if vebus_voltage is None or vebus_current is None else vebus_current * vebus_voltage - newvalues['/Dc/Battery/Voltage'] = vebus_voltage - newvalues['/Dc/Battery/VoltageService'] = self._batteryservice - if self._settings['hasdcsystem'] == 1 or dcsystems: - # hasdcsystem will normally disqualify the multi from being - # auto-selected as battery monitor, so the only way we're - # here is if the user explicitly selected the multi as the - # battery service - newvalues['/Dc/Battery/Current'] = vebus_current - if vebus_power is not None: - newvalues['/Dc/Battery/Power'] = vebus_power - else: - battery_power = _safeadd(solarchargers_charge_power, vebus_power) - newvalues['/Dc/Battery/Current'] = battery_power / vebus_voltage if vebus_voltage is not None and vebus_voltage > 0 else None - newvalues['/Dc/Battery/Power'] = battery_power - - - p = newvalues.get('/Dc/Battery/Power', None) - if p is not None: - if p > 30: - newvalues['/Dc/Battery/State'] = self.STATE_CHARGING - elif p < -30: - newvalues['/Dc/Battery/State'] = self.STATE_DISCHARGING - else: - newvalues['/Dc/Battery/State'] = self.STATE_IDLE - - else: - # The battery service is not a BMS/BMV or a suitable vebus. A - # suitable vebus is defined as one explicitly selected by the user, - # or one that was automatically selected for SOC tracking. We may - # however still have a VE.Bus, just not one that can accurately - # track SOC. If we have one, use it as voltage source. Otherwise - # try a solar charger, a charger, a vedirect inverter or a dcsource - # as fallbacks. - batteryservicetype = None - vebusses = self._dbusmonitor.get_service_list('com.victronenergy.vebus') - for vebus in vebusses: - v = self._dbusmonitor.get_value(vebus, '/Dc/0/Voltage') - s = self._dbusmonitor.get_value(vebus, '/State') - if v is not None and s not in (0, None): - newvalues['/Dc/Battery/Voltage'] = v - newvalues['/Dc/Battery/VoltageService'] = vebus - break # Skip the else below - else: - # No suitable vebus voltage, try other devices - if non_vebus_inverter is not None and (v := self._dbusmonitor.get_value(non_vebus_inverter, '/Dc/0/Voltage')) is not None: - newvalues['/Dc/Battery/Voltage'] = v - newvalues['/Dc/Battery/VoltageService'] = non_vebus_inverter - elif solarcharger_batteryvoltage is not None: - newvalues['/Dc/Battery/Voltage'] = solarcharger_batteryvoltage - newvalues['/Dc/Battery/VoltageService'] = solarcharger_batteryvoltage_service - elif charger_batteryvoltage is not None: - newvalues['/Dc/Battery/Voltage'] = charger_batteryvoltage - newvalues['/Dc/Battery/VoltageService'] = charger_batteryvoltage_service - elif fuelcell_batteryvoltage is not None: - newvalues['/Dc/Battery/Voltage'] = fuelcell_batteryvoltage - newvalues['/Dc/Battery/VoltageService'] = fuelcell_batteryvoltage_service - elif dcsystems: - # Get voltage from first dcsystem - s = next(iter(dcsystems.keys())) - v = self._dbusmonitor.get_value(s, '/Dc/0/Voltage') - if v is not None: - newvalues['/Dc/Battery/Voltage'] = v - newvalues['/Dc/Battery/VoltageService'] = s - - # We have no suitable battery monitor, so power and current data - # is not available. We can however calculate it from other values, - # if we have at least a battery voltage. - if '/Dc/Battery/Voltage' in newvalues: - dcsystempower = _safeadd(0, *(self._dbusmonitor.get_value(s, - '/Dc/0/Power', 0) for s in dcsystems)) - if dcsystems or self._settings['hasdcsystem'] == 0: - # Either DC loads are monitored, or there are no - # unmonitored DC loads or chargers: derive battery watts - # and amps from vebus, solarchargers, chargers and measured - # loads. - p = solarchargers_charge_power + newvalues.get('/Dc/Charger/Power', 0) + vebuspower - dcsystempower - voltage = newvalues['/Dc/Battery/Voltage'] - newvalues['/Dc/Battery/Current'] = p / voltage if voltage > 0 else None - newvalues['/Dc/Battery/Power'] = p - - # ==== SYSTEM POWER ==== - # Look for dcsytem devices, add them together. Otherwise, if enabled, - # calculate it - if dcsystems: - newvalues['/Dc/System/MeasurementType'] = 1 # measured - newvalues['/Dc/System/Power'] = 0 - for meter in dcsystems: - newvalues['/Dc/System/Power'] = _safeadd(newvalues['/Dc/System/Power'], - self._dbusmonitor.get_value(meter, '/Dc/0/Power')) - elif self._settings['hasdcsystem'] == 1 and batteryservicetype == 'battery': - # Calculate power being generated/consumed by not measured devices in the network. - # For MPPTs, take all the power, including power going out of the load output. - # /Dc/System: positive: consuming power - # VE.Bus: Positive: current flowing from the Multi to the dc system or battery - # Solarcharger & other chargers: positive: charging - # battery: Positive: charging battery. - # battery = solarcharger + charger + ve.bus - system - - battery_power = newvalues.get('/Dc/Battery/Power') - if battery_power is not None: - dc_pv_power = newvalues.get('/Dc/Pv/Power', 0) - charger_power = newvalues.get('/Dc/Charger/Power', 0) - fuelcell_power = newvalues.get('/Dc/FuelCell/Power', 0) - alternator_power = newvalues.get('/Dc/Alternator/Power', 0) - - # If there are VE.Direct inverters, remove their power from the - # DC estimate. This is done using the AC value when the DC - # power values are not available. - inverter_power = 0 - for i in non_vebus_inverters: - inverter_current = self._dbusmonitor.get_value(i, '/Dc/0/Current') - if inverter_current is not None: - inverter_power += self._dbusmonitor.get_value( - i, '/Dc/0/Voltage', 0) * inverter_current - else: - inverter_power -= self._dbusmonitor.get_value( - i, '/Ac/Out/L1/V', 0) * self._dbusmonitor.get_value( - i, '/Ac/Out/L1/I', 0) - newvalues['/Dc/System/MeasurementType'] = 0 # estimated - # FIXME In future we will subtract alternator power from the - # calculated DC power, because it will be individually - # displayed. For now, we leave it out so that in the current - # version of Venus it does not break user's expectations. - #newvalues['/Dc/System/Power'] = dc_pv_power + charger_power + fuelcell_power + vebuspower + inverter_power - battery_power - alternator_power - newvalues['/Dc/System/Power'] = dc_pv_power + charger_power + fuelcell_power + vebuspower + inverter_power - battery_power - - elif self._settings['hasdcsystem'] == 1 and solarchargers_loadoutput_power is not None: - newvalues['/Dc/System/MeasurementType'] = 0 # estimated - newvalues['/Dc/System/Power'] = solarchargers_loadoutput_power - - # ==== Vebus ==== - multi_path = getattr(delegates.Multi.instance.multi, 'service', None) - if multi_path is not None: - dc_current = self._dbusmonitor.get_value(multi_path, '/Dc/0/Current') - newvalues['/Dc/Vebus/Current'] = dc_current - dc_power = self._dbusmonitor.get_value(multi_path, '/Dc/0/Power') - # Just in case /Dc/0/Power is not available - if dc_power == None and dc_current is not None: - dc_voltage = self._dbusmonitor.get_value(multi_path, '/Dc/0/Voltage') - if dc_voltage is not None: - dc_power = dc_voltage * dc_current - # Note that there is also vebuspower, which is the total DC power summed over all multis. - # However, this value cannot be combined with /Dc/Multi/Current, because it does not make sense - # to add the Dc currents of all multis if they do not share the same DC voltage. - newvalues['/Dc/Vebus/Power'] = dc_power - - # ===== AC IN SOURCE ===== - ac_in_source = None - active_input = None - if multi_path is None: - # Check if we have an non-VE.Bus inverter. - if non_vebus_inverter is not None: - if (active_input := self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/ActiveIn/ActiveInput')) is not None and \ - active_input in (0, 1) and \ - (active_type := self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/{}/Type'.format(active_input + 1))) is not None: - ac_in_source = active_type - else: - ac_in_source = 240 - else: - active_input = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/ActiveInput') - if active_input == 0xF0: - # Not connected - ac_in_source = 240 - elif active_input is not None: - settings_path = '/Settings/SystemSetup/AcInput%s' % (active_input + 1) - ac_in_source = self._dbusmonitor.get_value('com.victronenergy.settings', settings_path) - newvalues['/Ac/ActiveIn/Source'] = ac_in_source - - # ===== GRID METERS & CONSUMPTION ==== - grid_meter = delegates.AcInputs.instance.gridmeter - genset_meter = delegates.AcInputs.instance.gensetmeter - - # Make an educated guess as to what is being consumed from an AC source. If ac_in_source - # indicates grid, genset or shore, we use that. If the Multi is off, or disconnected through - # a relay assistant or otherwise, then assume the presence of a .grid or .genset service indicates - # presence of that AC source. If both are available, then give up. This decision making is here - # so the GUI has something to present even if the Multi is off. - ac_in_guess = ac_in_source - if ac_in_guess in (None, 0xF0): - if genset_meter is None and grid_meter is not None: - ac_in_guess = 1 - elif grid_meter is None and genset_meter is not None: - ac_in_guess = 2 - - consumption = { "L1" : None, "L2" : None, "L3" : None } - currentconsumption = { "L1" : None, "L2" : None, "L3" : None } - for device_type, em, _types in (('Grid', grid_meter, (1, 3)), ('Genset', genset_meter, (2,))): - # If a grid meter is present we use values from it. If not, we look at the multi. If it has - # AcIn1 or AcIn2 connected to the grid, we use those values. - # com.victronenergy.grid.??? indicates presence of an energy meter used as grid meter. - # com.victronenergy.vebus.???/Ac/ActiveIn/ActiveInput: decides which whether we look at AcIn1 - # or AcIn2 as possible grid connection. - uses_active_input = ac_in_source in _types - for phase in consumption: - p = None - mc = None - pvpower = newvalues.get('/Ac/PvOn%s/%s/Power' % (device_type, phase)) - pvcurrent = newvalues.get('/Ac/PvOn%s/%s/Current' % (device_type, phase)) - if em is not None: - p = self._dbusmonitor.get_value(em.service, '/Ac/%s/Power' % phase) - mc = self._dbusmonitor.get_value(em.service, '/Ac/%s/Current' % phase) - # Compute consumption between energy meter and multi (meter power - multi AC in) and - # add an optional PV inverter on input to the mix. - c = None - cc = None - if uses_active_input: - if multi_path is not None: - try: - c = _safeadd(c, -self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/P' % phase)) - cc = _safeadd(cc, -self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/I' % phase)) - except TypeError: - pass - elif non_vebus_inverter is not None and active_input in (0, 1): - try: - c = _safeadd(c, -self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/P' % (active_input+1, phase))) - cc = _safeadd(cc, -self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/I' % (active_input+1, phase))) - except TypeError: - pass - - # If there's any power coming from a PV inverter in the inactive AC in (which is unlikely), - # it will still be used, because there may also be a load in the same ACIn consuming - # power, or the power could be fed back to the net. - c = _safeadd(c, p, pvpower) - cc = _safeadd(cc, mc, pvcurrent) - consumption[phase] = _safeadd(consumption[phase], _safemax(0, c)) - currentconsumption[phase] = _safeadd(currentconsumption[phase], _safemax(0, cc)) - else: - if uses_active_input: - if multi_path is not None and ( - p := self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/P' % phase)) is not None: - consumption[phase] = _safeadd(0, consumption[phase]) - currentconsumption[phase] = _safeadd(0, currentconsumption[phase]) - mc = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/I' % phase) - elif non_vebus_inverter is not None and active_input in (0, 1): - p = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/P' % (active_input + 1, phase)) - mc = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/I' % (active_input + 1, phase)) - if p is not None: - consumption[phase] = _safeadd(0, consumption[phase]) - currentconsumption[phase] = _safeadd(0, currentconsumption[phase]) - - # No relevant energy meter present. Assume there is no load between the grid and the multi. - # There may be a PV inverter present though (Hub-3 setup). - try: - p = _safeadd(p, -pvpower) - mc = _safeadd(mc, -pvcurrent) - except TypeError: - pass - - newvalues['/Ac/%s/%s/Power' % (device_type, phase)] = p - newvalues['/Ac/%s/%s/Current' % (device_type, phase)] = mc - if ac_in_guess in _types: - newvalues['/Ac/ActiveIn/%s/Power' % (phase,)] = p - newvalues['/Ac/ActiveIn/%s/Current' % (phase,)] = mc - - self._compute_number_of_phases('/Ac/%s' % device_type, newvalues) - self._compute_number_of_phases('/Ac/ActiveIn', newvalues) - - product_id = None - device_type_id = None - if em is not None: - product_id = em.product_id - device_type_id = em.device_type - if product_id is None and uses_active_input: - if multi_path is not None: - product_id = self._dbusmonitor.get_value(multi_path, '/ProductId') - elif non_vebus_inverter is not None: - product_id = self._dbusmonitor.get_value(non_vebus_inverter, '/ProductId') - newvalues['/Ac/%s/ProductId' % device_type] = product_id - newvalues['/Ac/%s/DeviceType' % device_type] = device_type_id - - # If we have an ESS system and RunWithoutGridMeter is set, there cannot be load on the AC-In, so it - # must be on AC-Out. Hence we do calculate AC-Out consumption even if 'useacout' is disabled. - # Similarly all load are by definition on the output if this is not an ESS system. - use_ac_out = \ - self._settings['useacout'] == 1 or \ - (multi_path is not None and self._dbusmonitor.get_value(multi_path, '/Hub4/AssistantId') not in (4, 5)) or \ - self._dbusmonitor.get_value('com.victronenergy.settings', '/Settings/CGwacs/RunWithoutGridMeter') == 1 - for phase in consumption: - c = None - a = None - if use_ac_out: - c = newvalues.get('/Ac/PvOnOutput/%s/Power' % phase) - a = newvalues.get('/Ac/PvOnOutput/%s/Current' % phase) - if multi_path is None: - for inv in non_vebus_inverters: - ac_out = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/P' % phase) - i = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/I' % phase) - - # Some models don't show power, try apparent power, - # else calculate it - if ac_out is None: - ac_out = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/S' % phase) - if ac_out is None: - u = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/V' % phase) - if None not in (i, u): - ac_out = i * u - c = _safeadd(c, ac_out) - a = _safeadd(a, i) - else: - ac_out = self._dbusmonitor.get_value(multi_path, '/Ac/Out/%s/P' % phase) - c = _safeadd(c, ac_out) - i_out = self._dbusmonitor.get_value(multi_path, '/Ac/Out/%s/I' % phase) - a = _safeadd(a, i_out) - c = _safemax(0, c) - a = _safemax(0, a) - newvalues['/Ac/ConsumptionOnOutput/%s/Power' % phase] = c - newvalues['/Ac/ConsumptionOnOutput/%s/Current' % phase] = a - newvalues['/Ac/ConsumptionOnInput/%s/Power' % phase] = consumption[phase] - newvalues['/Ac/ConsumptionOnInput/%s/Current' % phase] = currentconsumption[phase] - newvalues['/Ac/Consumption/%s/Power' % phase] = _safeadd(consumption[phase], c) - newvalues['/Ac/Consumption/%s/Current' % phase] = _safeadd(currentconsumption[phase], a) - self._compute_number_of_phases('/Ac/Consumption', newvalues) - self._compute_number_of_phases('/Ac/ConsumptionOnOutput', newvalues) - self._compute_number_of_phases('/Ac/ConsumptionOnInput', newvalues) - - for m in self._modules: - m.update_values(newvalues) - - # ==== UPDATE DBUS ITEMS ==== - with self._dbusservice as sss: - for path in self._summeditems.keys(): - # Why the None? Because we want to invalidate things we don't have anymore. - sss[path] = newvalues.get(path, None) - - def _handleservicechange(self): - # Update the available battery monitor services, used to populate the dropdown in the settings. - # Below code makes a dictionary. The key is [dbuserviceclass]/[deviceinstance]. For example - # "battery/245". The value is the name to show to the user in the dropdown. The full dbus- - # servicename, ie 'com.victronenergy.vebus.ttyO1' is not used, since the last part of that is not - # fixed. dbus-serviceclass name and the device instance are already fixed, so best to use those. - - services = self._get_connected_service_list('com.victronenergy.vebus') - services.update(self._get_connected_service_list('com.victronenergy.battery')) - services.update({k: v for k, v in self._get_connected_service_list( - 'com.victronenergy.multi').items() if self._dbusmonitor.get_value(k, '/Soc') is not None}) - services.update({k: v for k, v in self._get_connected_service_list( - 'com.victronenergy.inverter').items() if self._dbusmonitor.get_value(k, '/Soc') is not None}) - - ul = {self.BATSERVICE_DEFAULT: 'Automatic', self.BATSERVICE_NOBATTERY: 'No battery monitor'} - for servicename, instance in services.items(): - key = self._get_instance_service_name(servicename, instance) - ul[key] = self._get_readable_service_name(servicename) - self._dbusservice['/AvailableBatteryServices'] = json.dumps(ul) - - ul = {self.BATSERVICE_DEFAULT: 'Automatic', self.BATSERVICE_NOBATTERY: 'No battery monitor'} - # For later: for device supporting multiple Dc measurement we should add entries for /Dc/1 etc as - # well. - for servicename, instance in services.items(): - key = self._get_instance_service_name(servicename, instance).replace('.', '_').replace('/', '_') + '/Dc/0' - ul[key] = self._get_readable_service_name(servicename) - self._dbusservice['/AvailableBatteryMeasurements'] = ul - - self._determinebatteryservice() - - self._changed = True - - def _get_readable_service_name(self, servicename): - return '%s on %s' % ( - self._dbusmonitor.get_value(servicename, '/ProductName'), - self._dbusmonitor.get_value(servicename, '/Mgmt/Connection')) - - def _get_instance_service_name(self, service, instance): - return '%s/%s' % ('.'.join(service.split('.')[0:3]), instance) - - def _remove_unconnected_services(self, services): - # Workaround: because com.victronenergy.vebus is available even when there is no vebus product - # connected, remove any service that is not connected. Previously we used - # /State since mandatory path /Connected is not implemented in mk2dbus, - # but this has since been resolved. - for servicename in list(services.keys()): - if (self._dbusmonitor.get_value(servicename, '/Connected') != 1 - or self._dbusmonitor.get_value(servicename, '/ProductName') is None - or self._dbusmonitor.get_value(servicename, '/Mgmt/Connection') is None): - del services[servicename] - - def _dbus_value_changed(self, dbusServiceName, dbusPath, dict, changes, deviceInstance): - self._changed = True - - # Workaround because com.victronenergy.vebus is available even when there is no vebus product - # connected. - if (dbusPath in ['/Connected', '/ProductName', '/Mgmt/Connection'] or - (dbusPath == '/State' and dbusServiceName.split('.')[0:3] == ['com', 'victronenergy', 'vebus'])): - self._handleservicechange() - - # Track the timezone changes - if dbusPath == '/Settings/System/TimeZone': - tz = changes.get('Value') - if tz is not None: - os.environ['TZ'] = tz - time.tzset() - - def _device_added(self, service, instance, do_service_change=True): - if do_service_change: - self._handleservicechange() - - for m in self._modules: - m.device_added(service, instance, do_service_change) - - def _device_removed(self, service, instance): - self._handleservicechange() - - for m in self._modules: - m.device_removed(service, instance) - - def _gettext(self, path, value): - if path == '/Dc/Battery/State': - state = {self.STATE_IDLE: 'Idle', self.STATE_CHARGING: 'Charging', - self.STATE_DISCHARGING: 'Discharging'} - return state[value] - item = self._summeditems.get(path) - if item is not None: - return item['gettext'] % value - return str(value) - - def _compute_number_of_phases(self, path, newvalues): - number_of_phases = None - for phase in range(1, 4): - p = newvalues.get('%s/L%s/Power' % (path, phase)) - if p is not None: - number_of_phases = phase - newvalues[path + '/NumberOfPhases'] = number_of_phases - - def _get_connected_service_list(self, classfilter=None): - services = self._dbusmonitor.get_service_list(classfilter=classfilter) - self._remove_unconnected_services(services) - return services - - # returns a servicename string - def _get_first_connected_service(self, classfilter): - services = self._get_connected_service_list(classfilter=classfilter) - if len(services) == 0: - return None - return next(iter(services.items()), (None,))[0] - - # returns a tuple (servicename, instance) - def _get_service_having_lowest_instance(self, classfilter=None): - services = self._get_connected_service_list(classfilter=classfilter) - if len(services) == 0: - return None - - # sort the dict by value; returns list of tuples: (value, key) - s = sorted((value, key) for (key, value) in services.items()) - return (s[0][1], s[0][0]) - - -class DbusSystemCalc(SystemCalc): - def _create_dbus_monitor(self, *args, **kwargs): - return DbusMonitor(*args, **kwargs) - - def _create_settings(self, *args, **kwargs): - bus = dbus.SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else dbus.SystemBus() - return SettingsDevice(bus, *args, timeout=10, **kwargs) - - def _create_dbus_service(self): - venusversion, venusbuildtime = self._get_venus_versioninfo() - - dbusservice = VeDbusService('com.victronenergy.system') - dbusservice.add_mandatory_paths( - processname=__file__, - processversion=softwareVersion, - connection='data from other dbus processes', - deviceinstance=0, - productid=None, - productname=None, - firmwareversion=venusversion, - hardwareversion=None, - connected=1) - dbusservice.add_path('/FirmwareBuild', value=venusbuildtime) - return dbusservice - - def _get_venus_versioninfo(self): - try: - with open("/opt/victronenergy/version", "r") as fp: - version, software, buildtime = fp.read().split('\n')[:3] - major, minor, _, rev = re.compile('v([0-9]*)\.([0-9]*)(~([0-9]*))?').match(version).groups() - return (int(major, 16)<<16)+(int(minor, 16)<<8)+(0 if rev is None else int(rev, 16)), buildtime - except Exception: - pass - return 0, '0' - -if __name__ == "__main__": - # Argument parsing - parser = argparse.ArgumentParser( - description='Converts readings from AC-Sensors connected to a VE.Bus device in a pvinverter ' + - 'D-Bus service.' - ) - - parser.add_argument("-d", "--debug", help="set logging level to debug", - action="store_true") - - args = parser.parse_args() - - print("-------- dbus_systemcalc, v" + softwareVersion + " is starting up --------") - logger = setup_logging(args.debug) - - # Have a mainloop, so we can send/receive asynchronous calls to and from dbus - DBusGMainLoop(set_as_default=True) - - systemcalc = DbusSystemCalc() - - # Start and run the mainloop - logger.info("Starting mainloop, responding only on events") - mainloop = GLib.MainLoop() - mainloop.run() diff --git a/FileSets/v3.20~18/main.qml b/FileSets/v3.20~18/main.qml deleted file mode 120000 index aafeae08..00000000 --- a/FileSets/v3.20~18/main.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/startstop.py b/FileSets/v3.20~18/startstop.py deleted file mode 120000 index b962b8d5..00000000 --- a/FileSets/v3.20~18/startstop.py +++ /dev/null @@ -1 +0,0 @@ -../v3.20~37/startstop.py \ No newline at end of file diff --git a/FileSets/v3.20~18/styles.css b/FileSets/v3.20~18/styles.css deleted file mode 120000 index 4af38df2..00000000 --- a/FileSets/v3.20~18/styles.css +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~2/Battery.qml b/FileSets/v3.20~2/Battery.qml deleted file mode 120000 index 794e9dd0..00000000 --- a/FileSets/v3.20~2/Battery.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/DetailAcInput.qml b/FileSets/v3.20~2/DetailAcInput.qml deleted file mode 120000 index 8b226ba8..00000000 --- a/FileSets/v3.20~2/DetailAcInput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/DetailInverter.qml b/FileSets/v3.20~2/DetailInverter.qml deleted file mode 120000 index 5ddd5ce8..00000000 --- a/FileSets/v3.20~2/DetailInverter.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/DetailLoadsCombined.qml b/FileSets/v3.20~2/DetailLoadsCombined.qml deleted file mode 120000 index b000afaa..00000000 --- a/FileSets/v3.20~2/DetailLoadsCombined.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/DetailLoadsOnInput.qml b/FileSets/v3.20~2/DetailLoadsOnInput.qml deleted file mode 120000 index 901e0820..00000000 --- a/FileSets/v3.20~2/DetailLoadsOnInput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/DetailLoadsOnOutput.qml b/FileSets/v3.20~2/DetailLoadsOnOutput.qml deleted file mode 120000 index 142fee12..00000000 --- a/FileSets/v3.20~2/DetailLoadsOnOutput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/HubData.qml b/FileSets/v3.20~2/HubData.qml deleted file mode 120000 index df42560b..00000000 --- a/FileSets/v3.20~2/HubData.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/MbEditBox.qml b/FileSets/v3.20~2/MbEditBox.qml deleted file mode 120000 index a6185dba..00000000 --- a/FileSets/v3.20~2/MbEditBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/MbEditBoxDateTime.qml b/FileSets/v3.20~2/MbEditBoxDateTime.qml deleted file mode 120000 index 158d88d0..00000000 --- a/FileSets/v3.20~2/MbEditBoxDateTime.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/MbItem.qml b/FileSets/v3.20~2/MbItem.qml deleted file mode 120000 index 8dfa4b06..00000000 --- a/FileSets/v3.20~2/MbItem.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/MbSpinBox.qml b/FileSets/v3.20~2/MbSpinBox.qml deleted file mode 120000 index b0dffaae..00000000 --- a/FileSets/v3.20~2/MbSpinBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/MbStyle.qml b/FileSets/v3.20~2/MbStyle.qml deleted file mode 120000 index 4accbc46..00000000 --- a/FileSets/v3.20~2/MbStyle.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/MbSubMenu.qml b/FileSets/v3.20~2/MbSubMenu.qml deleted file mode 120000 index d1172169..00000000 --- a/FileSets/v3.20~2/MbSubMenu.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/Multi.qml b/FileSets/v3.20~2/Multi.qml deleted file mode 120000 index 9a2fa57b..00000000 --- a/FileSets/v3.20~2/Multi.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/ObjectAcConnection.qml b/FileSets/v3.20~2/ObjectAcConnection.qml deleted file mode 120000 index 406d6613..00000000 --- a/FileSets/v3.20~2/ObjectAcConnection.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~2/OverviewAcValuesEnhanced.qml deleted file mode 120000 index 09322f1d..00000000 --- a/FileSets/v3.20~2/OverviewAcValuesEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewBox.qml b/FileSets/v3.20~2/OverviewBox.qml deleted file mode 120000 index 8c3baac0..00000000 --- a/FileSets/v3.20~2/OverviewBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewConnection.qml b/FileSets/v3.20~2/OverviewConnection.qml deleted file mode 120000 index 52cb8f85..00000000 --- a/FileSets/v3.20~2/OverviewConnection.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewConnectionEnd.qml b/FileSets/v3.20~2/OverviewConnectionEnd.qml deleted file mode 120000 index 04bf981f..00000000 --- a/FileSets/v3.20~2/OverviewConnectionEnd.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewFlowComplex.qml b/FileSets/v3.20~2/OverviewFlowComplex.qml deleted file mode 120000 index 6089ae4c..00000000 --- a/FileSets/v3.20~2/OverviewFlowComplex.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~2/OverviewGeneratorEnhanced.qml deleted file mode 120000 index 6770e814..00000000 --- a/FileSets/v3.20~2/OverviewGeneratorEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.10/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~2/OverviewGeneratorRelayEnhanced.qml deleted file mode 120000 index 54b24f30..00000000 --- a/FileSets/v3.20~2/OverviewGeneratorRelayEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewGridParallel.qml b/FileSets/v3.20~2/OverviewGridParallel.qml deleted file mode 120000 index c31a5a0f..00000000 --- a/FileSets/v3.20~2/OverviewGridParallel.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewHub.qml b/FileSets/v3.20~2/OverviewHub.qml deleted file mode 120000 index 9f251775..00000000 --- a/FileSets/v3.20~2/OverviewHub.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewHubEnhanced.qml b/FileSets/v3.20~2/OverviewHubEnhanced.qml deleted file mode 120000 index 0c37301c..00000000 --- a/FileSets/v3.20~2/OverviewHubEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewMobileEnhanced.qml b/FileSets/v3.20~2/OverviewMobileEnhanced.qml deleted file mode 120000 index 79cb1fcb..00000000 --- a/FileSets/v3.20~2/OverviewMobileEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewSolarCharger.qml b/FileSets/v3.20~2/OverviewSolarCharger.qml deleted file mode 120000 index 73220270..00000000 --- a/FileSets/v3.20~2/OverviewSolarCharger.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewSolarInverter.qml b/FileSets/v3.20~2/OverviewSolarInverter.qml deleted file mode 120000 index dd6f7b40..00000000 --- a/FileSets/v3.20~2/OverviewSolarInverter.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewTankDelegate.qml b/FileSets/v3.20~2/OverviewTankDelegate.qml deleted file mode 120000 index 9ac457b6..00000000 --- a/FileSets/v3.20~2/OverviewTankDelegate.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewTanks.qml b/FileSets/v3.20~2/OverviewTanks.qml deleted file mode 120000 index 975b464a..00000000 --- a/FileSets/v3.20~2/OverviewTanks.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~2/OverviewTanksTempsDigInputs.qml deleted file mode 120000 index 6cd0cfc3..00000000 --- a/FileSets/v3.20~2/OverviewTanksTempsDigInputs.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/PageGenerator.qml b/FileSets/v3.20~2/PageGenerator.qml deleted file mode 120000 index e80a0e00..00000000 --- a/FileSets/v3.20~2/PageGenerator.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.10/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/PageMain.qml b/FileSets/v3.20~2/PageMain.qml deleted file mode 120000 index 444dec5f..00000000 --- a/FileSets/v3.20~2/PageMain.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~33/PageMain.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/PageSettingsDisplay.qml b/FileSets/v3.20~2/PageSettingsDisplay.qml deleted file mode 120000 index 9860c031..00000000 --- a/FileSets/v3.20~2/PageSettingsDisplay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.14/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/PageSettingsGenerator.qml b/FileSets/v3.20~2/PageSettingsGenerator.qml deleted file mode 120000 index 0780dcd2..00000000 --- a/FileSets/v3.20~2/PageSettingsGenerator.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.10/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/PageSettingsGuiMods.qml b/FileSets/v3.20~2/PageSettingsGuiMods.qml deleted file mode 120000 index c4dc4998..00000000 --- a/FileSets/v3.20~2/PageSettingsGuiMods.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~37/PageSettingsGuiMods.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/PageSettingsRelay.qml b/FileSets/v3.20~2/PageSettingsRelay.qml deleted file mode 120000 index e083e872..00000000 --- a/FileSets/v3.20~2/PageSettingsRelay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/PowerGauge.qml b/FileSets/v3.20~2/PowerGauge.qml deleted file mode 120000 index 2ed81452..00000000 --- a/FileSets/v3.20~2/PowerGauge.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/Tile.qml b/FileSets/v3.20~2/Tile.qml deleted file mode 120000 index db98506f..00000000 --- a/FileSets/v3.20~2/Tile.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/TileDigIn.qml b/FileSets/v3.20~2/TileDigIn.qml deleted file mode 120000 index c6408a84..00000000 --- a/FileSets/v3.20~2/TileDigIn.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/TileRelay.qml b/FileSets/v3.20~2/TileRelay.qml deleted file mode 120000 index 200caf92..00000000 --- a/FileSets/v3.20~2/TileRelay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/TileText.qml b/FileSets/v3.20~2/TileText.qml deleted file mode 120000 index 8f17d6b3..00000000 --- a/FileSets/v3.20~2/TileText.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/UNUSED_FILE_SET b/FileSets/v3.20~2/UNUSED_FILE_SET deleted file mode 100644 index e69de29b..00000000 diff --git a/FileSets/v3.20~2/dbus_generator.py b/FileSets/v3.20~2/dbus_generator.py deleted file mode 120000 index f0d38f59..00000000 --- a/FileSets/v3.20~2/dbus_generator.py +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~2/dbus_systemcalc.py b/FileSets/v3.20~2/dbus_systemcalc.py deleted file mode 100755 index a412e256..00000000 --- a/FileSets/v3.20~2/dbus_systemcalc.py +++ /dev/null @@ -1,1344 +0,0 @@ -#!/usr/bin/python3 -u -# -*- coding: utf-8 -*- - -#### modified for GuiMods - -from dbus.mainloop.glib import DBusGMainLoop -import dbus -import argparse -import sys -import os -import json -import time -import re -from gi.repository import GLib - -# Victron packages -sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) -from vedbus import VeDbusService -from ve_utils import get_vrm_portal_id, exit_on_error -from dbusmonitor import DbusMonitor -from settingsdevice import SettingsDevice -from logger import setup_logging -import delegates -from sc_utils import safeadd as _safeadd, safemax as _safemax - -softwareVersion = '2.132' - -class SystemCalc: - STATE_IDLE = 0 - STATE_CHARGING = 1 - STATE_DISCHARGING = 2 - BATSERVICE_DEFAULT = 'default' - BATSERVICE_NOBATTERY = 'nobattery' - def __init__(self): - # Why this dummy? Because DbusMonitor expects these values to be there, even though we don't - # need them. So just add some dummy data. This can go away when DbusMonitor is more generic. - dummy = {'code': None, 'whenToLog': 'configChange', 'accessLevel': None} - dbus_tree = { - 'com.victronenergy.solarcharger': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Load/I': dummy, - '/FirmwareVersion': dummy}, - 'com.victronenergy.battery': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/DeviceInstance': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/1/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Soc': dummy, - '/Sense/Current': dummy, - '/TimeToGo': dummy, - '/ConsumedAmphours': dummy, - '/ProductId': dummy, - '/CustomName': dummy, - '/Info/MaxChargeVoltage': dummy}, - 'com.victronenergy.vebus' : { - '/Ac/ActiveIn/ActiveInput': dummy, - '/Ac/ActiveIn/L1/P': dummy, - '/Ac/ActiveIn/L2/P': dummy, - '/Ac/ActiveIn/L3/P': dummy, - '/Ac/ActiveIn/L1/I': dummy, - '/Ac/ActiveIn/L2/I': dummy, - '/Ac/ActiveIn/L3/I': dummy, - '/Ac/Out/L1/P': dummy, - '/Ac/Out/L2/P': dummy, - '/Ac/Out/L3/P': dummy, - '/Ac/Out/L1/I': dummy, - '/Ac/Out/L2/I': dummy, - '/Ac/Out/L3/I': dummy, -#### add for GuiMods - '/Ac/Out/L1/V': dummy, - '/Ac/Out/L2/V': dummy, - '/Ac/Out/L3/V': dummy, - '/Ac/Out/L1/F': dummy, - '/Ac/Out/L2/F': dummy, - '/Ac/Out/L3/F': dummy, - '/Ac/ActiveIn/L1/V': dummy, - '/Ac/ActiveIn/L2/V': dummy, - '/Ac/ActiveIn/L3/V': dummy, - '/Ac/ActiveIn/L1/F': dummy, - '/Ac/ActiveIn/L2/F': dummy, - '/Ac/ActiveIn/L3/F': dummy, - - '/Connected': dummy, - '/ProductId': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Mode': dummy, - '/State': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Soc': dummy}, - 'com.victronenergy.fuelcell': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy}, - 'com.victronenergy.charger': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/1/Voltage': dummy, - '/Dc/1/Current': dummy, - '/Dc/2/Voltage': dummy, - '/Dc/2/Current': dummy}, - 'com.victronenergy.grid' : { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/ProductId' : dummy, - '/DeviceType' : dummy, - '/Ac/L1/Power': dummy, - '/Ac/L2/Power': dummy, - '/Ac/L3/Power': dummy, - '/Ac/L1/Current': dummy, - '/Ac/L2/Current': dummy, - '/Ac/L3/Current': dummy, -#### add for GuiMods - '/Ac/L1/Voltage': dummy, - '/Ac/L2/Voltage': dummy, - '/Ac/L3/Voltage': dummy, - '/Ac/L1/Frequency': dummy, - '/Ac/L2/Frequency': dummy, - '/Ac/L3/Frequency': dummy}, - 'com.victronenergy.genset' : { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/ProductId' : dummy, - '/DeviceType' : dummy, - '/Ac/L1/Power': dummy, - '/Ac/L2/Power': dummy, - '/Ac/L3/Power': dummy, - '/Ac/L1/Current': dummy, - '/Ac/L2/Current': dummy, - '/Ac/L3/Current': dummy, -#### add for GuiMods - '/Ac/L1/Voltage': dummy, - '/Ac/L2/Voltage': dummy, - '/Ac/L3/Voltage': dummy, - '/Ac/L1/Frequency': dummy, - '/Ac/L2/Frequency': dummy, - '/Ac/L3/Frequency': dummy, - - '/StarterVoltage': dummy}, - 'com.victronenergy.settings' : { - '/Settings/SystemSetup/AcInput1' : dummy, - '/Settings/SystemSetup/AcInput2' : dummy, - '/Settings/CGwacs/RunWithoutGridMeter' : dummy, - '/Settings/System/TimeZone' : dummy}, - 'com.victronenergy.temperature': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy}, - 'com.victronenergy.inverter': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Ac/Out/L1/P': dummy, - '/Ac/Out/L1/S': dummy, - '/Ac/Out/L1/V': dummy, - '/Ac/Out/L1/I': dummy, -#### add for GuiMods - '/Ac/Out/L1/F': dummy, - - '/Yield/Power': dummy, - '/Soc': dummy}, - 'com.victronenergy.multi': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Ac/ActiveIn/ActiveInput': dummy, - '/Ac/In/1/Type': dummy, - '/Ac/In/2/Type': dummy, - '/Ac/In/1/L1/P': dummy, - '/Ac/In/1/L1/I': dummy, - '/Ac/In/2/L1/P': dummy, - '/Ac/In/2/L1/I': dummy, - '/Ac/Out/L1/P': dummy, - '/Ac/Out/L1/V': dummy, - '/Ac/Out/L1/I': dummy, -#### add for GuiMods - '/Ac/L1/F': dummy, - - '/Yield/Power': dummy, - '/Soc': dummy}, - 'com.victronenergy.dcsystem': { - '/Dc/0/Voltage': dummy, - '/Dc/0/Power': dummy - }, - 'com.victronenergy.alternator': { - '/Dc/0/Power': dummy - }, -#### added for GuiMods - 'com.victronenergy.dcsource': { - '/Dc/0/Power': dummy, - '/Settings/MonitorMode': dummy - }, - 'com.victronenergy.motordrive': - { - '/Dc/0/Power': dummy - } - } - - self._modules = [ - delegates.Multi(), - delegates.HubTypeSelect(), - delegates.VebusSocWriter(), - delegates.ServiceMapper(), - delegates.RelayState(), - delegates.BuzzerControl(), - delegates.LgCircuitBreakerDetect(), - delegates.BatterySoc(self), - delegates.Dvcc(self), - delegates.BatterySense(self), - delegates.BatterySettings(self), - delegates.SystemState(self), - delegates.BatteryLife(), - delegates.ScheduledCharging(), - delegates.SourceTimers(), - delegates.BatteryData(), - delegates.Gps(), - delegates.AcInputs(), - delegates.GensetStartStop(), - delegates.SocSync(self), - delegates.PvInverters(), - delegates.BatteryService(self), - delegates.CanBatterySense(), - delegates.DynamicEss()] - - for m in self._modules: - for service, paths in m.get_input(): - s = dbus_tree.setdefault(service, {}) - for path in paths: - s[path] = dummy - - self._dbusmonitor = self._create_dbus_monitor(dbus_tree, valueChangedCallback=self._dbus_value_changed, - deviceAddedCallback=self._device_added, deviceRemovedCallback=self._device_removed) - - # Connect to localsettings - supported_settings = { - 'batteryservice': ['/Settings/SystemSetup/BatteryService', self.BATSERVICE_DEFAULT, 0, 0], - 'hasdcsystem': ['/Settings/SystemSetup/HasDcSystem', 0, 0, 1], - 'useacout': ['/Settings/SystemSetup/HasAcOutSystem', 1, 0, 1]} - - for m in self._modules: - for setting in m.get_settings(): - supported_settings[setting[0]] = list(setting[1:]) - - self._settings = self._create_settings(supported_settings, self._handlechangedsetting) - - self._dbusservice = self._create_dbus_service() - - for m in self._modules: - m.set_sources(self._dbusmonitor, self._settings, self._dbusservice) - - # At this moment, VRM portal ID is the MAC address of the CCGX. Anyhow, it should be string uniquely - # identifying the CCGX. - self._dbusservice.add_path('/Serial', value=get_vrm_portal_id()) - self._dbusservice.add_path( - '/AvailableBatteryServices', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/AvailableBatteryMeasurements', value=None) - self._dbusservice.add_path( - '/AutoSelectedBatteryService', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/AutoSelectedBatteryMeasurement', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/ActiveBatteryService', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/Dc/Battery/BatteryService', value=None) - self._summeditems = { - '/Ac/Grid/L1/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L2/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L3/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L1/Current': {'gettext': '%.1F A'}, - '/Ac/Grid/L2/Current': {'gettext': '%.1F A'}, - '/Ac/Grid/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Grid/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/Grid/ProductId': {'gettext': '%s'}, - '/Ac/Grid/DeviceType': {'gettext': '%s'}, - '/Ac/Genset/L1/Power': {'gettext': '%.0F W'}, - '/Ac/Genset/L2/Power': {'gettext': '%.0F W'}, - '/Ac/Genset/L3/Power': {'gettext': '%.0F W'}, - '/Ac/Genset/L1/Current': {'gettext': '%.1F A'}, - '/Ac/Genset/L2/Current': {'gettext': '%.1F A'}, - '/Ac/Genset/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Genset/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/Genset/ProductId': {'gettext': '%s'}, - '/Ac/Genset/DeviceType': {'gettext': '%s'}, - '/Ac/ConsumptionOnOutput/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L1/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L2/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L3/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L1/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnOutput/L2/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnOutput/L3/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnInput/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L1/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L2/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L3/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L1/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnInput/L2/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnInput/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/Consumption/L1/Power': {'gettext': '%.0F W'}, - '/Ac/Consumption/L2/Power': {'gettext': '%.0F W'}, - '/Ac/Consumption/L3/Power': {'gettext': '%.0F W'}, - '/Ac/Consumption/L1/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/L2/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/L3/Current': {'gettext': '%.1F A'}, - '/Dc/Pv/Power': {'gettext': '%.0F W'}, - '/Dc/Pv/Current': {'gettext': '%.1F A'}, - '/Dc/Battery/Voltage': {'gettext': '%.2F V'}, - '/Dc/Battery/VoltageService': {'gettext': '%s'}, - '/Dc/Battery/Current': {'gettext': '%.1F A'}, - '/Dc/Battery/Power': {'gettext': '%.0F W'}, - '/Dc/Battery/State': {'gettext': '%s'}, - '/Dc/Battery/TimeToGo': {'gettext': '%.0F s'}, - '/Dc/Battery/ConsumedAmphours': {'gettext': '%.1F Ah'}, - '/Dc/Battery/ProductId': {'gettext': '0x%x'}, - '/Dc/Charger/Power': {'gettext': '%.0F %%'}, - '/Dc/FuelCell/Power': {'gettext': '%.0F %%'}, - '/Dc/Alternator/Power': {'gettext': '%.0F W'}, - '/Dc/Vebus/Current': {'gettext': '%.1F A'}, - '/Dc/Vebus/Power': {'gettext': '%.0F W'}, - '/Dc/System/Power': {'gettext': '%.0F W'}, - '/Dc/System/MeasurementType': {'gettext': '%d'}, - '/Ac/ActiveIn/Source': {'gettext': '%s'}, - '/Ac/ActiveIn/L1/Power': {'gettext': '%.0F W'}, - '/Ac/ActiveIn/L2/Power': {'gettext': '%.0F W'}, - '/Ac/ActiveIn/L3/Power': {'gettext': '%.0F W'}, - '/Ac/ActiveIn/L1/Current': {'gettext': '%.1F A'}, - '/Ac/ActiveIn/L2/Current': {'gettext': '%.1F A'}, - '/Ac/ActiveIn/L3/Current': {'gettext': '%.1F A'}, - '/Ac/ActiveIn/NumberOfPhases': {'gettext': '%d'}, -#### added for GuiMods - '/Dc/WindGenerator/Power': {'gettext': '%.0F W'}, - '/Dc/MotorDrive/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L1/Voltage': {'gettext': '%.1F V'}, - '/Ac/Grid/L2/Voltage': {'gettext': '%.1F V'}, - '/Ac/Grid/L3/Voltage': {'gettext': '%.1F V'}, - '/Ac/Grid/Frequency': {'gettext': '%.1F Hz'}, - '/Ac/Genset/L1/Voltage': {'gettext': '%.1F V'}, - '/Ac/Genset/L2/Voltage': {'gettext': '%.1F V'}, - '/Ac/Genset/L3/Voltage': {'gettext': '%.1F V'}, - '/Ac/Genset/Frequency': {'gettext': '%.1F Hz'}, - '/Ac/ConsumptionOnOutput/L1/Voltage': {'gettext': '%.1F V'}, - '/Ac/ConsumptionOnOutput/L2/Voltage': {'gettext': '%.1F V'}, - '/Ac/ConsumptionOnOutput/L3/Voltage': {'gettext': '%.1F V'}, - '/Ac/ConsumptionOnOutput/Frequency': {'gettext': '%.1F Hz'}, - '/Ac/ConsumptionOnInput/L1/Voltage': {'gettext': '%.1F V'}, - '/Ac/ConsumptionOnInput/L2/Voltage': {'gettext': '%.1F V'}, - '/Ac/ConsumptionOnInput/L3/Voltage': {'gettext': '%.1F V'}, - '/Ac/ConsumptionOnInput/Frequency': {'gettext': '%.1F Hz'}, - '/Ac/Consumption/L1/Voltage': {'gettext': '%.1F V'}, - '/Ac/Consumption/L2/Voltage': {'gettext': '%.1F V'}, - '/Ac/Consumption/L3/Voltage': {'gettext': '%.1F V'}, - '/Ac/Consumption/Frequency': {'gettext': '%.1F Hz'}, - '/Ac/ActiveIn/L1/Voltage': {'gettext': '%.1F V'}, - '/Ac/ActiveIn/L2/Voltage': {'gettext': '%.1F V'}, - '/Ac/ActiveIn/L3/Voltage': {'gettext': '%.1F V'}, - '/Ac/ActiveIn/Frequency': {'gettext': '%.1F Hz'}, - } - - for m in self._modules: - self._summeditems.update(m.get_output()) - - for path in self._summeditems.keys(): - self._dbusservice.add_path(path, value=None, gettextcallback=self._gettext) - - self._batteryservice = None - self._determinebatteryservice() - - if self._batteryservice is None: - logger.info("Battery service initialized to None (setting == %s)" % - self._settings['batteryservice']) - - self._changed = True - for service, instance in self._dbusmonitor.get_service_list().items(): - self._device_added(service, instance, do_service_change=False) - -#### added for GuiMods - self.dcSystemPower = [0, 0, 0] - - self._handleservicechange() - self._updatevalues() - - GLib.timeout_add(1000, exit_on_error, self._handletimertick) - - def _create_dbus_monitor(self, *args, **kwargs): - raise Exception("This function should be overridden") - - def _create_settings(self, *args, **kwargs): - raise Exception("This function should be overridden") - - def _create_dbus_service(self): - raise Exception("This function should be overridden") - - def _handlechangedsetting(self, setting, oldvalue, newvalue): - self._determinebatteryservice() - self._changed = True - - # Give our delegates a chance to react on a settings change - for m in self._modules: - m.settings_changed(setting, oldvalue, newvalue) - - def _find_device_instance(self, serviceclass, instance): - """ Gets a mapping of services vs DeviceInstance using - get_service_list. Then searches for the specified DeviceInstance - and returns the service name. """ - services = self._dbusmonitor.get_service_list(classfilter=serviceclass) - - for k, v in services.items(): - if v == instance: - return k - return None - - def _determinebatteryservice(self): - auto_battery_service = self._autoselect_battery_service() - auto_battery_measurement = None - auto_selected = False - if auto_battery_service is not None: - services = self._dbusmonitor.get_service_list() - if auto_battery_service in services: - auto_battery_measurement = \ - self._get_instance_service_name(auto_battery_service, services[auto_battery_service]) - auto_battery_measurement = auto_battery_measurement.replace('.', '_').replace('/', '_') + '/Dc/0' - self._dbusservice['/AutoSelectedBatteryMeasurement'] = auto_battery_measurement - - if self._settings['batteryservice'] == self.BATSERVICE_DEFAULT: - auto_selected = True - newbatteryservice = auto_battery_service - self._dbusservice['/AutoSelectedBatteryService'] = ( - 'No battery monitor found' if newbatteryservice is None else - self._get_readable_service_name(newbatteryservice)) - - elif self._settings['batteryservice'] == self.BATSERVICE_NOBATTERY: - self._dbusservice['/AutoSelectedBatteryService'] = None - newbatteryservice = None - - else: - self._dbusservice['/AutoSelectedBatteryService'] = None - - s = self._settings['batteryservice'].split('/') - if len(s) != 2: - logger.error("The battery setting (%s) is invalid!" % self._settings['batteryservice']) - serviceclass = s[0] - instance = int(s[1]) if len(s) == 2 else None - - # newbatteryservice might turn into None if a chosen battery - # monitor no longer exists. Don't auto change the setting (it might - # come back) and don't autoselect another. - newbatteryservice = self._find_device_instance(serviceclass, instance) - - if newbatteryservice != self._batteryservice: - services = self._dbusmonitor.get_service_list() - instance = services.get(newbatteryservice, None) - if instance is None: - battery_service = None - else: - battery_service = self._get_instance_service_name(newbatteryservice, instance) - self._dbusservice['/ActiveBatteryService'] = battery_service - logger.info("Battery service, setting == %s, changed from %s to %s (%s)" % - (self._settings['batteryservice'], self._batteryservice, newbatteryservice, instance)) - - # Battery service has changed. Notify delegates. - self._dbusservice['/Dc/Battery/BatteryService'] = self._batteryservice = newbatteryservice - for m in self._modules: - m.battery_service_changed(auto_selected, self._batteryservice, newbatteryservice) - - def _autoselect_battery_service(self): - # Default setting business logic: - # first try to use a battery service (BMV or Lynx Shunt VE.Can). If there - # is more than one battery service, just use a random one. If no battery service is - # available, check if there are not Solar chargers and no normal chargers. If they are not - # there, assume this is a hub-2, hub-3 or hub-4 system and use VE.Bus SOC. - batteries = self._get_connected_service_list('com.victronenergy.battery') - - # Pick the battery service that has the lowest DeviceInstance, giving - # preference to those with a BMS. - if len(batteries) > 0: - batteries = [ - (not self._dbusmonitor.seen(s, '/Info/MaxChargeVoltage'), i, s) - for s, i in batteries.items()] - return sorted(batteries, key=lambda x: x[:2])[0][2] - - # No battery services, and there is a charger in the system. Abandon - # hope. - if self._get_first_connected_service('com.victronenergy.charger') is not None: - return None - - # Also no Multi, then give up. - vebus_service = self._get_service_having_lowest_instance('com.victronenergy.vebus') - if vebus_service is None: - # No VE.Bus, but maybe there is an inverter with built-in SOC - # tracking, eg RS Smart or Multi RS. - inverter = self._get_service_having_lowest_instance('com.victronenergy.multi') - if inverter and self._dbusmonitor.get_value(inverter[0], '/Soc') is not None: - return inverter[0] - - inverter = self._get_service_having_lowest_instance('com.victronenergy.inverter') - if inverter and self._dbusmonitor.get_value(inverter[0], '/Soc') is not None: - return inverter[0] - - return None - - # There is a Multi, it supports tracking external charge current from - # solarchargers, and there are no DC loads. Then use it. - if self._dbusmonitor.get_value( - vebus_service[0], '/ExtraBatteryCurrent') is not None \ - and self._get_first_connected_service('com.victronenergy.dcsystem') is None \ - and self._settings['hasdcsystem'] == 0: - return vebus_service[0] - - # Multi does not support tracking solarcharger current, and we have - # solar chargers. Then we cannot use it. - if self._get_first_connected_service('com.victronenergy.solarcharger') is not None: - return None - - # Only a Multi, no other chargers. Then we can use it. - return vebus_service[0] - - @property - def batteryservice(self): - return self._batteryservice - - # Called on a one second timer - def _handletimertick(self): - if self._changed: - self._updatevalues() - self._changed = False - - return True # keep timer running - - def _updatevalues(self): - # ==== PREPARATIONS ==== - newvalues = {} - - # Set the user timezone - if 'TZ' not in os.environ: - tz = self._dbusmonitor.get_value('com.victronenergy.settings', '/Settings/System/TimeZone') - if tz is not None: - os.environ['TZ'] = tz - time.tzset() - - # Determine values used in logic below - vebusses = self._dbusmonitor.get_service_list('com.victronenergy.vebus') - vebuspower = 0 - for vebus in vebusses: - v = self._dbusmonitor.get_value(vebus, '/Dc/0/Voltage') - i = self._dbusmonitor.get_value(vebus, '/Dc/0/Current') - if v is not None and i is not None: - vebuspower += v * i - - # ==== PVINVERTERS ==== - # Work is done in pv-inverter delegate. Ideally all of this should - # happen in update_values in the delegate, but these values are - # used below in calculating consumption, so until this is less - # unwieldy this has to stay here. - # TODO this can go away once consumption below no longer relies - # on these values, or has moved to its own delegate. - newvalues.update(delegates.PvInverters.instance.get_totals()) - self._compute_number_of_phases('/Ac/PvOnGrid', newvalues) - self._compute_number_of_phases('/Ac/PvOnOutput', newvalues) - self._compute_number_of_phases('/Ac/PvOnGenset', newvalues) - - # ==== SOLARCHARGERS ==== - solarchargers = self._dbusmonitor.get_service_list('com.victronenergy.solarcharger') - solarcharger_batteryvoltage = None - solarcharger_batteryvoltage_service = None - solarchargers_charge_power = 0 - solarchargers_loadoutput_power = None - - for solarcharger in solarchargers: - v = self._dbusmonitor.get_value(solarcharger, '/Dc/0/Voltage') - if v is None: - continue - i = self._dbusmonitor.get_value(solarcharger, '/Dc/0/Current') - if i is None: - continue - l = self._dbusmonitor.get_value(solarcharger, '/Load/I', 0) - - if l is not None: - if solarchargers_loadoutput_power is None: - solarchargers_loadoutput_power = l * v - else: - solarchargers_loadoutput_power += l * v - - solarchargers_charge_power += v * i - - # Note that this path is not in the _summeditems{}, making for it to not be - # published on D-Bus. Which fine. The only one needing it is the vebussocwriter- - # delegate. - if '/Dc/Pv/ChargeCurrent' not in newvalues: - newvalues['/Dc/Pv/ChargeCurrent'] = i - else: - newvalues['/Dc/Pv/ChargeCurrent'] += i - - if '/Dc/Pv/Power' not in newvalues: - newvalues['/Dc/Pv/Power'] = v * _safeadd(i, l) - newvalues['/Dc/Pv/Current'] = _safeadd(i, l) - solarcharger_batteryvoltage = v - solarcharger_batteryvoltage_service = solarcharger - else: - newvalues['/Dc/Pv/Power'] += v * _safeadd(i, l) - newvalues['/Dc/Pv/Current'] += _safeadd(i, l) - - # ==== FUELCELLS ==== - fuelcells = self._dbusmonitor.get_service_list('com.victronenergy.fuelcell') - fuelcell_batteryvoltage = None - fuelcell_batteryvoltage_service = None - for fuelcell in fuelcells: - # Assume the battery connected to output 0 is the main battery - v = self._dbusmonitor.get_value(fuelcell, '/Dc/0/Voltage') - if v is None: - continue - - fuelcell_batteryvoltage = v - fuelcell_batteryvoltage_service = fuelcell - - i = self._dbusmonitor.get_value(fuelcell, '/Dc/0/Current') - if i is None: - continue - - if '/Dc/FuelCell/Power' not in newvalues: - newvalues['/Dc/FuelCell/Power'] = v * i - else: - newvalues['/Dc/FuelCell/Power'] += v * i - - # ==== ALTERNATOR ==== - alternators = self._dbusmonitor.get_service_list('com.victronenergy.alternator') - for alternator in alternators: -#### modified for GuiMods - # some alternators do not provide a valid power value if not running - # or below a minimum power/current - # so fill in a zero power so that the systemcalc power becomes valid - # Assume the battery connected to output 0 is the main battery - p = self._dbusmonitor.get_value(alternator, '/Dc/0/Power') - if p is None: - #### continue - p = 0 - - if '/Dc/Alternator/Power' not in newvalues: - newvalues['/Dc/Alternator/Power'] = p - else: - newvalues['/Dc/Alternator/Power'] += p - - -#### added for GuiMods - # ==== MOTOR DRIVE ==== - motordrives = self._dbusmonitor.get_service_list('com.victronenergy.motordrive') - for motordrive in motordrives: - p = self._dbusmonitor.get_value(motordrive, '/Dc/0/Power') - if p is None: - p = 0 - - if '/Dc/MotorDrive/Power' not in newvalues: - newvalues['/Dc/MotorDrive/Power'] = p - else: - newvalues['/Dc/MotorDrive/Power'] += p - -#### added for GuiMods - # ==== DC SOURCES ==== - dcSources = self._dbusmonitor.get_service_list('com.victronenergy.dcsource') - for dcSource in dcSources: - monitorMode = self._dbusmonitor.get_value(dcSource,'/Settings/MonitorMode') - # ==== WIND GENERATOR ==== - if monitorMode == -8: - p = self._dbusmonitor.get_value(dcSource, '/Dc/0/Power') - if p is None: - continue - if '/Dc/WindGenerator/Power' not in newvalues: - newvalues['/Dc/WindGenerator/Power'] = p - else: - newvalues['/Dc/WindGenerator/Power'] += p - - # ==== CHARGERS ==== - chargers = self._dbusmonitor.get_service_list('com.victronenergy.charger') - charger_batteryvoltage = None - charger_batteryvoltage_service = None - for charger in chargers: - # Assume the battery connected to output 0 is the main battery - v = self._dbusmonitor.get_value(charger, '/Dc/0/Voltage') - if v is None: - continue - - charger_batteryvoltage = v - charger_batteryvoltage_service = charger - - i = self._dbusmonitor.get_value(charger, '/Dc/0/Current') - if i is None: - continue - - if '/Dc/Charger/Power' not in newvalues: - newvalues['/Dc/Charger/Power'] = v * i - else: - newvalues['/Dc/Charger/Power'] += v * i - - # ==== Other Inverters and Inverter/Chargers ==== - _other_inverters = sorted((di, s) for s, di in self._dbusmonitor.get_service_list('com.victronenergy.multi').items()) + \ - sorted((di, s) for s, di in self._dbusmonitor.get_service_list('com.victronenergy.inverter').items()) - non_vebus_inverters = [x[1] for x in _other_inverters] - non_vebus_inverter = None - if non_vebus_inverters: - non_vebus_inverter = non_vebus_inverters[0] - - # For RS Smart and Multi RS, add PV to the yield - for i in non_vebus_inverters: - if (pv_yield := self._dbusmonitor.get_value(i, "/Yield/Power")) is not None: - newvalues['/Dc/Pv/Power'] = newvalues.get('/Dc/Pv/Power', 0) + pv_yield - - # Used lower down, possibly needed for battery values as well - dcsystems = self._dbusmonitor.get_service_list('com.victronenergy.dcsystem') - - # ==== BATTERY ==== - if self._batteryservice is not None: - batteryservicetype = self._batteryservice.split('.')[2] - assert batteryservicetype in ('battery', 'vebus', 'inverter', 'multi') - - newvalues['/Dc/Battery/TimeToGo'] = self._dbusmonitor.get_value(self._batteryservice,'/TimeToGo') - newvalues['/Dc/Battery/ConsumedAmphours'] = self._dbusmonitor.get_value(self._batteryservice,'/ConsumedAmphours') - newvalues['/Dc/Battery/ProductId'] = self._dbusmonitor.get_value(self._batteryservice, '/ProductId') - - if batteryservicetype in ('battery', 'inverter', 'multi'): - newvalues['/Dc/Battery/Voltage'] = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Voltage') - newvalues['/Dc/Battery/VoltageService'] = self._batteryservice - newvalues['/Dc/Battery/Current'] = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Current') - newvalues['/Dc/Battery/Power'] = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Power') - - elif batteryservicetype == 'vebus': - vebus_voltage = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Voltage') - vebus_current = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Current') - vebus_power = None if vebus_voltage is None or vebus_current is None else vebus_current * vebus_voltage - newvalues['/Dc/Battery/Voltage'] = vebus_voltage - newvalues['/Dc/Battery/VoltageService'] = self._batteryservice - if self._settings['hasdcsystem'] == 1 or dcsystems: - # hasdcsystem will normally disqualify the multi from being - # auto-selected as battery monitor, so the only way we're - # here is if the user explicitly selected the multi as the - # battery service - newvalues['/Dc/Battery/Current'] = vebus_current - if vebus_power is not None: - newvalues['/Dc/Battery/Power'] = vebus_power - else: - battery_power = _safeadd(solarchargers_charge_power, vebus_power) - newvalues['/Dc/Battery/Current'] = battery_power / vebus_voltage if vebus_voltage is not None and vebus_voltage > 0 else None - newvalues['/Dc/Battery/Power'] = battery_power - - - p = newvalues.get('/Dc/Battery/Power', None) - if p is not None: - if p > 30: - newvalues['/Dc/Battery/State'] = self.STATE_CHARGING - elif p < -30: - newvalues['/Dc/Battery/State'] = self.STATE_DISCHARGING - else: - newvalues['/Dc/Battery/State'] = self.STATE_IDLE - - else: - # The battery service is not a BMS/BMV or a suitable vebus. A - # suitable vebus is defined as one explicitly selected by the user, - # or one that was automatically selected for SOC tracking. We may - # however still have a VE.Bus, just not one that can accurately - # track SOC. If we have one, use it as voltage source. Otherwise - # try a solar charger, a charger, a vedirect inverter or a dcsource - # as fallbacks. - batteryservicetype = None - vebusses = self._dbusmonitor.get_service_list('com.victronenergy.vebus') - for vebus in vebusses: - v = self._dbusmonitor.get_value(vebus, '/Dc/0/Voltage') - s = self._dbusmonitor.get_value(vebus, '/State') - if v is not None and s not in (0, None): - newvalues['/Dc/Battery/Voltage'] = v - newvalues['/Dc/Battery/VoltageService'] = vebus - break # Skip the else below - else: - # No suitable vebus voltage, try other devices - if non_vebus_inverter is not None and (v := self._dbusmonitor.get_value(non_vebus_inverter, '/Dc/0/Voltage')) is not None: - newvalues['/Dc/Battery/Voltage'] = v - newvalues['/Dc/Battery/VoltageService'] = non_vebus_inverter - elif solarcharger_batteryvoltage is not None: - newvalues['/Dc/Battery/Voltage'] = solarcharger_batteryvoltage - newvalues['/Dc/Battery/VoltageService'] = solarcharger_batteryvoltage_service - elif charger_batteryvoltage is not None: - newvalues['/Dc/Battery/Voltage'] = charger_batteryvoltage - newvalues['/Dc/Battery/VoltageService'] = charger_batteryvoltage_service - elif fuelcell_batteryvoltage is not None: - newvalues['/Dc/Battery/Voltage'] = fuelcell_batteryvoltage - newvalues['/Dc/Battery/VoltageService'] = fuelcell_batteryvoltage_service - elif dcsystems: - # Get voltage from first dcsystem - s = next(iter(dcsystems.keys())) - v = self._dbusmonitor.get_value(s, '/Dc/0/Voltage') - if v is not None: - newvalues['/Dc/Battery/Voltage'] = v - newvalues['/Dc/Battery/VoltageService'] = s - - # We have no suitable battery monitor, so power and current data - # is not available. We can however calculate it from other values, - # if we have at least a battery voltage. - if '/Dc/Battery/Voltage' in newvalues: - dcsystempower = _safeadd(0, *(self._dbusmonitor.get_value(s, - '/Dc/0/Power', 0) for s in dcsystems)) - if dcsystems or self._settings['hasdcsystem'] == 0: - # Either DC loads are monitored, or there are no - # unmonitored DC loads or chargers: derive battery watts - # and amps from vebus, solarchargers, chargers and measured - # loads. - p = solarchargers_charge_power + newvalues.get('/Dc/Charger/Power', 0) + vebuspower - dcsystempower - voltage = newvalues['/Dc/Battery/Voltage'] - newvalues['/Dc/Battery/Current'] = p / voltage if voltage > 0 else None - newvalues['/Dc/Battery/Power'] = p - - # ==== SYSTEM POWER ==== - # Look for dcsytem devices, add them together. Otherwise, if enabled, - # calculate it - if dcsystems: - newvalues['/Dc/System/MeasurementType'] = 1 # measured - newvalues['/Dc/System/Power'] = 0 - for meter in dcsystems: - newvalues['/Dc/System/Power'] = _safeadd(newvalues['/Dc/System/Power'], - self._dbusmonitor.get_value(meter, '/Dc/0/Power')) - elif self._settings['hasdcsystem'] == 1 and batteryservicetype == 'battery': - # Calculate power being generated/consumed by not measured devices in the network. - # For MPPTs, take all the power, including power going out of the load output. - # /Dc/System: positive: consuming power - # VE.Bus: Positive: current flowing from the Multi to the dc system or battery - # Solarcharger & other chargers: positive: charging - # battery: Positive: charging battery. - # battery = solarcharger + charger + ve.bus - system - - battery_power = newvalues.get('/Dc/Battery/Power') - if battery_power is not None: - dc_pv_power = newvalues.get('/Dc/Pv/Power', 0) - charger_power = newvalues.get('/Dc/Charger/Power', 0) - fuelcell_power = newvalues.get('/Dc/FuelCell/Power', 0) - alternator_power = newvalues.get('/Dc/Alternator/Power', 0) -#### added for GuiMods - windgen_power = newvalues.get('/Dc/WindGenerator/Power', 0) - motordrive_power = newvalues.get('/Dc/MotorDrive/Power', 0) - - # If there are VE.Direct inverters, remove their power from the - # DC estimate. This is done using the AC value when the DC - # power values are not available. - inverter_power = 0 - for i in non_vebus_inverters: - inverter_current = self._dbusmonitor.get_value(i, '/Dc/0/Current') - if inverter_current is not None: - inverter_power += self._dbusmonitor.get_value( - i, '/Dc/0/Voltage', 0) * inverter_current - else: - inverter_power -= self._dbusmonitor.get_value( - i, '/Ac/Out/L1/V', 0) * self._dbusmonitor.get_value( - i, '/Ac/Out/L1/I', 0) - newvalues['/Dc/System/MeasurementType'] = 0 # estimated - # FIXME In future we will subtract alternator power from the - # calculated DC power, because it will be individually - # displayed. For now, we leave it out so that in the current - # version of Venus it does not break user's expectations. - #newvalues['/Dc/System/Power'] = dc_pv_power + charger_power + fuelcell_power + vebuspower + inverter_power - battery_power - alternator_power -#### changed for GuiMods - # average DC system power over 3 passes (seconds) to minimize wild swings in displayed value - self.dcSystemPower[2] = self.dcSystemPower[1] - self.dcSystemPower[1] = self.dcSystemPower[0] - self.dcSystemPower[0] = dc_pv_power + charger_power + fuelcell_power + vebuspower + inverter_power - battery_power + alternator_power + windgen_power - motordrive_power - newvalues['/Dc/System/Power'] = (self.dcSystemPower[0] + self.dcSystemPower[1] + self.dcSystemPower[2]) / 3 - - elif self._settings['hasdcsystem'] == 1 and solarchargers_loadoutput_power is not None: - newvalues['/Dc/System/MeasurementType'] = 0 # estimated - newvalues['/Dc/System/Power'] = solarchargers_loadoutput_power - - # ==== Vebus ==== - multi_path = getattr(delegates.Multi.instance.multi, 'service', None) - if multi_path is not None: - dc_current = self._dbusmonitor.get_value(multi_path, '/Dc/0/Current') - newvalues['/Dc/Vebus/Current'] = dc_current - dc_power = self._dbusmonitor.get_value(multi_path, '/Dc/0/Power') - # Just in case /Dc/0/Power is not available - if dc_power == None and dc_current is not None: - dc_voltage = self._dbusmonitor.get_value(multi_path, '/Dc/0/Voltage') - if dc_voltage is not None: - dc_power = dc_voltage * dc_current - # Note that there is also vebuspower, which is the total DC power summed over all multis. - # However, this value cannot be combined with /Dc/Multi/Current, because it does not make sense - # to add the Dc currents of all multis if they do not share the same DC voltage. - newvalues['/Dc/Vebus/Power'] = dc_power - - # ===== AC IN SOURCE ===== - ac_in_source = None - active_input = None - if multi_path is None: - # Check if we have an non-VE.Bus inverter. - if non_vebus_inverter is not None: - if (active_input := self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/ActiveIn/ActiveInput')) is not None and \ - active_input in (0, 1) and \ - (active_type := self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/{}/Type'.format(active_input + 1))) is not None: - ac_in_source = active_type - else: - ac_in_source = 240 - else: - active_input = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/ActiveInput') - if active_input == 0xF0: - # Not connected - ac_in_source = 240 - elif active_input is not None: - settings_path = '/Settings/SystemSetup/AcInput%s' % (active_input + 1) - ac_in_source = self._dbusmonitor.get_value('com.victronenergy.settings', settings_path) - newvalues['/Ac/ActiveIn/Source'] = ac_in_source - - # ===== GRID METERS & CONSUMPTION ==== - grid_meter = delegates.AcInputs.instance.gridmeter - genset_meter = delegates.AcInputs.instance.gensetmeter - - # Make an educated guess as to what is being consumed from an AC source. If ac_in_source - # indicates grid, genset or shore, we use that. If the Multi is off, or disconnected through - # a relay assistant or otherwise, then assume the presence of a .grid or .genset service indicates - # presence of that AC source. If both are available, then give up. This decision making is here - # so the GUI has something to present even if the Multi is off. - ac_in_guess = ac_in_source - if ac_in_guess in (None, 0xF0): - if genset_meter is None and grid_meter is not None: - ac_in_guess = 1 - elif grid_meter is None and genset_meter is not None: - ac_in_guess = 2 - - consumption = { "L1" : None, "L2" : None, "L3" : None } - currentconsumption = { "L1" : None, "L2" : None, "L3" : None } - -#### added for GuiMods - voltageIn = { "L1" : None, "L2" : None, "L3" : None } - voltageOut = { "L1" : None, "L2" : None, "L3" : None } - frequencyIn = None - frequencyOut = None - - for device_type, em, _types in (('Grid', grid_meter, (1, 3)), ('Genset', genset_meter, (2,))): - # If a grid meter is present we use values from it. If not, we look at the multi. If it has - # AcIn1 or AcIn2 connected to the grid, we use those values. - # com.victronenergy.grid.??? indicates presence of an energy meter used as grid meter. - # com.victronenergy.vebus.???/Ac/ActiveIn/ActiveInput: decides which whether we look at AcIn1 - # or AcIn2 as possible grid connection. - uses_active_input = ac_in_source in _types - for phase in consumption: - p = None - mc = None - pvpower = newvalues.get('/Ac/PvOn%s/%s/Power' % (device_type, phase)) - pvcurrent = newvalues.get('/Ac/PvOn%s/%s/Current' % (device_type, phase)) - if em is not None: - p = self._dbusmonitor.get_value(em.service, '/Ac/%s/Power' % phase) - mc = self._dbusmonitor.get_value(em.service, '/Ac/%s/Current' % phase) -#### added for GuiMods - if voltageIn[phase] == None: - voltageIn[phase] = self._dbusmonitor.get_value(em.service, '/Ac/%s/Voltage' % phase) - if frequencyIn == None: - frequencyIn = self._dbusmonitor.get_value(em.service, '/Ac/%s/Frequency' % phase) - - # Compute consumption between energy meter and multi (meter power - multi AC in) and - # add an optional PV inverter on input to the mix. - c = None - cc = None - if uses_active_input: - if multi_path is not None: - try: - c = _safeadd(c, -self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/P' % phase)) - cc = _safeadd(cc, -self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/I' % phase)) -#### added for GuiMods - if voltageIn[phase] == None: - voltageIn[phase] = self._dbusmonitor.get_value(em.service, '/Ac/ActiveIn/%s/V' % phase) - if frequencyIn == None: - frequencyIn = self._dbusmonitor.get_value(em.service, '/Ac/ActiveIn/%s/F' % phase) - - except TypeError: - pass - elif non_vebus_inverter is not None and active_input in (0, 1): - try: - c = _safeadd(c, -self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/P' % (active_input+1, phase))) - cc = _safeadd(cc, -self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/I' % (active_input+1, phase))) -#### added for GuiMods - if voltageIn[phase] == None: - voltageIn[phase] = self._dbusmonitor.get_value(em.service, '/Ac/In/%d/%s/V' % (active_input+1, phase)) - if frequencyIn == None: - frequencyIn = self._dbusmonitor.get_value(em.service, '/Ac/In/%d/%s/F' % (active_input+1, phase)) - - except TypeError: - pass - - # If there's any power coming from a PV inverter in the inactive AC in (which is unlikely), - # it will still be used, because there may also be a load in the same ACIn consuming - # power, or the power could be fed back to the net. - c = _safeadd(c, p, pvpower) - cc = _safeadd(cc, mc, pvcurrent) - consumption[phase] = _safeadd(consumption[phase], _safemax(0, c)) - currentconsumption[phase] = _safeadd(currentconsumption[phase], _safemax(0, cc)) - else: - if uses_active_input: - if multi_path is not None and ( - p := self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/P' % phase)) is not None: - consumption[phase] = _safeadd(0, consumption[phase]) - currentconsumption[phase] = _safeadd(0, currentconsumption[phase]) - mc = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/I' % phase) -#### added for GuiMods - if voltageIn[phase] == None: - voltageIn[phase] = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/V' % phase) - if frequencyIn == None: - freq = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/F' % phase) - if freq != None: - frequencyIn = freq - - elif non_vebus_inverter is not None and active_input in (0, 1): - p = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/P' % (active_input + 1, phase)) - mc = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/I' % (active_input + 1, phase)) -#### added for GuiMods - if voltageIn[phase] == None: - voltageIn[phase] = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/V' % (active_input + 1, phase)) - if frequencyIn == None: - frequencyIn = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/F' % (active_input + 1, phase)) - - if p is not None: - consumption[phase] = _safeadd(0, consumption[phase]) - currentconsumption[phase] = _safeadd(0, currentconsumption[phase]) - - # No relevant energy meter present. Assume there is no load between the grid and the multi. - # There may be a PV inverter present though (Hub-3 setup). - try: - p = _safeadd(p, -pvpower) - mc = _safeadd(mc, -pvcurrent) - except TypeError: - pass - - newvalues['/Ac/%s/%s/Power' % (device_type, phase)] = p - newvalues['/Ac/%s/%s/Current' % (device_type, phase)] = mc -#### added for GuiMods - if p != None: - newvalues['/Ac/%s/%s/Voltage' % (device_type, phase)] = voltageIn[phase] - newvalues['/Ac/%s/Frequency' % (device_type)] = frequencyIn - - if ac_in_guess in _types: - newvalues['/Ac/ActiveIn/%s/Power' % phase] = p - newvalues['/Ac/ActiveIn/%s/Current' % phase] = mc -#### added for GuiMods - if p != None: - newvalues['/Ac/ActiveIn/%s/Voltage' % (phase,)] = voltageIn[phase] - newvalues['/Ac/ActiveIn/Frequency'] = frequencyIn - - self._compute_number_of_phases('/Ac/%s' % device_type, newvalues) - self._compute_number_of_phases('/Ac/ActiveIn', newvalues) - - product_id = None - device_type_id = None - if em is not None: - product_id = em.product_id - device_type_id = em.device_type - if product_id is None and uses_active_input: - if multi_path is not None: - product_id = self._dbusmonitor.get_value(multi_path, '/ProductId') - elif non_vebus_inverter is not None: - product_id = self._dbusmonitor.get_value(non_vebus_inverter, '/ProductId') - newvalues['/Ac/%s/ProductId' % device_type] = product_id - newvalues['/Ac/%s/DeviceType' % device_type] = device_type_id - - # If we have an ESS system and RunWithoutGridMeter is set, there cannot be load on the AC-In, so it - # must be on AC-Out. Hence we do calculate AC-Out consumption even if 'useacout' is disabled. - # Similarly all load are by definition on the output if this is not an ESS system. - use_ac_out = \ - self._settings['useacout'] == 1 or \ - (multi_path is not None and self._dbusmonitor.get_value(multi_path, '/Hub4/AssistantId') not in (4, 5)) or \ - self._dbusmonitor.get_value('com.victronenergy.settings', '/Settings/CGwacs/RunWithoutGridMeter') == 1 - for phase in consumption: - c = None - a = None - if use_ac_out: - c = newvalues.get('/Ac/PvOnOutput/%s/Power' % phase) - a = newvalues.get('/Ac/PvOnOutput/%s/Current' % phase) -#### added for GuiMods - if voltageOut[phase] == None: - voltageOut[phase] = newvalues.get('/Ac/PvOnOutput/%s/Voltage' % phase) - if frequencyOut == None: - frequencyOut = newvalues.get('/Ac/PvOnOutput/%s/Frequency' % phase) - - if multi_path is None: - for inv in non_vebus_inverters: - ac_out = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/P' % phase) - i = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/I' % phase) -#### added for GuiMods - if voltageOut[phase] == None: - voltageOut[phase] = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/V' % phase) - if frequencyOut == None: - frequencyOut = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/F' % phase) - - # Some models don't show power, try apparent power, - # else calculate it - if ac_out is None: - ac_out = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/S' % phase) - if ac_out is None: -#### modified for GuiMods - # u = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/V' % phase) - if None not in (i, voltageOut[phase]): - ac_out = i * voltageOut[phase] - c = _safeadd(c, ac_out) - a = _safeadd(a, i) - else: - ac_out = self._dbusmonitor.get_value(multi_path, '/Ac/Out/%s/P' % phase) - c = _safeadd(c, ac_out) - i_out = self._dbusmonitor.get_value(multi_path, '/Ac/Out/%s/I' % phase) - a = _safeadd(a, i_out) -#### added for GuiMods - if voltageOut[phase] == None: - voltageOut[phase] = self._dbusmonitor.get_value(multi_path, '/Ac/Out/%s/V' % phase) - if frequencyOut == None: - frequencyOut = self._dbusmonitor.get_value(multi_path, '/Ac/Out/%s/F' % phase) - c = _safemax(0, c) - a = _safemax(0, a) - newvalues['/Ac/ConsumptionOnOutput/%s/Power' % phase] = c - newvalues['/Ac/ConsumptionOnOutput/%s/Current' % phase] = a - newvalues['/Ac/ConsumptionOnInput/%s/Power' % phase] = consumption[phase] - newvalues['/Ac/ConsumptionOnInput/%s/Current' % phase] = currentconsumption[phase] - newvalues['/Ac/Consumption/%s/Power' % phase] = _safeadd(consumption[phase], c) - newvalues['/Ac/Consumption/%s/Current' % phase] = _safeadd(currentconsumption[phase], a) -#### added for GuiMods - newvalues['/Ac/ConsumptionOnOutput/%s/Voltage' % phase] = voltageOut[phase] - newvalues['/Ac/ConsumptionOnInput/%s/Voltage' % phase] = voltageIn[phase] - if voltageOut[phase] != None: - newvalues['/Ac/Consumption/%s/Voltage' % phase] = voltageOut[phase] - elif voltageIn[phase] != None: - newvalues['/Ac/Consumption/%s/Voltage' % phase] = voltageIn[phase] - if frequencyIn != None: - newvalues['/Ac/ConsumptionOnInput/Frequency'] = frequencyIn - if frequencyOut != None: - newvalues['/Ac/ConsumptionOnOutput/Frequency'] = frequencyOut - if frequencyOut != None: - newvalues['/Ac/Consumption/Frequency'] = frequencyOut - elif frequencyIn != None: - newvalues['/Ac/Consumption/Frequency'] = frequencyIn - - self._compute_number_of_phases('/Ac/Consumption', newvalues) - self._compute_number_of_phases('/Ac/ConsumptionOnOutput', newvalues) - self._compute_number_of_phases('/Ac/ConsumptionOnInput', newvalues) - - for m in self._modules: - m.update_values(newvalues) - - # ==== UPDATE DBUS ITEMS ==== - with self._dbusservice as sss: - for path in self._summeditems.keys(): - # Why the None? Because we want to invalidate things we don't have anymore. - sss[path] = newvalues.get(path, None) - - def _handleservicechange(self): - # Update the available battery monitor services, used to populate the dropdown in the settings. - # Below code makes a dictionary. The key is [dbuserviceclass]/[deviceinstance]. For example - # "battery/245". The value is the name to show to the user in the dropdown. The full dbus- - # servicename, ie 'com.victronenergy.vebus.ttyO1' is not used, since the last part of that is not - # fixed. dbus-serviceclass name and the device instance are already fixed, so best to use those. - - services = self._get_connected_service_list('com.victronenergy.vebus') - services.update(self._get_connected_service_list('com.victronenergy.battery')) - services.update({k: v for k, v in self._get_connected_service_list( - 'com.victronenergy.multi').items() if self._dbusmonitor.get_value(k, '/Soc') is not None}) - services.update({k: v for k, v in self._get_connected_service_list( - 'com.victronenergy.inverter').items() if self._dbusmonitor.get_value(k, '/Soc') is not None}) - - ul = {self.BATSERVICE_DEFAULT: 'Automatic', self.BATSERVICE_NOBATTERY: 'No battery monitor'} - for servicename, instance in services.items(): - key = self._get_instance_service_name(servicename, instance) - ul[key] = self._get_readable_service_name(servicename) - self._dbusservice['/AvailableBatteryServices'] = json.dumps(ul) - - ul = {self.BATSERVICE_DEFAULT: 'Automatic', self.BATSERVICE_NOBATTERY: 'No battery monitor'} - # For later: for device supporting multiple Dc measurement we should add entries for /Dc/1 etc as - # well. - for servicename, instance in services.items(): - key = self._get_instance_service_name(servicename, instance).replace('.', '_').replace('/', '_') + '/Dc/0' - ul[key] = self._get_readable_service_name(servicename) - self._dbusservice['/AvailableBatteryMeasurements'] = ul - - self._determinebatteryservice() - - self._changed = True - - def _get_readable_service_name(self, servicename): - return '%s on %s' % ( - self._dbusmonitor.get_value(servicename, '/ProductName'), - self._dbusmonitor.get_value(servicename, '/Mgmt/Connection')) - - def _get_instance_service_name(self, service, instance): - return '%s/%s' % ('.'.join(service.split('.')[0:3]), instance) - - def _remove_unconnected_services(self, services): - # Workaround: because com.victronenergy.vebus is available even when there is no vebus product - # connected, remove any service that is not connected. Previously we used - # /State since mandatory path /Connected is not implemented in mk2dbus, - # but this has since been resolved. - for servicename in list(services.keys()): - if (self._dbusmonitor.get_value(servicename, '/Connected') != 1 - or self._dbusmonitor.get_value(servicename, '/ProductName') is None - or self._dbusmonitor.get_value(servicename, '/Mgmt/Connection') is None): - del services[servicename] - - def _dbus_value_changed(self, dbusServiceName, dbusPath, dict, changes, deviceInstance): - self._changed = True - - # Workaround because com.victronenergy.vebus is available even when there is no vebus product - # connected. - if (dbusPath in ['/Connected', '/ProductName', '/Mgmt/Connection'] or - (dbusPath == '/State' and dbusServiceName.split('.')[0:3] == ['com', 'victronenergy', 'vebus'])): - self._handleservicechange() - - # Track the timezone changes - if dbusPath == '/Settings/System/TimeZone': - tz = changes.get('Value') - if tz is not None: - os.environ['TZ'] = tz - time.tzset() - - def _device_added(self, service, instance, do_service_change=True): - if do_service_change: - self._handleservicechange() - - for m in self._modules: - m.device_added(service, instance, do_service_change) - - def _device_removed(self, service, instance): - self._handleservicechange() - - for m in self._modules: - m.device_removed(service, instance) - - def _gettext(self, path, value): - if path == '/Dc/Battery/State': - state = {self.STATE_IDLE: 'Idle', self.STATE_CHARGING: 'Charging', - self.STATE_DISCHARGING: 'Discharging'} - return state[value] - item = self._summeditems.get(path) - if item is not None: - return item['gettext'] % value - return str(value) - - def _compute_number_of_phases(self, path, newvalues): - number_of_phases = None - for phase in range(1, 4): - p = newvalues.get('%s/L%s/Power' % (path, phase)) - if p is not None: - number_of_phases = phase - newvalues[path + '/NumberOfPhases'] = number_of_phases - - def _get_connected_service_list(self, classfilter=None): - services = self._dbusmonitor.get_service_list(classfilter=classfilter) - self._remove_unconnected_services(services) - return services - - # returns a servicename string - def _get_first_connected_service(self, classfilter): - services = self._get_connected_service_list(classfilter=classfilter) - if len(services) == 0: - return None - return next(iter(services.items()), (None,))[0] - - # returns a tuple (servicename, instance) - def _get_service_having_lowest_instance(self, classfilter=None): - services = self._get_connected_service_list(classfilter=classfilter) - if len(services) == 0: - return None - - # sort the dict by value; returns list of tuples: (value, key) - s = sorted((value, key) for (key, value) in services.items()) - return (s[0][1], s[0][0]) - - -class DbusSystemCalc(SystemCalc): - def _create_dbus_monitor(self, *args, **kwargs): - return DbusMonitor(*args, **kwargs) - - def _create_settings(self, *args, **kwargs): - bus = dbus.SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else dbus.SystemBus() - return SettingsDevice(bus, *args, timeout=10, **kwargs) - - def _create_dbus_service(self): - venusversion, venusbuildtime = self._get_venus_versioninfo() - - dbusservice = VeDbusService('com.victronenergy.system') - dbusservice.add_mandatory_paths( - processname=__file__, - processversion=softwareVersion, - connection='data from other dbus processes', - deviceinstance=0, - productid=None, - productname=None, - firmwareversion=venusversion, - hardwareversion=None, - connected=1) - dbusservice.add_path('/FirmwareBuild', value=venusbuildtime) - return dbusservice - - def _get_venus_versioninfo(self): - try: - with open("/opt/victronenergy/version", "r") as fp: - version, software, buildtime = fp.read().split('\n')[:3] - major, minor, _, rev = re.compile('v([0-9]*)\.([0-9]*)(~([0-9]*))?').match(version).groups() - return (int(major, 16)<<16)+(int(minor, 16)<<8)+(0 if rev is None else int(rev, 16)), buildtime - except Exception: - pass - return 0, '0' - -if __name__ == "__main__": - # Argument parsing - parser = argparse.ArgumentParser( - description='Converts readings from AC-Sensors connected to a VE.Bus device in a pvinverter ' + - 'D-Bus service.' - ) - - parser.add_argument("-d", "--debug", help="set logging level to debug", - action="store_true") - - args = parser.parse_args() - - print("-------- dbus_systemcalc, v" + softwareVersion + " is starting up --------") - logger = setup_logging(args.debug) - - # Have a mainloop, so we can send/receive asynchronous calls to and from dbus - DBusGMainLoop(set_as_default=True) - - systemcalc = DbusSystemCalc() - - # Start and run the mainloop - logger.info("Starting mainloop, responding only on events") - mainloop = GLib.MainLoop() - mainloop.run() diff --git a/FileSets/v3.20~2/dbus_systemcalc.py.orig b/FileSets/v3.20~2/dbus_systemcalc.py.orig deleted file mode 100755 index 12cfb96b..00000000 --- a/FileSets/v3.20~2/dbus_systemcalc.py.orig +++ /dev/null @@ -1,1146 +0,0 @@ -#!/usr/bin/python3 -u -# -*- coding: utf-8 -*- - -from dbus.mainloop.glib import DBusGMainLoop -import dbus -import argparse -import sys -import os -import json -import time -import re -from gi.repository import GLib - -# Victron packages -sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) -from vedbus import VeDbusService -from ve_utils import get_vrm_portal_id, exit_on_error -from dbusmonitor import DbusMonitor -from settingsdevice import SettingsDevice -from logger import setup_logging -import delegates -from sc_utils import safeadd as _safeadd, safemax as _safemax - -softwareVersion = '2.132' - -class SystemCalc: - STATE_IDLE = 0 - STATE_CHARGING = 1 - STATE_DISCHARGING = 2 - BATSERVICE_DEFAULT = 'default' - BATSERVICE_NOBATTERY = 'nobattery' - def __init__(self): - # Why this dummy? Because DbusMonitor expects these values to be there, even though we don't - # need them. So just add some dummy data. This can go away when DbusMonitor is more generic. - dummy = {'code': None, 'whenToLog': 'configChange', 'accessLevel': None} - dbus_tree = { - 'com.victronenergy.solarcharger': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Load/I': dummy, - '/FirmwareVersion': dummy}, - 'com.victronenergy.battery': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/DeviceInstance': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/1/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Soc': dummy, - '/Sense/Current': dummy, - '/TimeToGo': dummy, - '/ConsumedAmphours': dummy, - '/ProductId': dummy, - '/CustomName': dummy, - '/Info/MaxChargeVoltage': dummy}, - 'com.victronenergy.vebus' : { - '/Ac/ActiveIn/ActiveInput': dummy, - '/Ac/ActiveIn/L1/P': dummy, - '/Ac/ActiveIn/L2/P': dummy, - '/Ac/ActiveIn/L3/P': dummy, - '/Ac/ActiveIn/L1/I': dummy, - '/Ac/ActiveIn/L2/I': dummy, - '/Ac/ActiveIn/L3/I': dummy, - '/Ac/Out/L1/P': dummy, - '/Ac/Out/L2/P': dummy, - '/Ac/Out/L3/P': dummy, - '/Ac/Out/L1/I': dummy, - '/Ac/Out/L2/I': dummy, - '/Ac/Out/L3/I': dummy, - '/Connected': dummy, - '/ProductId': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Mode': dummy, - '/State': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Soc': dummy}, - 'com.victronenergy.fuelcell': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy}, - 'com.victronenergy.charger': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/1/Voltage': dummy, - '/Dc/1/Current': dummy, - '/Dc/2/Voltage': dummy, - '/Dc/2/Current': dummy}, - 'com.victronenergy.grid' : { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/ProductId' : dummy, - '/DeviceType' : dummy, - '/Ac/L1/Power': dummy, - '/Ac/L2/Power': dummy, - '/Ac/L3/Power': dummy, - '/Ac/L1/Current': dummy, - '/Ac/L2/Current': dummy, - '/Ac/L3/Current': dummy}, - 'com.victronenergy.genset' : { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/ProductId' : dummy, - '/DeviceType' : dummy, - '/Ac/L1/Power': dummy, - '/Ac/L2/Power': dummy, - '/Ac/L3/Power': dummy, - '/Ac/L1/Current': dummy, - '/Ac/L2/Current': dummy, - '/Ac/L3/Current': dummy, - '/StarterVoltage': dummy}, - 'com.victronenergy.settings' : { - '/Settings/SystemSetup/AcInput1' : dummy, - '/Settings/SystemSetup/AcInput2' : dummy, - '/Settings/CGwacs/RunWithoutGridMeter' : dummy, - '/Settings/System/TimeZone' : dummy}, - 'com.victronenergy.temperature': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy}, - 'com.victronenergy.inverter': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Ac/Out/L1/P': dummy, - '/Ac/Out/L1/S': dummy, - '/Ac/Out/L1/V': dummy, - '/Ac/Out/L1/I': dummy, - '/Yield/Power': dummy, - '/Soc': dummy}, - 'com.victronenergy.multi': { - '/Connected': dummy, - '/ProductName': dummy, - '/Mgmt/Connection': dummy, - '/Dc/0/Voltage': dummy, - '/Dc/0/Current': dummy, - '/Dc/0/Power': dummy, - '/Ac/ActiveIn/ActiveInput': dummy, - '/Ac/In/1/Type': dummy, - '/Ac/In/2/Type': dummy, - '/Ac/In/1/L1/P': dummy, - '/Ac/In/1/L1/I': dummy, - '/Ac/In/2/L1/P': dummy, - '/Ac/In/2/L1/I': dummy, - '/Ac/Out/L1/P': dummy, - '/Ac/Out/L1/V': dummy, - '/Ac/Out/L1/I': dummy, - '/Yield/Power': dummy, - '/Soc': dummy}, - 'com.victronenergy.dcsystem': { - '/Dc/0/Voltage': dummy, - '/Dc/0/Power': dummy - }, - 'com.victronenergy.alternator': { - '/Dc/0/Power': dummy - } - } - - self._modules = [ - delegates.Multi(), - delegates.HubTypeSelect(), - delegates.VebusSocWriter(), - delegates.ServiceMapper(), - delegates.RelayState(), - delegates.BuzzerControl(), - delegates.LgCircuitBreakerDetect(), - delegates.BatterySoc(self), - delegates.Dvcc(self), - delegates.BatterySense(self), - delegates.BatterySettings(self), - delegates.SystemState(self), - delegates.BatteryLife(), - delegates.ScheduledCharging(), - delegates.SourceTimers(), - delegates.BatteryData(), - delegates.Gps(), - delegates.AcInputs(), - delegates.GensetStartStop(), - delegates.SocSync(self), - delegates.PvInverters(), - delegates.BatteryService(self), - delegates.CanBatterySense(), - delegates.DynamicEss()] - - for m in self._modules: - for service, paths in m.get_input(): - s = dbus_tree.setdefault(service, {}) - for path in paths: - s[path] = dummy - - self._dbusmonitor = self._create_dbus_monitor(dbus_tree, valueChangedCallback=self._dbus_value_changed, - deviceAddedCallback=self._device_added, deviceRemovedCallback=self._device_removed) - - # Connect to localsettings - supported_settings = { - 'batteryservice': ['/Settings/SystemSetup/BatteryService', self.BATSERVICE_DEFAULT, 0, 0], - 'hasdcsystem': ['/Settings/SystemSetup/HasDcSystem', 0, 0, 1], - 'useacout': ['/Settings/SystemSetup/HasAcOutSystem', 1, 0, 1]} - - for m in self._modules: - for setting in m.get_settings(): - supported_settings[setting[0]] = list(setting[1:]) - - self._settings = self._create_settings(supported_settings, self._handlechangedsetting) - - self._dbusservice = self._create_dbus_service() - - for m in self._modules: - m.set_sources(self._dbusmonitor, self._settings, self._dbusservice) - - # At this moment, VRM portal ID is the MAC address of the CCGX. Anyhow, it should be string uniquely - # identifying the CCGX. - self._dbusservice.add_path('/Serial', value=get_vrm_portal_id()) - self._dbusservice.add_path( - '/AvailableBatteryServices', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/AvailableBatteryMeasurements', value=None) - self._dbusservice.add_path( - '/AutoSelectedBatteryService', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/AutoSelectedBatteryMeasurement', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/ActiveBatteryService', value=None, gettextcallback=self._gettext) - self._dbusservice.add_path( - '/Dc/Battery/BatteryService', value=None) - self._summeditems = { - '/Ac/Grid/L1/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L2/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L3/Power': {'gettext': '%.0F W'}, - '/Ac/Grid/L1/Current': {'gettext': '%.1F A'}, - '/Ac/Grid/L2/Current': {'gettext': '%.1F A'}, - '/Ac/Grid/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Grid/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/Grid/ProductId': {'gettext': '%s'}, - '/Ac/Grid/DeviceType': {'gettext': '%s'}, - '/Ac/Genset/L1/Power': {'gettext': '%.0F W'}, - '/Ac/Genset/L2/Power': {'gettext': '%.0F W'}, - '/Ac/Genset/L3/Power': {'gettext': '%.0F W'}, - '/Ac/Genset/L1/Current': {'gettext': '%.1F A'}, - '/Ac/Genset/L2/Current': {'gettext': '%.1F A'}, - '/Ac/Genset/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Genset/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/Genset/ProductId': {'gettext': '%s'}, - '/Ac/Genset/DeviceType': {'gettext': '%s'}, - '/Ac/ConsumptionOnOutput/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L1/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L2/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L3/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnOutput/L1/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnOutput/L2/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnOutput/L3/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnInput/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L1/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L2/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L3/Power': {'gettext': '%.0F W'}, - '/Ac/ConsumptionOnInput/L1/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnInput/L2/Current': {'gettext': '%.1F A'}, - '/Ac/ConsumptionOnInput/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/NumberOfPhases': {'gettext': '%.0F W'}, - '/Ac/Consumption/L1/Power': {'gettext': '%.0F W'}, - '/Ac/Consumption/L2/Power': {'gettext': '%.0F W'}, - '/Ac/Consumption/L3/Power': {'gettext': '%.0F W'}, - '/Ac/Consumption/L1/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/L2/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/L3/Current': {'gettext': '%.1F A'}, - '/Ac/Consumption/NumberOfPhases': {'gettext': '%.0F W'}, - '/Dc/Pv/Power': {'gettext': '%.0F W'}, - '/Dc/Pv/Current': {'gettext': '%.1F A'}, - '/Dc/Battery/Voltage': {'gettext': '%.2F V'}, - '/Dc/Battery/VoltageService': {'gettext': '%s'}, - '/Dc/Battery/Current': {'gettext': '%.1F A'}, - '/Dc/Battery/Power': {'gettext': '%.0F W'}, - '/Dc/Battery/State': {'gettext': '%s'}, - '/Dc/Battery/TimeToGo': {'gettext': '%.0F s'}, - '/Dc/Battery/ConsumedAmphours': {'gettext': '%.1F Ah'}, - '/Dc/Battery/ProductId': {'gettext': '0x%x'}, - '/Dc/Charger/Power': {'gettext': '%.0F %%'}, - '/Dc/FuelCell/Power': {'gettext': '%.0F %%'}, - '/Dc/Alternator/Power': {'gettext': '%.0F W'}, - '/Dc/Vebus/Current': {'gettext': '%.1F A'}, - '/Dc/Vebus/Power': {'gettext': '%.0F W'}, - '/Dc/System/Power': {'gettext': '%.0F W'}, - '/Dc/System/MeasurementType': {'gettext': '%d'}, - '/Ac/ActiveIn/Source': {'gettext': '%s'}, - '/Ac/ActiveIn/L1/Power': {'gettext': '%.0F W'}, - '/Ac/ActiveIn/L2/Power': {'gettext': '%.0F W'}, - '/Ac/ActiveIn/L3/Power': {'gettext': '%.0F W'}, - '/Ac/ActiveIn/L1/Current': {'gettext': '%.1F A'}, - '/Ac/ActiveIn/L2/Current': {'gettext': '%.1F A'}, - '/Ac/ActiveIn/L3/Current': {'gettext': '%.1F A'}, - '/Ac/ActiveIn/NumberOfPhases': {'gettext': '%d'}, - } - - for m in self._modules: - self._summeditems.update(m.get_output()) - - for path in self._summeditems.keys(): - self._dbusservice.add_path(path, value=None, gettextcallback=self._gettext) - - self._batteryservice = None - self._determinebatteryservice() - - if self._batteryservice is None: - logger.info("Battery service initialized to None (setting == %s)" % - self._settings['batteryservice']) - - self._changed = True - for service, instance in self._dbusmonitor.get_service_list().items(): - self._device_added(service, instance, do_service_change=False) - - self._handleservicechange() - self._updatevalues() - - GLib.timeout_add(1000, exit_on_error, self._handletimertick) - - def _create_dbus_monitor(self, *args, **kwargs): - raise Exception("This function should be overridden") - - def _create_settings(self, *args, **kwargs): - raise Exception("This function should be overridden") - - def _create_dbus_service(self): - raise Exception("This function should be overridden") - - def _handlechangedsetting(self, setting, oldvalue, newvalue): - self._determinebatteryservice() - self._changed = True - - # Give our delegates a chance to react on a settings change - for m in self._modules: - m.settings_changed(setting, oldvalue, newvalue) - - def _find_device_instance(self, serviceclass, instance): - """ Gets a mapping of services vs DeviceInstance using - get_service_list. Then searches for the specified DeviceInstance - and returns the service name. """ - services = self._dbusmonitor.get_service_list(classfilter=serviceclass) - - for k, v in services.items(): - if v == instance: - return k - return None - - def _determinebatteryservice(self): - auto_battery_service = self._autoselect_battery_service() - auto_battery_measurement = None - auto_selected = False - if auto_battery_service is not None: - services = self._dbusmonitor.get_service_list() - if auto_battery_service in services: - auto_battery_measurement = \ - self._get_instance_service_name(auto_battery_service, services[auto_battery_service]) - auto_battery_measurement = auto_battery_measurement.replace('.', '_').replace('/', '_') + '/Dc/0' - self._dbusservice['/AutoSelectedBatteryMeasurement'] = auto_battery_measurement - - if self._settings['batteryservice'] == self.BATSERVICE_DEFAULT: - auto_selected = True - newbatteryservice = auto_battery_service - self._dbusservice['/AutoSelectedBatteryService'] = ( - 'No battery monitor found' if newbatteryservice is None else - self._get_readable_service_name(newbatteryservice)) - - elif self._settings['batteryservice'] == self.BATSERVICE_NOBATTERY: - self._dbusservice['/AutoSelectedBatteryService'] = None - newbatteryservice = None - - else: - self._dbusservice['/AutoSelectedBatteryService'] = None - - s = self._settings['batteryservice'].split('/') - if len(s) != 2: - logger.error("The battery setting (%s) is invalid!" % self._settings['batteryservice']) - serviceclass = s[0] - instance = int(s[1]) if len(s) == 2 else None - - # newbatteryservice might turn into None if a chosen battery - # monitor no longer exists. Don't auto change the setting (it might - # come back) and don't autoselect another. - newbatteryservice = self._find_device_instance(serviceclass, instance) - - if newbatteryservice != self._batteryservice: - services = self._dbusmonitor.get_service_list() - instance = services.get(newbatteryservice, None) - if instance is None: - battery_service = None - else: - battery_service = self._get_instance_service_name(newbatteryservice, instance) - self._dbusservice['/ActiveBatteryService'] = battery_service - logger.info("Battery service, setting == %s, changed from %s to %s (%s)" % - (self._settings['batteryservice'], self._batteryservice, newbatteryservice, instance)) - - # Battery service has changed. Notify delegates. - self._dbusservice['/Dc/Battery/BatteryService'] = self._batteryservice = newbatteryservice - for m in self._modules: - m.battery_service_changed(auto_selected, self._batteryservice, newbatteryservice) - - def _autoselect_battery_service(self): - # Default setting business logic: - # first try to use a battery service (BMV or Lynx Shunt VE.Can). If there - # is more than one battery service, just use a random one. If no battery service is - # available, check if there are not Solar chargers and no normal chargers. If they are not - # there, assume this is a hub-2, hub-3 or hub-4 system and use VE.Bus SOC. - batteries = self._get_connected_service_list('com.victronenergy.battery') - - # Pick the battery service that has the lowest DeviceInstance, giving - # preference to those with a BMS. - if len(batteries) > 0: - batteries = [ - (not self._dbusmonitor.seen(s, '/Info/MaxChargeVoltage'), i, s) - for s, i in batteries.items()] - return sorted(batteries, key=lambda x: x[:2])[0][2] - - # No battery services, and there is a charger in the system. Abandon - # hope. - if self._get_first_connected_service('com.victronenergy.charger') is not None: - return None - - # Also no Multi, then give up. - vebus_service = self._get_service_having_lowest_instance('com.victronenergy.vebus') - if vebus_service is None: - # No VE.Bus, but maybe there is an inverter with built-in SOC - # tracking, eg RS Smart or Multi RS. - inverter = self._get_service_having_lowest_instance('com.victronenergy.multi') - if inverter and self._dbusmonitor.get_value(inverter[0], '/Soc') is not None: - return inverter[0] - - inverter = self._get_service_having_lowest_instance('com.victronenergy.inverter') - if inverter and self._dbusmonitor.get_value(inverter[0], '/Soc') is not None: - return inverter[0] - - return None - - # There is a Multi, it supports tracking external charge current from - # solarchargers, and there are no DC loads. Then use it. - if self._dbusmonitor.get_value( - vebus_service[0], '/ExtraBatteryCurrent') is not None \ - and self._get_first_connected_service('com.victronenergy.dcsystem') is None \ - and self._settings['hasdcsystem'] == 0: - return vebus_service[0] - - # Multi does not support tracking solarcharger current, and we have - # solar chargers. Then we cannot use it. - if self._get_first_connected_service('com.victronenergy.solarcharger') is not None: - return None - - # Only a Multi, no other chargers. Then we can use it. - return vebus_service[0] - - @property - def batteryservice(self): - return self._batteryservice - - # Called on a one second timer - def _handletimertick(self): - if self._changed: - self._updatevalues() - self._changed = False - - return True # keep timer running - - def _updatevalues(self): - # ==== PREPARATIONS ==== - newvalues = {} - - # Set the user timezone - if 'TZ' not in os.environ: - tz = self._dbusmonitor.get_value('com.victronenergy.settings', '/Settings/System/TimeZone') - if tz is not None: - os.environ['TZ'] = tz - time.tzset() - - # Determine values used in logic below - vebusses = self._dbusmonitor.get_service_list('com.victronenergy.vebus') - vebuspower = 0 - for vebus in vebusses: - v = self._dbusmonitor.get_value(vebus, '/Dc/0/Voltage') - i = self._dbusmonitor.get_value(vebus, '/Dc/0/Current') - if v is not None and i is not None: - vebuspower += v * i - - # ==== PVINVERTERS ==== - # Work is done in pv-inverter delegate. Ideally all of this should - # happen in update_values in the delegate, but these values are - # used below in calculating consumption, so until this is less - # unwieldy this has to stay here. - # TODO this can go away once consumption below no longer relies - # on these values, or has moved to its own delegate. - newvalues.update(delegates.PvInverters.instance.get_totals()) - self._compute_number_of_phases('/Ac/PvOnGrid', newvalues) - self._compute_number_of_phases('/Ac/PvOnOutput', newvalues) - self._compute_number_of_phases('/Ac/PvOnGenset', newvalues) - - # ==== SOLARCHARGERS ==== - solarchargers = self._dbusmonitor.get_service_list('com.victronenergy.solarcharger') - solarcharger_batteryvoltage = None - solarcharger_batteryvoltage_service = None - solarchargers_charge_power = 0 - solarchargers_loadoutput_power = None - - for solarcharger in solarchargers: - v = self._dbusmonitor.get_value(solarcharger, '/Dc/0/Voltage') - if v is None: - continue - i = self._dbusmonitor.get_value(solarcharger, '/Dc/0/Current') - if i is None: - continue - l = self._dbusmonitor.get_value(solarcharger, '/Load/I', 0) - - if l is not None: - if solarchargers_loadoutput_power is None: - solarchargers_loadoutput_power = l * v - else: - solarchargers_loadoutput_power += l * v - - solarchargers_charge_power += v * i - - # Note that this path is not in the _summeditems{}, making for it to not be - # published on D-Bus. Which fine. The only one needing it is the vebussocwriter- - # delegate. - if '/Dc/Pv/ChargeCurrent' not in newvalues: - newvalues['/Dc/Pv/ChargeCurrent'] = i - else: - newvalues['/Dc/Pv/ChargeCurrent'] += i - - if '/Dc/Pv/Power' not in newvalues: - newvalues['/Dc/Pv/Power'] = v * _safeadd(i, l) - newvalues['/Dc/Pv/Current'] = _safeadd(i, l) - solarcharger_batteryvoltage = v - solarcharger_batteryvoltage_service = solarcharger - else: - newvalues['/Dc/Pv/Power'] += v * _safeadd(i, l) - newvalues['/Dc/Pv/Current'] += _safeadd(i, l) - - # ==== FUELCELLS ==== - fuelcells = self._dbusmonitor.get_service_list('com.victronenergy.fuelcell') - fuelcell_batteryvoltage = None - fuelcell_batteryvoltage_service = None - for fuelcell in fuelcells: - # Assume the battery connected to output 0 is the main battery - v = self._dbusmonitor.get_value(fuelcell, '/Dc/0/Voltage') - if v is None: - continue - - fuelcell_batteryvoltage = v - fuelcell_batteryvoltage_service = fuelcell - - i = self._dbusmonitor.get_value(fuelcell, '/Dc/0/Current') - if i is None: - continue - - if '/Dc/FuelCell/Power' not in newvalues: - newvalues['/Dc/FuelCell/Power'] = v * i - else: - newvalues['/Dc/FuelCell/Power'] += v * i - - # ==== ALTERNATOR ==== - alternators = self._dbusmonitor.get_service_list('com.victronenergy.alternator') - for alternator in alternators: - # Assume the battery connected to output 0 is the main battery - p = self._dbusmonitor.get_value(alternator, '/Dc/0/Power') - if p is None: - continue - - if '/Dc/Alternator/Power' not in newvalues: - newvalues['/Dc/Alternator/Power'] = p - else: - newvalues['/Dc/Alternator/Power'] += p - - # ==== CHARGERS ==== - chargers = self._dbusmonitor.get_service_list('com.victronenergy.charger') - charger_batteryvoltage = None - charger_batteryvoltage_service = None - for charger in chargers: - # Assume the battery connected to output 0 is the main battery - v = self._dbusmonitor.get_value(charger, '/Dc/0/Voltage') - if v is None: - continue - - charger_batteryvoltage = v - charger_batteryvoltage_service = charger - - i = self._dbusmonitor.get_value(charger, '/Dc/0/Current') - if i is None: - continue - - if '/Dc/Charger/Power' not in newvalues: - newvalues['/Dc/Charger/Power'] = v * i - else: - newvalues['/Dc/Charger/Power'] += v * i - - # ==== Other Inverters and Inverter/Chargers ==== - _other_inverters = sorted((di, s) for s, di in self._dbusmonitor.get_service_list('com.victronenergy.multi').items()) + \ - sorted((di, s) for s, di in self._dbusmonitor.get_service_list('com.victronenergy.inverter').items()) - non_vebus_inverters = [x[1] for x in _other_inverters] - non_vebus_inverter = None - if non_vebus_inverters: - non_vebus_inverter = non_vebus_inverters[0] - - # For RS Smart and Multi RS, add PV to the yield - for i in non_vebus_inverters: - if (pv_yield := self._dbusmonitor.get_value(i, "/Yield/Power")) is not None: - newvalues['/Dc/Pv/Power'] = newvalues.get('/Dc/Pv/Power', 0) + pv_yield - - # Used lower down, possibly needed for battery values as well - dcsystems = self._dbusmonitor.get_service_list('com.victronenergy.dcsystem') - - # ==== BATTERY ==== - if self._batteryservice is not None: - batteryservicetype = self._batteryservice.split('.')[2] - assert batteryservicetype in ('battery', 'vebus', 'inverter', 'multi') - - newvalues['/Dc/Battery/TimeToGo'] = self._dbusmonitor.get_value(self._batteryservice,'/TimeToGo') - newvalues['/Dc/Battery/ConsumedAmphours'] = self._dbusmonitor.get_value(self._batteryservice,'/ConsumedAmphours') - newvalues['/Dc/Battery/ProductId'] = self._dbusmonitor.get_value(self._batteryservice, '/ProductId') - - if batteryservicetype in ('battery', 'inverter', 'multi'): - newvalues['/Dc/Battery/Voltage'] = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Voltage') - newvalues['/Dc/Battery/VoltageService'] = self._batteryservice - newvalues['/Dc/Battery/Current'] = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Current') - newvalues['/Dc/Battery/Power'] = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Power') - - elif batteryservicetype == 'vebus': - vebus_voltage = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Voltage') - vebus_current = self._dbusmonitor.get_value(self._batteryservice, '/Dc/0/Current') - vebus_power = None if vebus_voltage is None or vebus_current is None else vebus_current * vebus_voltage - newvalues['/Dc/Battery/Voltage'] = vebus_voltage - newvalues['/Dc/Battery/VoltageService'] = self._batteryservice - if self._settings['hasdcsystem'] == 1 or dcsystems: - # hasdcsystem will normally disqualify the multi from being - # auto-selected as battery monitor, so the only way we're - # here is if the user explicitly selected the multi as the - # battery service - newvalues['/Dc/Battery/Current'] = vebus_current - if vebus_power is not None: - newvalues['/Dc/Battery/Power'] = vebus_power - else: - battery_power = _safeadd(solarchargers_charge_power, vebus_power) - newvalues['/Dc/Battery/Current'] = battery_power / vebus_voltage if vebus_voltage is not None and vebus_voltage > 0 else None - newvalues['/Dc/Battery/Power'] = battery_power - - - p = newvalues.get('/Dc/Battery/Power', None) - if p is not None: - if p > 30: - newvalues['/Dc/Battery/State'] = self.STATE_CHARGING - elif p < -30: - newvalues['/Dc/Battery/State'] = self.STATE_DISCHARGING - else: - newvalues['/Dc/Battery/State'] = self.STATE_IDLE - - else: - # The battery service is not a BMS/BMV or a suitable vebus. A - # suitable vebus is defined as one explicitly selected by the user, - # or one that was automatically selected for SOC tracking. We may - # however still have a VE.Bus, just not one that can accurately - # track SOC. If we have one, use it as voltage source. Otherwise - # try a solar charger, a charger, a vedirect inverter or a dcsource - # as fallbacks. - batteryservicetype = None - vebusses = self._dbusmonitor.get_service_list('com.victronenergy.vebus') - for vebus in vebusses: - v = self._dbusmonitor.get_value(vebus, '/Dc/0/Voltage') - s = self._dbusmonitor.get_value(vebus, '/State') - if v is not None and s not in (0, None): - newvalues['/Dc/Battery/Voltage'] = v - newvalues['/Dc/Battery/VoltageService'] = vebus - break # Skip the else below - else: - # No suitable vebus voltage, try other devices - if non_vebus_inverter is not None and (v := self._dbusmonitor.get_value(non_vebus_inverter, '/Dc/0/Voltage')) is not None: - newvalues['/Dc/Battery/Voltage'] = v - newvalues['/Dc/Battery/VoltageService'] = non_vebus_inverter - elif solarcharger_batteryvoltage is not None: - newvalues['/Dc/Battery/Voltage'] = solarcharger_batteryvoltage - newvalues['/Dc/Battery/VoltageService'] = solarcharger_batteryvoltage_service - elif charger_batteryvoltage is not None: - newvalues['/Dc/Battery/Voltage'] = charger_batteryvoltage - newvalues['/Dc/Battery/VoltageService'] = charger_batteryvoltage_service - elif fuelcell_batteryvoltage is not None: - newvalues['/Dc/Battery/Voltage'] = fuelcell_batteryvoltage - newvalues['/Dc/Battery/VoltageService'] = fuelcell_batteryvoltage_service - elif dcsystems: - # Get voltage from first dcsystem - s = next(iter(dcsystems.keys())) - v = self._dbusmonitor.get_value(s, '/Dc/0/Voltage') - if v is not None: - newvalues['/Dc/Battery/Voltage'] = v - newvalues['/Dc/Battery/VoltageService'] = s - - # We have no suitable battery monitor, so power and current data - # is not available. We can however calculate it from other values, - # if we have at least a battery voltage. - if '/Dc/Battery/Voltage' in newvalues: - dcsystempower = _safeadd(0, *(self._dbusmonitor.get_value(s, - '/Dc/0/Power', 0) for s in dcsystems)) - if dcsystems or self._settings['hasdcsystem'] == 0: - # Either DC loads are monitored, or there are no - # unmonitored DC loads or chargers: derive battery watts - # and amps from vebus, solarchargers, chargers and measured - # loads. - p = solarchargers_charge_power + newvalues.get('/Dc/Charger/Power', 0) + vebuspower - dcsystempower - voltage = newvalues['/Dc/Battery/Voltage'] - newvalues['/Dc/Battery/Current'] = p / voltage if voltage > 0 else None - newvalues['/Dc/Battery/Power'] = p - - # ==== SYSTEM POWER ==== - # Look for dcsytem devices, add them together. Otherwise, if enabled, - # calculate it - if dcsystems: - newvalues['/Dc/System/MeasurementType'] = 1 # measured - newvalues['/Dc/System/Power'] = 0 - for meter in dcsystems: - newvalues['/Dc/System/Power'] = _safeadd(newvalues['/Dc/System/Power'], - self._dbusmonitor.get_value(meter, '/Dc/0/Power')) - elif self._settings['hasdcsystem'] == 1 and batteryservicetype == 'battery': - # Calculate power being generated/consumed by not measured devices in the network. - # For MPPTs, take all the power, including power going out of the load output. - # /Dc/System: positive: consuming power - # VE.Bus: Positive: current flowing from the Multi to the dc system or battery - # Solarcharger & other chargers: positive: charging - # battery: Positive: charging battery. - # battery = solarcharger + charger + ve.bus - system - - battery_power = newvalues.get('/Dc/Battery/Power') - if battery_power is not None: - dc_pv_power = newvalues.get('/Dc/Pv/Power', 0) - charger_power = newvalues.get('/Dc/Charger/Power', 0) - fuelcell_power = newvalues.get('/Dc/FuelCell/Power', 0) - alternator_power = newvalues.get('/Dc/Alternator/Power', 0) - - # If there are VE.Direct inverters, remove their power from the - # DC estimate. This is done using the AC value when the DC - # power values are not available. - inverter_power = 0 - for i in non_vebus_inverters: - inverter_current = self._dbusmonitor.get_value(i, '/Dc/0/Current') - if inverter_current is not None: - inverter_power += self._dbusmonitor.get_value( - i, '/Dc/0/Voltage', 0) * inverter_current - else: - inverter_power -= self._dbusmonitor.get_value( - i, '/Ac/Out/L1/V', 0) * self._dbusmonitor.get_value( - i, '/Ac/Out/L1/I', 0) - newvalues['/Dc/System/MeasurementType'] = 0 # estimated - # FIXME In future we will subtract alternator power from the - # calculated DC power, because it will be individually - # displayed. For now, we leave it out so that in the current - # version of Venus it does not break user's expectations. - #newvalues['/Dc/System/Power'] = dc_pv_power + charger_power + fuelcell_power + vebuspower + inverter_power - battery_power - alternator_power - newvalues['/Dc/System/Power'] = dc_pv_power + charger_power + fuelcell_power + vebuspower + inverter_power - battery_power - - elif self._settings['hasdcsystem'] == 1 and solarchargers_loadoutput_power is not None: - newvalues['/Dc/System/MeasurementType'] = 0 # estimated - newvalues['/Dc/System/Power'] = solarchargers_loadoutput_power - - # ==== Vebus ==== - multi_path = getattr(delegates.Multi.instance.multi, 'service', None) - if multi_path is not None: - dc_current = self._dbusmonitor.get_value(multi_path, '/Dc/0/Current') - newvalues['/Dc/Vebus/Current'] = dc_current - dc_power = self._dbusmonitor.get_value(multi_path, '/Dc/0/Power') - # Just in case /Dc/0/Power is not available - if dc_power == None and dc_current is not None: - dc_voltage = self._dbusmonitor.get_value(multi_path, '/Dc/0/Voltage') - if dc_voltage is not None: - dc_power = dc_voltage * dc_current - # Note that there is also vebuspower, which is the total DC power summed over all multis. - # However, this value cannot be combined with /Dc/Multi/Current, because it does not make sense - # to add the Dc currents of all multis if they do not share the same DC voltage. - newvalues['/Dc/Vebus/Power'] = dc_power - - # ===== AC IN SOURCE ===== - ac_in_source = None - active_input = None - if multi_path is None: - # Check if we have an non-VE.Bus inverter. - if non_vebus_inverter is not None: - if (active_input := self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/ActiveIn/ActiveInput')) is not None and \ - active_input in (0, 1) and \ - (active_type := self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/{}/Type'.format(active_input + 1))) is not None: - ac_in_source = active_type - else: - ac_in_source = 240 - else: - active_input = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/ActiveInput') - if active_input == 0xF0: - # Not connected - ac_in_source = 240 - elif active_input is not None: - settings_path = '/Settings/SystemSetup/AcInput%s' % (active_input + 1) - ac_in_source = self._dbusmonitor.get_value('com.victronenergy.settings', settings_path) - newvalues['/Ac/ActiveIn/Source'] = ac_in_source - - # ===== GRID METERS & CONSUMPTION ==== - grid_meter = delegates.AcInputs.instance.gridmeter - genset_meter = delegates.AcInputs.instance.gensetmeter - - # Make an educated guess as to what is being consumed from an AC source. If ac_in_source - # indicates grid, genset or shore, we use that. If the Multi is off, or disconnected through - # a relay assistant or otherwise, then assume the presence of a .grid or .genset service indicates - # presence of that AC source. If both are available, then give up. This decision making is here - # so the GUI has something to present even if the Multi is off. - ac_in_guess = ac_in_source - if ac_in_guess in (None, 0xF0): - if genset_meter is None and grid_meter is not None: - ac_in_guess = 1 - elif grid_meter is None and genset_meter is not None: - ac_in_guess = 2 - - consumption = { "L1" : None, "L2" : None, "L3" : None } - currentconsumption = { "L1" : None, "L2" : None, "L3" : None } - for device_type, em, _types in (('Grid', grid_meter, (1, 3)), ('Genset', genset_meter, (2,))): - # If a grid meter is present we use values from it. If not, we look at the multi. If it has - # AcIn1 or AcIn2 connected to the grid, we use those values. - # com.victronenergy.grid.??? indicates presence of an energy meter used as grid meter. - # com.victronenergy.vebus.???/Ac/ActiveIn/ActiveInput: decides which whether we look at AcIn1 - # or AcIn2 as possible grid connection. - uses_active_input = ac_in_source in _types - for phase in consumption: - p = None - mc = None - pvpower = newvalues.get('/Ac/PvOn%s/%s/Power' % (device_type, phase)) - pvcurrent = newvalues.get('/Ac/PvOn%s/%s/Current' % (device_type, phase)) - if em is not None: - p = self._dbusmonitor.get_value(em.service, '/Ac/%s/Power' % phase) - mc = self._dbusmonitor.get_value(em.service, '/Ac/%s/Current' % phase) - # Compute consumption between energy meter and multi (meter power - multi AC in) and - # add an optional PV inverter on input to the mix. - c = None - cc = None - if uses_active_input: - if multi_path is not None: - try: - c = _safeadd(c, -self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/P' % phase)) - cc = _safeadd(cc, -self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/I' % phase)) - except TypeError: - pass - elif non_vebus_inverter is not None and active_input in (0, 1): - try: - c = _safeadd(c, -self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/P' % (active_input+1, phase))) - cc = _safeadd(cc, -self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/I' % (active_input+1, phase))) - except TypeError: - pass - - # If there's any power coming from a PV inverter in the inactive AC in (which is unlikely), - # it will still be used, because there may also be a load in the same ACIn consuming - # power, or the power could be fed back to the net. - c = _safeadd(c, p, pvpower) - cc = _safeadd(cc, mc, pvcurrent) - consumption[phase] = _safeadd(consumption[phase], _safemax(0, c)) - currentconsumption[phase] = _safeadd(currentconsumption[phase], _safemax(0, cc)) - else: - if uses_active_input: - if multi_path is not None and ( - p := self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/P' % phase)) is not None: - consumption[phase] = _safeadd(0, consumption[phase]) - currentconsumption[phase] = _safeadd(0, currentconsumption[phase]) - mc = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/I' % phase) - elif non_vebus_inverter is not None and active_input in (0, 1): - p = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/P' % (active_input + 1, phase)) - mc = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/I' % (active_input + 1, phase)) - if p is not None: - consumption[phase] = _safeadd(0, consumption[phase]) - currentconsumption[phase] = _safeadd(0, currentconsumption[phase]) - - # No relevant energy meter present. Assume there is no load between the grid and the multi. - # There may be a PV inverter present though (Hub-3 setup). - try: - p = _safeadd(p, -pvpower) - mc = _safeadd(mc, -pvcurrent) - except TypeError: - pass - - newvalues['/Ac/%s/%s/Power' % (device_type, phase)] = p - newvalues['/Ac/%s/%s/Current' % (device_type, phase)] = mc - if ac_in_guess in _types: - newvalues['/Ac/ActiveIn/%s/Power' % (phase,)] = p - newvalues['/Ac/ActiveIn/%s/Current' % (phase,)] = mc - - self._compute_number_of_phases('/Ac/%s' % device_type, newvalues) - self._compute_number_of_phases('/Ac/ActiveIn', newvalues) - - product_id = None - device_type_id = None - if em is not None: - product_id = em.product_id - device_type_id = em.device_type - if product_id is None and uses_active_input: - if multi_path is not None: - product_id = self._dbusmonitor.get_value(multi_path, '/ProductId') - elif non_vebus_inverter is not None: - product_id = self._dbusmonitor.get_value(non_vebus_inverter, '/ProductId') - newvalues['/Ac/%s/ProductId' % device_type] = product_id - newvalues['/Ac/%s/DeviceType' % device_type] = device_type_id - - # If we have an ESS system and RunWithoutGridMeter is set, there cannot be load on the AC-In, so it - # must be on AC-Out. Hence we do calculate AC-Out consumption even if 'useacout' is disabled. - # Similarly all load are by definition on the output if this is not an ESS system. - use_ac_out = \ - self._settings['useacout'] == 1 or \ - (multi_path is not None and self._dbusmonitor.get_value(multi_path, '/Hub4/AssistantId') not in (4, 5)) or \ - self._dbusmonitor.get_value('com.victronenergy.settings', '/Settings/CGwacs/RunWithoutGridMeter') == 1 - for phase in consumption: - c = None - a = None - if use_ac_out: - c = newvalues.get('/Ac/PvOnOutput/%s/Power' % phase) - a = newvalues.get('/Ac/PvOnOutput/%s/Current' % phase) - if multi_path is None: - for inv in non_vebus_inverters: - ac_out = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/P' % phase) - i = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/I' % phase) - - # Some models don't show power, try apparent power, - # else calculate it - if ac_out is None: - ac_out = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/S' % phase) - if ac_out is None: - u = self._dbusmonitor.get_value(inv, '/Ac/Out/%s/V' % phase) - if None not in (i, u): - ac_out = i * u - c = _safeadd(c, ac_out) - a = _safeadd(a, i) - else: - ac_out = self._dbusmonitor.get_value(multi_path, '/Ac/Out/%s/P' % phase) - c = _safeadd(c, ac_out) - i_out = self._dbusmonitor.get_value(multi_path, '/Ac/Out/%s/I' % phase) - a = _safeadd(a, i_out) - c = _safemax(0, c) - a = _safemax(0, a) - newvalues['/Ac/ConsumptionOnOutput/%s/Power' % phase] = c - newvalues['/Ac/ConsumptionOnOutput/%s/Current' % phase] = a - newvalues['/Ac/ConsumptionOnInput/%s/Power' % phase] = consumption[phase] - newvalues['/Ac/ConsumptionOnInput/%s/Current' % phase] = currentconsumption[phase] - newvalues['/Ac/Consumption/%s/Power' % phase] = _safeadd(consumption[phase], c) - newvalues['/Ac/Consumption/%s/Current' % phase] = _safeadd(currentconsumption[phase], a) - self._compute_number_of_phases('/Ac/Consumption', newvalues) - self._compute_number_of_phases('/Ac/ConsumptionOnOutput', newvalues) - self._compute_number_of_phases('/Ac/ConsumptionOnInput', newvalues) - - for m in self._modules: - m.update_values(newvalues) - - # ==== UPDATE DBUS ITEMS ==== - with self._dbusservice as sss: - for path in self._summeditems.keys(): - # Why the None? Because we want to invalidate things we don't have anymore. - sss[path] = newvalues.get(path, None) - - def _handleservicechange(self): - # Update the available battery monitor services, used to populate the dropdown in the settings. - # Below code makes a dictionary. The key is [dbuserviceclass]/[deviceinstance]. For example - # "battery/245". The value is the name to show to the user in the dropdown. The full dbus- - # servicename, ie 'com.victronenergy.vebus.ttyO1' is not used, since the last part of that is not - # fixed. dbus-serviceclass name and the device instance are already fixed, so best to use those. - - services = self._get_connected_service_list('com.victronenergy.vebus') - services.update(self._get_connected_service_list('com.victronenergy.battery')) - services.update({k: v for k, v in self._get_connected_service_list( - 'com.victronenergy.multi').items() if self._dbusmonitor.get_value(k, '/Soc') is not None}) - services.update({k: v for k, v in self._get_connected_service_list( - 'com.victronenergy.inverter').items() if self._dbusmonitor.get_value(k, '/Soc') is not None}) - - ul = {self.BATSERVICE_DEFAULT: 'Automatic', self.BATSERVICE_NOBATTERY: 'No battery monitor'} - for servicename, instance in services.items(): - key = self._get_instance_service_name(servicename, instance) - ul[key] = self._get_readable_service_name(servicename) - self._dbusservice['/AvailableBatteryServices'] = json.dumps(ul) - - ul = {self.BATSERVICE_DEFAULT: 'Automatic', self.BATSERVICE_NOBATTERY: 'No battery monitor'} - # For later: for device supporting multiple Dc measurement we should add entries for /Dc/1 etc as - # well. - for servicename, instance in services.items(): - key = self._get_instance_service_name(servicename, instance).replace('.', '_').replace('/', '_') + '/Dc/0' - ul[key] = self._get_readable_service_name(servicename) - self._dbusservice['/AvailableBatteryMeasurements'] = ul - - self._determinebatteryservice() - - self._changed = True - - def _get_readable_service_name(self, servicename): - return '%s on %s' % ( - self._dbusmonitor.get_value(servicename, '/ProductName'), - self._dbusmonitor.get_value(servicename, '/Mgmt/Connection')) - - def _get_instance_service_name(self, service, instance): - return '%s/%s' % ('.'.join(service.split('.')[0:3]), instance) - - def _remove_unconnected_services(self, services): - # Workaround: because com.victronenergy.vebus is available even when there is no vebus product - # connected, remove any service that is not connected. Previously we used - # /State since mandatory path /Connected is not implemented in mk2dbus, - # but this has since been resolved. - for servicename in list(services.keys()): - if (self._dbusmonitor.get_value(servicename, '/Connected') != 1 - or self._dbusmonitor.get_value(servicename, '/ProductName') is None - or self._dbusmonitor.get_value(servicename, '/Mgmt/Connection') is None): - del services[servicename] - - def _dbus_value_changed(self, dbusServiceName, dbusPath, dict, changes, deviceInstance): - self._changed = True - - # Workaround because com.victronenergy.vebus is available even when there is no vebus product - # connected. - if (dbusPath in ['/Connected', '/ProductName', '/Mgmt/Connection'] or - (dbusPath == '/State' and dbusServiceName.split('.')[0:3] == ['com', 'victronenergy', 'vebus'])): - self._handleservicechange() - - # Track the timezone changes - if dbusPath == '/Settings/System/TimeZone': - tz = changes.get('Value') - if tz is not None: - os.environ['TZ'] = tz - time.tzset() - - def _device_added(self, service, instance, do_service_change=True): - if do_service_change: - self._handleservicechange() - - for m in self._modules: - m.device_added(service, instance, do_service_change) - - def _device_removed(self, service, instance): - self._handleservicechange() - - for m in self._modules: - m.device_removed(service, instance) - - def _gettext(self, path, value): - if path == '/Dc/Battery/State': - state = {self.STATE_IDLE: 'Idle', self.STATE_CHARGING: 'Charging', - self.STATE_DISCHARGING: 'Discharging'} - return state[value] - item = self._summeditems.get(path) - if item is not None: - return item['gettext'] % value - return str(value) - - def _compute_number_of_phases(self, path, newvalues): - number_of_phases = None - for phase in range(1, 4): - p = newvalues.get('%s/L%s/Power' % (path, phase)) - if p is not None: - number_of_phases = phase - newvalues[path + '/NumberOfPhases'] = number_of_phases - - def _get_connected_service_list(self, classfilter=None): - services = self._dbusmonitor.get_service_list(classfilter=classfilter) - self._remove_unconnected_services(services) - return services - - # returns a servicename string - def _get_first_connected_service(self, classfilter): - services = self._get_connected_service_list(classfilter=classfilter) - if len(services) == 0: - return None - return next(iter(services.items()), (None,))[0] - - # returns a tuple (servicename, instance) - def _get_service_having_lowest_instance(self, classfilter=None): - services = self._get_connected_service_list(classfilter=classfilter) - if len(services) == 0: - return None - - # sort the dict by value; returns list of tuples: (value, key) - s = sorted((value, key) for (key, value) in services.items()) - return (s[0][1], s[0][0]) - - -class DbusSystemCalc(SystemCalc): - def _create_dbus_monitor(self, *args, **kwargs): - return DbusMonitor(*args, **kwargs) - - def _create_settings(self, *args, **kwargs): - bus = dbus.SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else dbus.SystemBus() - return SettingsDevice(bus, *args, timeout=10, **kwargs) - - def _create_dbus_service(self): - venusversion, venusbuildtime = self._get_venus_versioninfo() - - dbusservice = VeDbusService('com.victronenergy.system') - dbusservice.add_mandatory_paths( - processname=__file__, - processversion=softwareVersion, - connection='data from other dbus processes', - deviceinstance=0, - productid=None, - productname=None, - firmwareversion=venusversion, - hardwareversion=None, - connected=1) - dbusservice.add_path('/FirmwareBuild', value=venusbuildtime) - return dbusservice - - def _get_venus_versioninfo(self): - try: - with open("/opt/victronenergy/version", "r") as fp: - version, software, buildtime = fp.read().split('\n')[:3] - major, minor, _, rev = re.compile('v([0-9]*)\.([0-9]*)(~([0-9]*))?').match(version).groups() - return (int(major, 16)<<16)+(int(minor, 16)<<8)+(0 if rev is None else int(rev, 16)), buildtime - except Exception: - pass - return 0, '0' - -if __name__ == "__main__": - # Argument parsing - parser = argparse.ArgumentParser( - description='Converts readings from AC-Sensors connected to a VE.Bus device in a pvinverter ' + - 'D-Bus service.' - ) - - parser.add_argument("-d", "--debug", help="set logging level to debug", - action="store_true") - - args = parser.parse_args() - - print("-------- dbus_systemcalc, v" + softwareVersion + " is starting up --------") - logger = setup_logging(args.debug) - - # Have a mainloop, so we can send/receive asynchronous calls to and from dbus - DBusGMainLoop(set_as_default=True) - - systemcalc = DbusSystemCalc() - - # Start and run the mainloop - logger.info("Starting mainloop, responding only on events") - mainloop = GLib.MainLoop() - mainloop.run() diff --git a/FileSets/v3.20~2/main.qml b/FileSets/v3.20~2/main.qml deleted file mode 120000 index 9eeec781..00000000 --- a/FileSets/v3.20~2/main.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.10/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~2/startstop.py b/FileSets/v3.20~2/startstop.py deleted file mode 120000 index e3bcc3b5..00000000 --- a/FileSets/v3.20~2/startstop.py +++ /dev/null @@ -1 +0,0 @@ -../v3.10/startstop.py \ No newline at end of file diff --git a/FileSets/v3.20~2/styles.css b/FileSets/v3.20~2/styles.css deleted file mode 120000 index 4af38df2..00000000 --- a/FileSets/v3.20~2/styles.css +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~26/Battery.qml b/FileSets/v3.20~26/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.20~26/Battery.qml +++ b/FileSets/v3.20~26/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/DetailAcInput.qml b/FileSets/v3.20~26/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.20~26/DetailAcInput.qml +++ b/FileSets/v3.20~26/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/DetailInverter.qml b/FileSets/v3.20~26/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.20~26/DetailInverter.qml +++ b/FileSets/v3.20~26/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/DetailLoadsCombined.qml b/FileSets/v3.20~26/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.20~26/DetailLoadsCombined.qml +++ b/FileSets/v3.20~26/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/DetailLoadsOnInput.qml b/FileSets/v3.20~26/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.20~26/DetailLoadsOnInput.qml +++ b/FileSets/v3.20~26/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/DetailLoadsOnOutput.qml b/FileSets/v3.20~26/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.20~26/DetailLoadsOnOutput.qml +++ b/FileSets/v3.20~26/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/HubData.qml b/FileSets/v3.20~26/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.20~26/HubData.qml +++ b/FileSets/v3.20~26/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/MbEditBox.qml b/FileSets/v3.20~26/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.20~26/MbEditBox.qml +++ b/FileSets/v3.20~26/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/MbEditBoxDateTime.qml b/FileSets/v3.20~26/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.20~26/MbEditBoxDateTime.qml +++ b/FileSets/v3.20~26/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/MbItem.qml b/FileSets/v3.20~26/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.20~26/MbItem.qml +++ b/FileSets/v3.20~26/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/MbItemDigitalInput.qml b/FileSets/v3.20~26/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.20~26/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/MbSpinBox.qml b/FileSets/v3.20~26/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.20~26/MbSpinBox.qml +++ b/FileSets/v3.20~26/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/MbStyle.qml b/FileSets/v3.20~26/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.20~26/MbStyle.qml +++ b/FileSets/v3.20~26/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/MbSubMenu.qml b/FileSets/v3.20~26/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.20~26/MbSubMenu.qml +++ b/FileSets/v3.20~26/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/Multi.qml b/FileSets/v3.20~26/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.20~26/Multi.qml +++ b/FileSets/v3.20~26/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/ObjectAcConnection.qml b/FileSets/v3.20~26/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.20~26/ObjectAcConnection.qml +++ b/FileSets/v3.20~26/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~26/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.20~26/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.20~26/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewBox.qml b/FileSets/v3.20~26/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.20~26/OverviewBox.qml +++ b/FileSets/v3.20~26/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewConnection.qml b/FileSets/v3.20~26/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.20~26/OverviewConnection.qml +++ b/FileSets/v3.20~26/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewConnectionEnd.qml b/FileSets/v3.20~26/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.20~26/OverviewConnectionEnd.qml +++ b/FileSets/v3.20~26/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewFlowComplex.qml b/FileSets/v3.20~26/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.20~26/OverviewFlowComplex.qml +++ b/FileSets/v3.20~26/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~26/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.20~26/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.20~26/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~26/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.20~26/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.20~26/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewGridParallel.qml b/FileSets/v3.20~26/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.20~26/OverviewGridParallel.qml +++ b/FileSets/v3.20~26/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewHub.qml b/FileSets/v3.20~26/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.20~26/OverviewHub.qml +++ b/FileSets/v3.20~26/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewHubEnhanced.qml b/FileSets/v3.20~26/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.20~26/OverviewHubEnhanced.qml +++ b/FileSets/v3.20~26/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewMobileEnhanced.qml b/FileSets/v3.20~26/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.20~26/OverviewMobileEnhanced.qml +++ b/FileSets/v3.20~26/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewSolarCharger.qml b/FileSets/v3.20~26/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.20~26/OverviewSolarCharger.qml +++ b/FileSets/v3.20~26/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewSolarInverter.qml b/FileSets/v3.20~26/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.20~26/OverviewSolarInverter.qml +++ b/FileSets/v3.20~26/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewTankDelegate.qml b/FileSets/v3.20~26/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.20~26/OverviewTankDelegate.qml +++ b/FileSets/v3.20~26/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewTanks.qml b/FileSets/v3.20~26/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.20~26/OverviewTanks.qml +++ b/FileSets/v3.20~26/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~26/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.20~26/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.20~26/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/PageDigitalInput.qml b/FileSets/v3.20~26/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.20~26/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/PageGenerator.qml b/FileSets/v3.20~26/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.20~26/PageGenerator.qml +++ b/FileSets/v3.20~26/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/PageSettingsDisplay.qml b/FileSets/v3.20~26/PageSettingsDisplay.qml index 809804c4..a7f4a2c4 120000 --- a/FileSets/v3.20~26/PageSettingsDisplay.qml +++ b/FileSets/v3.20~26/PageSettingsDisplay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsDisplay.qml \ No newline at end of file +../v3.30~1/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/PageSettingsGenerator.qml b/FileSets/v3.20~26/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.20~26/PageSettingsGenerator.qml +++ b/FileSets/v3.20~26/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/PageSettingsRelay.qml b/FileSets/v3.20~26/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.20~26/PageSettingsRelay.qml +++ b/FileSets/v3.20~26/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/PowerGauge.qml b/FileSets/v3.20~26/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.20~26/PowerGauge.qml +++ b/FileSets/v3.20~26/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/Tile.qml b/FileSets/v3.20~26/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.20~26/Tile.qml +++ b/FileSets/v3.20~26/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/TileDigIn.qml b/FileSets/v3.20~26/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.20~26/TileDigIn.qml +++ b/FileSets/v3.20~26/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/TileRelay.qml b/FileSets/v3.20~26/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.20~26/TileRelay.qml +++ b/FileSets/v3.20~26/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/TileText.qml b/FileSets/v3.20~26/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.20~26/TileText.qml +++ b/FileSets/v3.20~26/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/attributes.csv b/FileSets/v3.20~26/attributes.csv new file mode 120000 index 00000000..c6ffacd5 --- /dev/null +++ b/FileSets/v3.20~26/attributes.csv @@ -0,0 +1 @@ +../v3.20~33/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.20~26/dbus_digitalinputs.py b/FileSets/v3.20~26/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.20~26/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.20~26/dbus_generator.py b/FileSets/v3.20~26/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.20~26/dbus_generator.py +++ b/FileSets/v3.20~26/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~26/main.qml b/FileSets/v3.20~26/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.20~26/main.qml +++ b/FileSets/v3.20~26/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~26/styles.css b/FileSets/v3.20~26/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.20~26/styles.css +++ b/FileSets/v3.20~26/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~29/Battery.qml b/FileSets/v3.20~29/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.20~29/Battery.qml +++ b/FileSets/v3.20~29/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/DetailAcInput.qml b/FileSets/v3.20~29/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.20~29/DetailAcInput.qml +++ b/FileSets/v3.20~29/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/DetailInverter.qml b/FileSets/v3.20~29/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.20~29/DetailInverter.qml +++ b/FileSets/v3.20~29/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/DetailLoadsCombined.qml b/FileSets/v3.20~29/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.20~29/DetailLoadsCombined.qml +++ b/FileSets/v3.20~29/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/DetailLoadsOnInput.qml b/FileSets/v3.20~29/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.20~29/DetailLoadsOnInput.qml +++ b/FileSets/v3.20~29/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/DetailLoadsOnOutput.qml b/FileSets/v3.20~29/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.20~29/DetailLoadsOnOutput.qml +++ b/FileSets/v3.20~29/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/HubData.qml b/FileSets/v3.20~29/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.20~29/HubData.qml +++ b/FileSets/v3.20~29/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/MbEditBox.qml b/FileSets/v3.20~29/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.20~29/MbEditBox.qml +++ b/FileSets/v3.20~29/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/MbEditBoxDateTime.qml b/FileSets/v3.20~29/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.20~29/MbEditBoxDateTime.qml +++ b/FileSets/v3.20~29/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/MbItem.qml b/FileSets/v3.20~29/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.20~29/MbItem.qml +++ b/FileSets/v3.20~29/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/MbItemDigitalInput.qml b/FileSets/v3.20~29/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.20~29/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/MbSpinBox.qml b/FileSets/v3.20~29/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.20~29/MbSpinBox.qml +++ b/FileSets/v3.20~29/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/MbStyle.qml b/FileSets/v3.20~29/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.20~29/MbStyle.qml +++ b/FileSets/v3.20~29/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/MbSubMenu.qml b/FileSets/v3.20~29/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.20~29/MbSubMenu.qml +++ b/FileSets/v3.20~29/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/Multi.qml b/FileSets/v3.20~29/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.20~29/Multi.qml +++ b/FileSets/v3.20~29/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/ObjectAcConnection.qml b/FileSets/v3.20~29/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.20~29/ObjectAcConnection.qml +++ b/FileSets/v3.20~29/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~29/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.20~29/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.20~29/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewBox.qml b/FileSets/v3.20~29/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.20~29/OverviewBox.qml +++ b/FileSets/v3.20~29/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewConnection.qml b/FileSets/v3.20~29/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.20~29/OverviewConnection.qml +++ b/FileSets/v3.20~29/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewConnectionEnd.qml b/FileSets/v3.20~29/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.20~29/OverviewConnectionEnd.qml +++ b/FileSets/v3.20~29/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewFlowComplex.qml b/FileSets/v3.20~29/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.20~29/OverviewFlowComplex.qml +++ b/FileSets/v3.20~29/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~29/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.20~29/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.20~29/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~29/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.20~29/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.20~29/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewGridParallel.qml b/FileSets/v3.20~29/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.20~29/OverviewGridParallel.qml +++ b/FileSets/v3.20~29/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewHub.qml b/FileSets/v3.20~29/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.20~29/OverviewHub.qml +++ b/FileSets/v3.20~29/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewHubEnhanced.qml b/FileSets/v3.20~29/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.20~29/OverviewHubEnhanced.qml +++ b/FileSets/v3.20~29/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewMobileEnhanced.qml b/FileSets/v3.20~29/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.20~29/OverviewMobileEnhanced.qml +++ b/FileSets/v3.20~29/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewSolarCharger.qml b/FileSets/v3.20~29/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.20~29/OverviewSolarCharger.qml +++ b/FileSets/v3.20~29/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewSolarInverter.qml b/FileSets/v3.20~29/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.20~29/OverviewSolarInverter.qml +++ b/FileSets/v3.20~29/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewTankDelegate.qml b/FileSets/v3.20~29/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.20~29/OverviewTankDelegate.qml +++ b/FileSets/v3.20~29/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewTanks.qml b/FileSets/v3.20~29/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.20~29/OverviewTanks.qml +++ b/FileSets/v3.20~29/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~29/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.20~29/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.20~29/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/PageDigitalInput.qml b/FileSets/v3.20~29/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.20~29/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/PageGenerator.qml b/FileSets/v3.20~29/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.20~29/PageGenerator.qml +++ b/FileSets/v3.20~29/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/PageSettingsDisplay.qml b/FileSets/v3.20~29/PageSettingsDisplay.qml index 809804c4..a7f4a2c4 120000 --- a/FileSets/v3.20~29/PageSettingsDisplay.qml +++ b/FileSets/v3.20~29/PageSettingsDisplay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsDisplay.qml \ No newline at end of file +../v3.30~1/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/PageSettingsGenerator.qml b/FileSets/v3.20~29/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.20~29/PageSettingsGenerator.qml +++ b/FileSets/v3.20~29/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/PageSettingsRelay.qml b/FileSets/v3.20~29/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.20~29/PageSettingsRelay.qml +++ b/FileSets/v3.20~29/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/PowerGauge.qml b/FileSets/v3.20~29/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.20~29/PowerGauge.qml +++ b/FileSets/v3.20~29/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/Tile.qml b/FileSets/v3.20~29/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.20~29/Tile.qml +++ b/FileSets/v3.20~29/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/TileDigIn.qml b/FileSets/v3.20~29/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.20~29/TileDigIn.qml +++ b/FileSets/v3.20~29/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/TileRelay.qml b/FileSets/v3.20~29/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.20~29/TileRelay.qml +++ b/FileSets/v3.20~29/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/TileText.qml b/FileSets/v3.20~29/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.20~29/TileText.qml +++ b/FileSets/v3.20~29/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/attributes.csv b/FileSets/v3.20~29/attributes.csv new file mode 120000 index 00000000..c6ffacd5 --- /dev/null +++ b/FileSets/v3.20~29/attributes.csv @@ -0,0 +1 @@ +../v3.20~33/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.20~29/dbus_digitalinputs.py b/FileSets/v3.20~29/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.20~29/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.20~29/dbus_generator.py b/FileSets/v3.20~29/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.20~29/dbus_generator.py +++ b/FileSets/v3.20~29/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~29/main.qml b/FileSets/v3.20~29/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.20~29/main.qml +++ b/FileSets/v3.20~29/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~29/styles.css b/FileSets/v3.20~29/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.20~29/styles.css +++ b/FileSets/v3.20~29/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~30/Battery.qml b/FileSets/v3.20~30/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.20~30/Battery.qml +++ b/FileSets/v3.20~30/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/DetailAcInput.qml b/FileSets/v3.20~30/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.20~30/DetailAcInput.qml +++ b/FileSets/v3.20~30/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/DetailInverter.qml b/FileSets/v3.20~30/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.20~30/DetailInverter.qml +++ b/FileSets/v3.20~30/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/DetailLoadsCombined.qml b/FileSets/v3.20~30/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.20~30/DetailLoadsCombined.qml +++ b/FileSets/v3.20~30/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/DetailLoadsOnInput.qml b/FileSets/v3.20~30/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.20~30/DetailLoadsOnInput.qml +++ b/FileSets/v3.20~30/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/DetailLoadsOnOutput.qml b/FileSets/v3.20~30/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.20~30/DetailLoadsOnOutput.qml +++ b/FileSets/v3.20~30/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/HubData.qml b/FileSets/v3.20~30/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.20~30/HubData.qml +++ b/FileSets/v3.20~30/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/MbEditBox.qml b/FileSets/v3.20~30/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.20~30/MbEditBox.qml +++ b/FileSets/v3.20~30/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/MbEditBoxDateTime.qml b/FileSets/v3.20~30/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.20~30/MbEditBoxDateTime.qml +++ b/FileSets/v3.20~30/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/MbItem.qml b/FileSets/v3.20~30/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.20~30/MbItem.qml +++ b/FileSets/v3.20~30/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/MbItemDigitalInput.qml b/FileSets/v3.20~30/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.20~30/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/MbSpinBox.qml b/FileSets/v3.20~30/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.20~30/MbSpinBox.qml +++ b/FileSets/v3.20~30/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/MbStyle.qml b/FileSets/v3.20~30/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.20~30/MbStyle.qml +++ b/FileSets/v3.20~30/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/MbSubMenu.qml b/FileSets/v3.20~30/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.20~30/MbSubMenu.qml +++ b/FileSets/v3.20~30/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/Multi.qml b/FileSets/v3.20~30/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.20~30/Multi.qml +++ b/FileSets/v3.20~30/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/ObjectAcConnection.qml b/FileSets/v3.20~30/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.20~30/ObjectAcConnection.qml +++ b/FileSets/v3.20~30/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~30/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.20~30/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.20~30/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewBox.qml b/FileSets/v3.20~30/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.20~30/OverviewBox.qml +++ b/FileSets/v3.20~30/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewConnection.qml b/FileSets/v3.20~30/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.20~30/OverviewConnection.qml +++ b/FileSets/v3.20~30/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewConnectionEnd.qml b/FileSets/v3.20~30/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.20~30/OverviewConnectionEnd.qml +++ b/FileSets/v3.20~30/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewFlowComplex.qml b/FileSets/v3.20~30/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.20~30/OverviewFlowComplex.qml +++ b/FileSets/v3.20~30/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~30/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.20~30/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.20~30/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~30/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.20~30/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.20~30/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewGridParallel.qml b/FileSets/v3.20~30/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.20~30/OverviewGridParallel.qml +++ b/FileSets/v3.20~30/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewHub.qml b/FileSets/v3.20~30/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.20~30/OverviewHub.qml +++ b/FileSets/v3.20~30/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewHubEnhanced.qml b/FileSets/v3.20~30/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.20~30/OverviewHubEnhanced.qml +++ b/FileSets/v3.20~30/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewMobileEnhanced.qml b/FileSets/v3.20~30/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.20~30/OverviewMobileEnhanced.qml +++ b/FileSets/v3.20~30/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewSolarCharger.qml b/FileSets/v3.20~30/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.20~30/OverviewSolarCharger.qml +++ b/FileSets/v3.20~30/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewSolarInverter.qml b/FileSets/v3.20~30/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.20~30/OverviewSolarInverter.qml +++ b/FileSets/v3.20~30/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewTankDelegate.qml b/FileSets/v3.20~30/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.20~30/OverviewTankDelegate.qml +++ b/FileSets/v3.20~30/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewTanks.qml b/FileSets/v3.20~30/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.20~30/OverviewTanks.qml +++ b/FileSets/v3.20~30/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~30/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.20~30/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.20~30/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/PageDigitalInput.qml b/FileSets/v3.20~30/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.20~30/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/PageGenerator.qml b/FileSets/v3.20~30/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.20~30/PageGenerator.qml +++ b/FileSets/v3.20~30/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/PageSettingsDisplay.qml b/FileSets/v3.20~30/PageSettingsDisplay.qml index 809804c4..a7f4a2c4 120000 --- a/FileSets/v3.20~30/PageSettingsDisplay.qml +++ b/FileSets/v3.20~30/PageSettingsDisplay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsDisplay.qml \ No newline at end of file +../v3.30~1/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/PageSettingsGenerator.qml b/FileSets/v3.20~30/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.20~30/PageSettingsGenerator.qml +++ b/FileSets/v3.20~30/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/PageSettingsRelay.qml b/FileSets/v3.20~30/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.20~30/PageSettingsRelay.qml +++ b/FileSets/v3.20~30/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/PowerGauge.qml b/FileSets/v3.20~30/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.20~30/PowerGauge.qml +++ b/FileSets/v3.20~30/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/Tile.qml b/FileSets/v3.20~30/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.20~30/Tile.qml +++ b/FileSets/v3.20~30/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/TileDigIn.qml b/FileSets/v3.20~30/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.20~30/TileDigIn.qml +++ b/FileSets/v3.20~30/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/TileRelay.qml b/FileSets/v3.20~30/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.20~30/TileRelay.qml +++ b/FileSets/v3.20~30/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/TileText.qml b/FileSets/v3.20~30/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.20~30/TileText.qml +++ b/FileSets/v3.20~30/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/attributes.csv b/FileSets/v3.20~30/attributes.csv new file mode 120000 index 00000000..c6ffacd5 --- /dev/null +++ b/FileSets/v3.20~30/attributes.csv @@ -0,0 +1 @@ +../v3.20~33/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.20~30/dbus_digitalinputs.py b/FileSets/v3.20~30/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.20~30/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.20~30/dbus_generator.py b/FileSets/v3.20~30/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.20~30/dbus_generator.py +++ b/FileSets/v3.20~30/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~30/main.qml b/FileSets/v3.20~30/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.20~30/main.qml +++ b/FileSets/v3.20~30/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~30/styles.css b/FileSets/v3.20~30/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.20~30/styles.css +++ b/FileSets/v3.20~30/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~33/Battery.qml b/FileSets/v3.20~33/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.20~33/Battery.qml +++ b/FileSets/v3.20~33/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/DetailAcInput.qml b/FileSets/v3.20~33/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.20~33/DetailAcInput.qml +++ b/FileSets/v3.20~33/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/DetailInverter.qml b/FileSets/v3.20~33/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.20~33/DetailInverter.qml +++ b/FileSets/v3.20~33/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/DetailLoadsCombined.qml b/FileSets/v3.20~33/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.20~33/DetailLoadsCombined.qml +++ b/FileSets/v3.20~33/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/DetailLoadsOnInput.qml b/FileSets/v3.20~33/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.20~33/DetailLoadsOnInput.qml +++ b/FileSets/v3.20~33/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/DetailLoadsOnOutput.qml b/FileSets/v3.20~33/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.20~33/DetailLoadsOnOutput.qml +++ b/FileSets/v3.20~33/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/HubData.qml b/FileSets/v3.20~33/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.20~33/HubData.qml +++ b/FileSets/v3.20~33/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/MbEditBox.qml b/FileSets/v3.20~33/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.20~33/MbEditBox.qml +++ b/FileSets/v3.20~33/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/MbEditBoxDateTime.qml b/FileSets/v3.20~33/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.20~33/MbEditBoxDateTime.qml +++ b/FileSets/v3.20~33/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/MbItem.qml b/FileSets/v3.20~33/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.20~33/MbItem.qml +++ b/FileSets/v3.20~33/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/MbItemDigitalInput.qml b/FileSets/v3.20~33/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.20~33/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/MbSpinBox.qml b/FileSets/v3.20~33/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.20~33/MbSpinBox.qml +++ b/FileSets/v3.20~33/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/MbStyle.qml b/FileSets/v3.20~33/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.20~33/MbStyle.qml +++ b/FileSets/v3.20~33/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/MbSubMenu.qml b/FileSets/v3.20~33/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.20~33/MbSubMenu.qml +++ b/FileSets/v3.20~33/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/Multi.qml b/FileSets/v3.20~33/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.20~33/Multi.qml +++ b/FileSets/v3.20~33/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/ObjectAcConnection.qml b/FileSets/v3.20~33/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.20~33/ObjectAcConnection.qml +++ b/FileSets/v3.20~33/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~33/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.20~33/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.20~33/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewBox.qml b/FileSets/v3.20~33/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.20~33/OverviewBox.qml +++ b/FileSets/v3.20~33/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewConnection.qml b/FileSets/v3.20~33/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.20~33/OverviewConnection.qml +++ b/FileSets/v3.20~33/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewConnectionEnd.qml b/FileSets/v3.20~33/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.20~33/OverviewConnectionEnd.qml +++ b/FileSets/v3.20~33/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewFlowComplex.qml b/FileSets/v3.20~33/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.20~33/OverviewFlowComplex.qml +++ b/FileSets/v3.20~33/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~33/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.20~33/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.20~33/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~33/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.20~33/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.20~33/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewGridParallel.qml b/FileSets/v3.20~33/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.20~33/OverviewGridParallel.qml +++ b/FileSets/v3.20~33/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewHub.qml b/FileSets/v3.20~33/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.20~33/OverviewHub.qml +++ b/FileSets/v3.20~33/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewHubEnhanced.qml b/FileSets/v3.20~33/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.20~33/OverviewHubEnhanced.qml +++ b/FileSets/v3.20~33/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewMobileEnhanced.qml b/FileSets/v3.20~33/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.20~33/OverviewMobileEnhanced.qml +++ b/FileSets/v3.20~33/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewSolarCharger.qml b/FileSets/v3.20~33/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.20~33/OverviewSolarCharger.qml +++ b/FileSets/v3.20~33/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewSolarInverter.qml b/FileSets/v3.20~33/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.20~33/OverviewSolarInverter.qml +++ b/FileSets/v3.20~33/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewTankDelegate.qml b/FileSets/v3.20~33/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.20~33/OverviewTankDelegate.qml +++ b/FileSets/v3.20~33/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewTanks.qml b/FileSets/v3.20~33/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.20~33/OverviewTanks.qml +++ b/FileSets/v3.20~33/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~33/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.20~33/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.20~33/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/PageDigitalInput.qml b/FileSets/v3.20~33/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.20~33/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/PageGenerator.qml b/FileSets/v3.20~33/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.20~33/PageGenerator.qml +++ b/FileSets/v3.20~33/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/PageSettingsDisplay.qml b/FileSets/v3.20~33/PageSettingsDisplay.qml index 809804c4..a7f4a2c4 120000 --- a/FileSets/v3.20~33/PageSettingsDisplay.qml +++ b/FileSets/v3.20~33/PageSettingsDisplay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsDisplay.qml \ No newline at end of file +../v3.30~1/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/PageSettingsGenerator.qml b/FileSets/v3.20~33/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.20~33/PageSettingsGenerator.qml +++ b/FileSets/v3.20~33/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/PageSettingsRelay.qml b/FileSets/v3.20~33/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.20~33/PageSettingsRelay.qml +++ b/FileSets/v3.20~33/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/PowerGauge.qml b/FileSets/v3.20~33/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.20~33/PowerGauge.qml +++ b/FileSets/v3.20~33/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/Tile.qml b/FileSets/v3.20~33/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.20~33/Tile.qml +++ b/FileSets/v3.20~33/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/TileDigIn.qml b/FileSets/v3.20~33/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.20~33/TileDigIn.qml +++ b/FileSets/v3.20~33/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/TileRelay.qml b/FileSets/v3.20~33/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.20~33/TileRelay.qml +++ b/FileSets/v3.20~33/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/TileText.qml b/FileSets/v3.20~33/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.20~33/TileText.qml +++ b/FileSets/v3.20~33/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/attributes.csv b/FileSets/v3.20~33/attributes.csv new file mode 100644 index 00000000..6bffb25b --- /dev/null +++ b/FileSets/v3.20~33/attributes.csv @@ -0,0 +1,668 @@ +com.victronenergy.gps,/Position/Latitude,d,Decimal degrees,2800,int32,10000000,R +com.victronenergy.gps,/Position/Longitude,d,Decimal degrees,2802,int32,10000000,R +com.victronenergy.gps,/Course,d,Degrees,2804,uint16,100,R +com.victronenergy.gps,/Speed,d,m/s,2805,uint16,100,R +com.victronenergy.gps,/Fix,y,,2806,uint16,1,R +com.victronenergy.gps,/NrOfSatellites,y,,2807,uint16,1,R +com.victronenergy.gps,/Altitude,d,m,2808,int32,10,R +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/State,i,0=BL disabled;1=Restarting;2=Self-consumption;3=Self-consumption;4=Self-consumption;5=Discharge disabled;6=Force charge;7=Sustain;9=Keep batteries charged;10=BL Disabled;11=BL Disabled (Low SoC),2900,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/MinimumSocLimit,d,%,2901,uint16,10,W +com.victronenergy.settings,/Settings/CGwacs/Hub4Mode,i,1=ESS with Phase Compensation;2=ESS without phase compensation;3=Disabled/External Control,2902,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/SocLimit,d,%,2903,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/V,d,V AC,3,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/V,d,V AC,4,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/V,d,V AC,5,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/I,d,A AC,6,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/I,d,A AC,7,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/I,d,A AC,8,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/F,d,Hz,9,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/F,d,Hz,10,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/F,d,Hz,11,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/P,i,VA or Watts,12,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/P,i,VA or Watts,13,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/P,i,VA or Watts,14,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L1/V,d,V AC,15,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L2/V,d,V AC,16,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L3/V,d,V AC,17,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L1/I,d,A AC,18,int16,10,R +com.victronenergy.vebus,/Ac/Out/L2/I,d,A AC,19,int16,10,R +com.victronenergy.vebus,/Ac/Out/L3/I,d,A AC,20,int16,10,R +com.victronenergy.vebus,/Ac/Out/L1/F,d,Hz,21,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/CurrentLimit,d,A,22,int16,10,W +com.victronenergy.vebus,/Ac/Out/L1/P,i,VA or Watts,23,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L2/P,i,VA or Watts,24,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L3/P,i,VA or Watts,25,int16,0.1,R +com.victronenergy.vebus,/Dc/0/Voltage,d,V DC,26,uint16,100,R +com.victronenergy.vebus,/Dc/0/Current,d,A DC,27,int16,10,R +com.victronenergy.vebus,/Ac/NumberOfPhases,u,count,28,uint16,1,R +com.victronenergy.vebus,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,29,uint16,1,R +com.victronenergy.vebus,/Soc,d,%,30,uint16,10,W +com.victronenergy.vebus,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=External control,31,uint16,1,R +com.victronenergy.vebus,/VebusError,u,0=No error;1=VE.Bus Error 1: Device is switched off because one of the other phases in the system has switched off;2=VE.Bus Error 2: New and old types MK2 are mixed in the system;3=VE.Bus Error 3: Not all- or more than- the expected devices were found in the system;4=VE.Bus Error 4: No other device whatsoever detected;5=VE.Bus Error 5: Overvoltage on AC-out;6=VE.Bus Error 6: Error in DDC Program;7=VE.Bus BMS connected- which requires an Assistant- but no assistant found;10=VE.Bus Error 10: System time synchronisation problem occurred;14=VE.Bus Error 14: Device cannot transmit data;16=VE.Bus Error 16: Dongle missing;17=VE.Bus Error 17: One of the devices assumed master status because the original master failed;18=VE.Bus Error 18: AC Overvoltage on the output of a slave has occurred while already switched off;22=VE.Bus Error 22: This device cannot function as slave;24=VE.Bus Error 24: Switch-over system protection initiated;25=VE.Bus Error 25: Firmware incompatibility. The firmware of one of the connected device is not sufficiently up to date to operate in conjunction with this device;26=VE.Bus Error 26: Internal error,32,uint16,1,R +com.victronenergy.vebus,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,33,uint16,1,W +com.victronenergy.vebus,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,34,uint16,1,R +com.victronenergy.vebus,/Alarms/LowBattery,u,0=Ok;1=Warning;2=Alarm,35,uint16,1,R +com.victronenergy.vebus,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,36,uint16,1,R +com.victronenergy.vebus,/Alarms/TemperatureSensor,u,0=Ok;1=Warning;2=Alarm,42,uint16,1,R +com.victronenergy.vebus,/Alarms/VoltageSensor,u,0=Ok;1=Warning;2=Alarm,43,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/HighTemperature,u,0=Ok;1=Warning;2=Alarm,44,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/LowBattery,u,0=Ok;1=Warning;2=Alarm,45,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Overload,u,0=Ok;1=Warning;2=Alarm,46,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Ripple,u,0=Ok;1=Warning;2=Alarm,47,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/HighTemperature,u,0=Ok;1=Warning;2=Alarm,48,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/LowBattery,u,0=Ok;1=Warning;2=Alarm,49,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Overload,u,0=Ok;1=Warning;2=Alarm,50,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Ripple,u,0=Ok;1=Warning;2=Alarm,51,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/HighTemperature,u,0=Ok;1=Warning;2=Alarm,52,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/LowBattery,u,0=Ok;1=Warning;2=Alarm,53,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Overload,u,0=Ok;1=Warning;2=Alarm,54,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Ripple,u,0=Ok;1=Warning;2=Alarm,55,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,37,int16,1,W +com.victronenergy.vebus,/Hub4/DisableCharge,u,0=Charge allowed;1=Charge disabled,38,uint16,1,W +com.victronenergy.vebus,/Hub4/DisableFeedIn,u,0=Feed in allowed;1=Feed in disabled,39,uint16,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,40,int16,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,41,int16,1,W +com.victronenergy.vebus,/PvInverter/Disable,u,0=PV enabled;1=PV disabled,56,uint16,1,W +com.victronenergy.vebus,/Bms/AllowToCharge,u,0=No;1=Yes,57,uint16,1,R +com.victronenergy.vebus,/Bms/AllowToDischarge,u,0=No;1=Yes,58,uint16,1,R +com.victronenergy.vebus,/Bms/BmsExpected,u,0=No;1=Yes,59,uint16,1,R +com.victronenergy.vebus,/Bms/Error,u,0=No;1=Yes,60,uint16,1,R +com.victronenergy.vebus,/Dc/0/Temperature,d,Degrees celsius,61,int16,10,R +com.victronenergy.vebus,/SystemReset,y,0=No action;1=VE.Bus Reset,62,uint16,1,W +com.victronenergy.vebus,/Alarms/PhaseRotation,u,0=Ok;1=Warning,63,uint16,1,R +com.victronenergy.vebus,/Alarms/GridLost,i,0=No alarm;2=Alarm,64,uint16,1,R +com.victronenergy.vebus,/Alarms/BmsPreAlarm,u,0=OK;1=Pre-Alarm,94,uint16,1,R +com.victronenergy.vebus,/Hub4/DoNotFeedInOvervoltage,i,0=Feed in overvoltage;1=Don't feed in overvoltage,65,uint16,1,W +com.victronenergy.vebus,/Hub4/L1/MaxFeedInPower,d,W,66,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L2/MaxFeedInPower,d,W,67,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L3/MaxFeedInPower,d,W,68,uint16,0.01,W +com.victronenergy.vebus,/Ac/State/IgnoreAcIn1,i,0=AC input not ignored; 1=AC input ignored,69,uint16,1,R +com.victronenergy.vebus,/Ac/State/IgnoreAcIn2,i,0=AC input not ignored; 1=AC input ignored,70,uint16,1,R +com.victronenergy.vebus,/Hub4/TargetPowerIsMaxFeedIn,i,0=AcPowerSetpoint interpreted normally; 1=AcPowerSetpoint as OvervoltageFeedIn limit,71,uint16,,W +com.victronenergy.vebus,/Hub4/FixSolarOffsetTo100mV,i,0=OvervoltageFeedIn uses 1V offset; 1=OvervoltageFeedIn uses 0.1V offset,72,uint16,,W +com.victronenergy.vebus,/Hub4/Sustain,i,0=Sustain inactive; 1=Sustain active,73,uint16,1,R +com.victronenergy.vebus,/Energy/AcIn1ToAcOut,d,kWh,74,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn1ToInverter,d,kWh,76,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToAcOut,d,kWh,78,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToInverter,d,kWh,80,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn1,d,kWh,82,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn2,d,kWh,84,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn1,d,kWh,86,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn2,d,kWh,88,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcOut,d,kWh,90,uint32,100,R +com.victronenergy.vebus,/Energy/OutToInverter,d,kWh,92,uint32,100,R +com.victronenergy.vebus,/VebusChargeState,u,0=Initialising;1=Bulk;2=Absorption;3=Float;4=Storage;5=Absorb repeat;6=Forced absorb;7=Equalise;8=Bulk stopped;9=Unknown,95,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,96,int32,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,98,int32,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,100,int32,1,W +com.victronenergy.vebus,/Dc/0/PreferRenewableEnergy,i,0=Not preferred;1=Preferred,102,uint16,1,W +com.victronenergy.vebus,/Ac/Control/RemoteGeneratorSelected,i,0=Generator not selected;1=Generator selected,103,uint16,1,W +com.victronenergy.vebus,/Ac/State/RemoteGeneratorSelected,i,0=Generator not selected;1=Generator selected,104,uint16,1,R +com.victronenergy.battery,/Dc/0/Power,i,W,258,int16,1,R +com.victronenergy.battery,/Dc/0/Voltage,d,V DC,259,uint16,100,R +com.victronenergy.battery,/Dc/1/Voltage,d,V DC,260,uint16,100,R +com.victronenergy.battery,/Dc/0/Current,d,A DC,261,int16,10,R +com.victronenergy.battery,/Dc/0/Temperature,d,Degrees celsius,262,int16,10,R +com.victronenergy.battery,/Dc/0/MidVoltage,d,V DC,263,uint16,100,R +com.victronenergy.battery,/Dc/0/MidVoltageDeviation,d,%,264,uint16,100,R +com.victronenergy.battery,/ConsumedAmphours,d,Ah,265,uint16,-10,R +com.victronenergy.battery,/Soc,y,%,266,uint16,10,R +com.victronenergy.battery,/Soh,y,%,304,uint16,10,R +com.victronenergy.battery,/TimeToGo,q,seconds,303,uint16,0.01,R +com.victronenergy.battery,/Info/MaxChargeVoltage,u,V DC,305,uint16,10,R +com.victronenergy.battery,/Info/BatteryLowVoltage,u,V DC,306,uint16,10,R +com.victronenergy.battery,/Info/MaxChargeCurrent,u,A DC,307,uint16,10,R +com.victronenergy.battery,/Info/MaxDischargeCurrent,u,A DC,308,uint16,10,R +com.victronenergy.battery,/Alarms/Alarm,y,0=No alarm;2=Alarm,267,uint16,1,R +com.victronenergy.battery,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,268,uint16,1,R +com.victronenergy.battery,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,269,uint16,1,R +com.victronenergy.battery,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,270,uint16,1,R +com.victronenergy.battery,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,271,uint16,1,R +com.victronenergy.battery,/Alarms/LowSoc,u,0=No alarm;2=Alarm,272,uint16,1,R +com.victronenergy.battery,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,273,uint16,1,R +com.victronenergy.battery,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,274,uint16,1,R +com.victronenergy.battery,/Alarms/MidVoltage,u,0=No alarm;2=Alarm,275,uint16,1,R +com.victronenergy.battery,/Alarms/LowFusedVoltage,u,0=No alarm;2=Alarm,276,uint16,1,R +com.victronenergy.battery,/Alarms/HighFusedVoltage,u,0=No alarm;2=Alarm,277,uint16,1,R +com.victronenergy.battery,/Alarms/FuseBlown,u,0=No alarm;2=Alarm,278,uint16,1,R +com.victronenergy.battery,/Alarms/HighInternalTemperature,u,0=No alarm;2=Alarm,279,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeCurrent,u,0=No alarm;2=Alarm,320,uint16,1,R +com.victronenergy.battery,/Alarms/HighDischargeCurrent,u,0=No alarm;2=Alarm,321,uint16,1,R +com.victronenergy.battery,/Alarms/CellImbalance,u,0=No alarm;2=Alarm,322,uint16,1,R +com.victronenergy.battery,/Alarms/InternalFailure,u,0=No alarm;2=Alarm,323,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeTemperature,u,0=No alarm;2=Alarm,324,uint16,1,R +com.victronenergy.battery,/Alarms/LowChargeTemperature,u,0=No alarm;2=Alarm,325,uint16,1,R +com.victronenergy.battery,/Alarms/LowCellVoltage,u,0=No alarm;1=Almost discharged;2=Alarm,326,uint16,1,R +com.victronenergy.battery,/Relay/0/State,y,0=Open;1=Closed,280,uint16,1,W +com.victronenergy.battery,/History/DeepestDischarge,d,Ah,281,uint16,-10,R +com.victronenergy.battery,/History/LastDischarge,d,Ah,282,uint16,-10,R +com.victronenergy.battery,/History/AverageDischarge,d,Ah,283,uint16,-10,R +com.victronenergy.battery,/History/ChargeCycles,i,count,284,uint16,1,R +com.victronenergy.battery,/History/FullDischarges,i,count,285,uint16,1,R +com.victronenergy.battery,/History/TotalAhDrawn,d,Ah,286,uint16,-10,R +com.victronenergy.battery,/History/MinimumVoltage,d,V DC,287,uint16,100,R +com.victronenergy.battery,/History/MaximumVoltage,d,V DC,288,uint16,100,R +com.victronenergy.battery,/History/TimeSinceLastFullCharge,i,seconds,289,uint16,0.01,R +com.victronenergy.battery,/History/AutomaticSyncs,i,count,290,uint16,1,R +com.victronenergy.battery,/History/LowVoltageAlarms,i,count,291,uint16,1,R +com.victronenergy.battery,/History/HighVoltageAlarms,i,count,292,uint16,1,R +com.victronenergy.battery,/History/LowStarterVoltageAlarms,i,count,293,uint16,1,R +com.victronenergy.battery,/History/HighStarterVoltageAlarms,i,count,294,uint16,1,R +com.victronenergy.battery,/History/MinimumStarterVoltage,d,V DC,295,uint16,100,R +com.victronenergy.battery,/History/MaximumStarterVoltage,d,V DC,296,uint16,100,R +com.victronenergy.battery,/History/LowFusedVoltageAlarms,i,count,297,uint16,1,R +com.victronenergy.battery,/History/HighFusedVoltageAlarms,i,count,298,uint16,1,R +com.victronenergy.battery,/History/MinimumFusedVoltage,d,V DC,299,uint16,100,R +com.victronenergy.battery,/History/MaximumFusedVoltage,d,V DC,300,uint16,100,R +com.victronenergy.battery,/History/DischargedEnergy,d,kWh,301,uint16,10,R +com.victronenergy.battery,/History/ChargedEnergy,d,kWh,302,uint16,10,R +com.victronenergy.battery,/Capacity,d,Ah,309,uint16,10,R +com.victronenergy.battery,/State,y,0=Initializing (Wait start);1=Initializing (before boot);2=Initializing (Before boot delay);3=Initializing (Wait boot);4=Initializing;5=Initializing (Measure battery voltage);6=Initializing (Calculate battery voltage);7=Initializing (Wait bus voltage);8=Initializing (Wait for lynx shunt);9=Running;10=Error;11=Unused;12=Shutdown;13=Slave updating;14=Standby;15=Going to run;16=Per-charging;17=Contactor check,1282,uint16,1,R +com.victronenergy.battery,/ErrorCode,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1283,uint16,1,R +com.victronenergy.battery,/SystemSwitch,y,0=Disabled;1=Enabled,1284,uint16,1,R +com.victronenergy.battery,/Balancing,y,0=Inactive;1=Active,1285,uint16,1,R +com.victronenergy.battery,/System/NrOfBatteries,y,count,1286,uint16,1,R +com.victronenergy.battery,/System/BatteriesParallel,y,count,1287,uint16,1,R +com.victronenergy.battery,/System/BatteriesSeries,y,count,1288,uint16,1,R +com.victronenergy.battery,/System/NrOfCellsPerBattery,y,count,1289,uint16,1,R +com.victronenergy.battery,/System/MinCellVoltage,d,V DC,1290,uint16,100,R +com.victronenergy.battery,/System/MaxCellVoltage,d,V DC,1291,uint16,100,R +com.victronenergy.battery,/Diagnostics/ShutDownsDueError,q,count,1292,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1293,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1294,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1295,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1296,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Time,u,,310,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Time,u,,312,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Time,u,,314,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Time,u,,316,int32,1,R +com.victronenergy.battery,/System/MinCellTemperature,d,Degrees celsius,318,int16,10,R +com.victronenergy.battery,/System/MaxCellTemperature,d,Degrees celsius,319,int16,10,R +com.victronenergy.battery,/Io/AllowToCharge,y,0=No;1=Yes,1297,uint16,1,R +com.victronenergy.battery,/Io/AllowToDischarge,y,0=No;1=Yes,1298,uint16,1,R +com.victronenergy.battery,/Io/ExternalRelay,y,0=Inactive;1=Active,1299,uint16,1,R +com.victronenergy.battery,/History/MinimumCellVoltage,d,V DC,1300,uint16,100,R +com.victronenergy.battery,/History/MaximumCellVoltage,d,V DC,1301,uint16,100,R +com.victronenergy.battery,/System/NrOfModulesOffline,u,,1302,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesOnline,u,,1303,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingCharge,u,,1304,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingDischarge,u,,1305,uint16,1,R +com.victronenergy.battery,/System/MinVoltageCellId,s,,1306,string[4],1,R +com.victronenergy.battery,/System/MaxVoltageCellId,s,,1310,string[4],1,R +com.victronenergy.battery,/System/MinTemperatureCellId,s,,1314,string[4],1,R +com.victronenergy.battery,/System/MaxTemperatureCellId,s,,1318,string[4],1,R +com.victronenergy.battery,/Mode,i,3=On;252=Standby,1319,uint16,1,W +com.victronenergy.solarcharger,/Dc/0/Voltage,d,V DC,771,uint16,100,R +com.victronenergy.solarcharger,/Dc/0/Current,d,A DC,772,int16,10,R +com.victronenergy.solarcharger,/Dc/0/Temperature,d,Degrees celsius,773,int16,10,R +com.victronenergy.solarcharger,/Mode,i,1=On;4=Off,774,uint16,1,W +com.victronenergy.solarcharger,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;11=Other (Hub-1);252=Hub-1,775,uint16,1,R +com.victronenergy.solarcharger,/Pv/V,d,V DC,776,uint16,100,R +com.victronenergy.solarcharger,/Pv/I,d,A DC,777,,10,R,HANDLED IN mappings.c +com.victronenergy.solarcharger,/Yield/Power,d,W,789,uint16,10,R +com.victronenergy.solarcharger,/Equalization/Pending,i,0=No;1=Yes;2=Error;3=Unavailable- Unknown,778,uint16,1,R +com.victronenergy.solarcharger,/Equalization/TimeRemaining,d,seconds,779,uint16,10,R +com.victronenergy.solarcharger,/Relay/0/State,i,0=Open;1=Closed,780,uint16,1,R +com.victronenergy.solarcharger,/Alarms/Alarm,i,0=No alarm;2=Alarm,781,uint16,1,R +com.victronenergy.solarcharger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,782,uint16,1,R +com.victronenergy.solarcharger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,783,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Yield,d,kWh,784,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/MaxPower,d,W,785,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Yield,d,kWh,786,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/MaxPower,d,W,787,uint16,1,R +com.victronenergy.solarcharger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,788,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,790,uint16,10,R +com.victronenergy.solarcharger,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,791,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/V,d,V DC,3700,uint16,100,R +com.victronenergy.solarcharger,/Pv/1/V,d,V DC,3701,uint16,100,R +com.victronenergy.solarcharger,/Pv/2/V,d,V DC,3702,uint16,100,R +com.victronenergy.solarcharger,/Pv/3/V,d,V DC,3703,uint16,100,R +com.victronenergy.solarcharger,RESERVED,d,,3704,reserved[4],1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/Yield,d,kWh,3708,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/Yield,d,kWh,3709,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/Yield,d,kWh,3710,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/Yield,d,kWh,3711,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/Yield,d,kWh,3712,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/Yield,d,kWh,3713,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/Yield,d,kWh,3714,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/Yield,d,kWh,3715,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/MaxPower,d,W,3716,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/MaxPower,d,W,3717,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/MaxPower,d,W,3718,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/MaxPower,d,W,3719,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/MaxPower,d,W,3720,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/MaxPower,d,W,3721,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/MaxPower,d,W,3722,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/MaxPower,d,W,3723,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/P,d,W,3724,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/P,d,W,3725,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/P,d,W,3726,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/P,d,W,3727,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,3728,uint32,1,R +com.victronenergy.solarcharger,/Yield/Power,d,W,3730,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3731,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3732,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3733,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3734,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L1/Power,d,W,808,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L2/Power,d,W,809,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L3/Power,d,W,810,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L1/Power,d,W,811,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L2/Power,d,W,812,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L3/Power,d,W,813,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L1/Power,d,W,814,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L2/Power,d,W,815,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L3/Power,d,W,816,uint16,1,R +com.victronenergy.system,/Dc/Pv/Power,d,W,850,uint16,1,R +com.victronenergy.system,/Dc/Pv/Current,d,A DC,851,int16,10,R +com.victronenergy.system,/Dc/Charger/Power,d,W,855,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L1/Power,d,W,817,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L2/Power,d,W,818,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L3/Power,d,W,819,uint16,1,R +com.victronenergy.system,/Ac/Grid/L1/Power,d,W,820,int16,1,R +com.victronenergy.system,/Ac/Grid/L2/Power,d,W,821,int16,1,R +com.victronenergy.system,/Ac/Grid/L3/Power,d,W,822,int16,1,R +com.victronenergy.system,/Ac/Genset/L1/Power,d,W,823,int16,1,R +com.victronenergy.system,/Ac/Genset/L2/Power,d,W,824,int16,1,R +com.victronenergy.system,/Ac/Genset/L3/Power,d,W,825,int16,1,R +com.victronenergy.system,/Ac/ActiveIn/Source,u,0=Not available;1=Grid;2=Generator;3=Shore power;240=Not connected,826,int16,1,R +com.victronenergy.system,/Dc/System/Power,d,W,860,int16,1,R +com.victronenergy.system,/Dc/Battery/Voltage,d,V DC,840,uint16,10,R +com.victronenergy.system,/Dc/Battery/Current,d,A DC,841,int16,10,R +com.victronenergy.system,/Dc/Battery/Power,d,W,842,int16,1,R +com.victronenergy.system,/Dc/Vebus/Current,d,A DC,865,int16,10,R +com.victronenergy.system,/Dc/Vebus/Power,d,W,866,int16,1,R +com.victronenergy.system,/Dc/Battery/Soc,d,%,843,uint16,1,R +com.victronenergy.system,/Dc/Battery/State,i,0=idle;1=charging;2=discharging,844,uint16,1,R +com.victronenergy.system,/Dc/Battery/ConsumedAmphours,d,Ah,845,uint16,-10,R +com.victronenergy.system,/Dc/Battery/TimeToGo,d,s,846,uint16,0.01,R +com.victronenergy.system,/Relay/0/State,i,0=Open;1=Closed,806,uint16,1,W +com.victronenergy.system,/Relay/1/State,i,0=Open;1=Closed,807,uint16,1,W +com.victronenergy.system,/Serial,s,,800,string[6],1,R +com.victronenergy.pvinverter,/Position,i,0=AC input 1;1=AC output;2=AC input 2,1026,uint16,1,R +com.victronenergy.pvinverter,/Serial,s,,1039,string[7],1,R +com.victronenergy.pvinverter,/Ac/L1/Voltage,d,V AC,1027,uint16,10,R +com.victronenergy.pvinverter,/Ac/L1/Current,d,A AC,1028,int16,10,R +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1029,uint16,1,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1030,uint16,100,R +com.victronenergy.pvinverter,/Ac/L2/Voltage,d,V AC,1031,uint16,10,R +com.victronenergy.pvinverter,/Ac/L2/Current,d,A AC,1032,int16,10,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1033,uint16,1,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1034,uint16,100,R +com.victronenergy.pvinverter,/Ac/L3/Voltage,d,V AC,1035,uint16,10,R +com.victronenergy.pvinverter,/Ac/L3/Current,d,A AC,1036,int16,10,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1037,uint16,1,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1038,uint16,100,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1046,uint32,100,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1048,uint32,100,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1050,uint32,100,R +com.victronenergy.pvinverter,/Ac/Power,i,kW,1052,int32,1,W +com.victronenergy.pvinverter,/Ac/MaxPower,u,kW,1054,uint32,1,W +com.victronenergy.pvinverter,/Ac/PowerLimit,u,kW,1056,uint32,1,W +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1058,uint32,1,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1060,uint32,1,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1062,uint32,1,R +com.victronenergy.motordrive,/Motor/RPM,d,RPM,2048,int16,1,R +com.victronenergy.motordrive,/Motor/Temperature,d,Degrees celsius,2049,int16,10,R +com.victronenergy.motordrive,/Dc/0/Voltage,d,V DC,2050,uint16,100,R +com.victronenergy.motordrive,/Dc/0/Current,d,A DC,2051,int16,10,R +com.victronenergy.motordrive,/Dc/0/Power,d,W,2052,int16,10,R +com.victronenergy.motordrive,/Controller/Temperature,d,Degrees celsius,2053,int16,10,R +com.victronenergy.charger,/Dc/0/Voltage,d,V DC,2307,uint16,100,R +com.victronenergy.charger,/Dc/0/Current,d,A DC,2308,int16,10,R +com.victronenergy.charger,/Dc/0/Temperature,d,Degrees celsius,2309,int16,10,R +com.victronenergy.charger,/Dc/1/Voltage,d,V DC,2310,uint16,100,R +com.victronenergy.charger,/Dc/1/Current,d,A DC,2311,int16,10,R +com.victronenergy.charger,/Dc/2/Voltage,d,V DC,2312,uint16,100,R +com.victronenergy.charger,/Dc/2/Current,d,A DC,2313,int16,10,R +com.victronenergy.charger,/Ac/In/L1/I,d,A AC,2314,int16,10,R +com.victronenergy.charger,/Ac/In/L1/P,d,W DC,2315,uint16,1,R +com.victronenergy.charger,/Ac/In/CurrentLimit,d,A AC,2316,int16,10,W +com.victronenergy.charger,/Mode,i,0=Off;1=On;2=Error;3=Unavailable- Unknown,2317,uint16,1,W +com.victronenergy.charger,/State,i,0=Off;1=Low Power Mode;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply mode;252=External control,2318,uint16,1,R +com.victronenergy.charger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,2319,uint16,1,R +com.victronenergy.charger,/Relay/0/State,i,0=Open;1=Closed,2320,uint16,1,R +com.victronenergy.charger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,2321,uint16,1,R +com.victronenergy.charger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,2322,uint16,1,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2600,int16,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2601,int16,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2602,int16,1,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2603,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2604,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2605,uint16,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2606,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2607,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2608,uint16,100,R +com.victronenergy.grid,/Serial,s,,2609,string[7],,R +com.victronenergy.grid,/Ac/L1/Voltage,d,V AC,2616,uint16,10,R +com.victronenergy.grid,/Ac/L1/Current,d,A AC,2617,int16,10,R +com.victronenergy.grid,/Ac/L2/Voltage,d,V AC,2618,uint16,10,R +com.victronenergy.grid,/Ac/L2/Current,d,A AC,2619,int16,10,R +com.victronenergy.grid,/Ac/L3/Voltage,d,V AC,2620,uint16,10,R +com.victronenergy.grid,/Ac/L3/Current,d,A AC,2621,int16,10,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2622,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2624,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2626,uint32,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2628,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2630,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2632,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Forward,d,kWh,2634,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Reverse,d,kWh,2636,uint32,100,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2638,int32,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2640,int32,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2642,int32,1,R +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2700,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2703,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/MaxChargePercentage,d,%,2701,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePercentage,d,%,2702,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePower,d,W,2704,int16,0.1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeCurrent,d,A,2705,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxFeedInPower,d,W,2706,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/OvervoltageFeedIn,i,0=Don't feed excess DC-coupled PV into grid;1=Feed excess DC-coupled PV into the grid,2707,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/PreventFeedback,i,0=Feed excess AC-coupled PV into grid;1=Don't feed excess AC-coupled PV into the grid,2708,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeVoltage,d,V,2710,uint16,10,W +com.victronenergy.settings,/Settings/SystemSetup/AcInput1,u,0=Unused;1=Grid;2=Genset;3=Shore,2711,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/AcInput2,u,0=Unused;1=Grid;2=Genset;3=Shore,2712,uint16,1,W +com.victronenergy.hub4,/PvPowerLimiterActive,i,0=Feed-in limiting inactive;1=Feed-in limiting active,2709,uint16,1,R +com.victronenergy.tank,/ProductId,u,,3000,uint16,1,R +com.victronenergy.tank,/Capacity,d,m3,3001,uint32,10000,R +com.victronenergy.tank,/FluidType,u,0=Fuel;1=Fresh water;2=Waste water;3=Live well;4=Oil;5=Black water (sewage);6=Gasoline;7=Diesel;8=LPG;9=LNG;10=Hydraulic oil;11=Raw water,3003,uint16,1,R +com.victronenergy.tank,/Level,d,%,3004,uint16,10,R +com.victronenergy.tank,/Remaining,d,m3,3005,uint32,10000,R +com.victronenergy.tank,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3007,uint16,1,R +com.victronenergy.inverter,/ProductId,u,,3127,uint16,1,R +com.victronenergy.inverter,/FirmwareVersion,u,,3125,uint16,1,R +com.victronenergy.inverter,/Ac/Out/L1/I,d,A AC,3100,int16,10,R +com.victronenergy.inverter,/Ac/Out/L1/V,d,V AC,3101,uint16,10,R +com.victronenergy.inverter,/Ac/Out/L1/P,d,W AC,3102,int16,0.1,R +com.victronenergy.inverter,/Alarms/HighTemperature,u,0=No alarm;1=Warning;2=Alarm,3110,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltage,u,0=No alarm;1=Warning;2=Alarm,3111,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3112,uint16,1,R +com.victronenergy.inverter,/Alarms/LowTemperature,u,0=No alarm;1=Warning;2=Alarm,3113,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltage,u,0=No alarm;1=Warning;2=Alarm,3114,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3115,uint16,1,R +com.victronenergy.inverter,/Alarms/Overload,u,0=No alarm;1=Warning;2=Alarm,3116,uint16,1,R +com.victronenergy.inverter,/Alarms/Ripple,u,0=No alarm;1=Warning;2=Alarm,3117,uint16,1,R +com.victronenergy.inverter,/Dc/0/Voltage,d,V DC,3105,uint16,100,R +com.victronenergy.inverter,/Dc/0/Current,d,A DC,3106,int16,10,R +com.victronenergy.inverter,/Mode,u,2=On;4=Off;5=Eco,3126,uint16,1,W +com.victronenergy.inverter,/State,u,0=Off;1=Low power mode (search mode);2=Fault;9=Inverting (on),3128,uint16,1,R +com.victronenergy.inverter,/Energy/InverterToAcOut,d,kWh,3130,uint32,100,R +com.victronenergy.inverter,/Energy/OutToInverter,d,kWh,3132,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToAcOut,d,kWh,3134,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToBattery,d,kWh,3136,uint32,100,R +com.victronenergy.inverter,/Pv/V,d,V DC,3138,uint16,10,R +com.victronenergy.inverter,/Pv/0/V,d,V DC,3140,uint16,10,R +com.victronenergy.inverter,/Pv/1/V,d,V DC,3141,uint16,10,R +com.victronenergy.inverter,/Pv/2/V,d,V DC,3142,uint16,10,R +com.victronenergy.inverter,/Pv/3/V,d,V DC,3143,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/Yield,d,kWh,3148,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/Yield,d,kWh,3149,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/Yield,d,kWh,3150,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/Yield,d,kWh,3151,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/Yield,d,kWh,3152,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/Yield,d,kWh,3153,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/Yield,d,kWh,3154,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/Yield,d,kWh,3155,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/MaxPower,d,W,3156,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/MaxPower,d,W,3157,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/MaxPower,d,W,3158,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/MaxPower,d,W,3159,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/MaxPower,d,W,3160,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/MaxPower,d,W,3161,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/MaxPower,d,W,3162,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/MaxPower,d,W,3163,uint16,1,R +com.victronenergy.inverter,/Pv/0/P,d,W,3164,uint16,1,R +com.victronenergy.inverter,/Pv/1/P,d,W,3165,uint16,1,R +com.victronenergy.inverter,/Pv/2/P,d,W,3166,uint16,1,R +com.victronenergy.inverter,/Pv/3/P,d,W,3167,uint16,1,R +com.victronenergy.inverter,/Alarms/LowSoc,u,,3168,uint16,1,R +com.victronenergy.inverter,/Pv/0/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3169,uint16,1,R +com.victronenergy.inverter,/Pv/1/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3170,uint16,1,R +com.victronenergy.inverter,/Pv/2/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3171,uint16,1,R +com.victronenergy.inverter,/Pv/3/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3172,uint16,1,R +com.victronenergy.genset,/ProductId,u,,3212,uint16,1,R +com.victronenergy.genset,/StatusCode,u,0=Standby;1=Startup 1;2=Startup 2;3=Startup 3;4=Startup 4;5=Startup 5;6=Startup 6;7=Startup 7;8=Running;9=Stopping;10=Error,3213,uint16,1,R +com.victronenergy.genset,/ErrorCode,u,0=No error;1=AC voltage L1 too low;2=AC frequency L1 too low;3=AC current too low;4=AC power too low;5=Emergency stop;6=Servo current too low;7=Oil pressure too low;8=Engine temperature too low;9=Winding temperature too low;10=Exhaust temperature too low;13=Starter current too low;14=Glow current too low;15=Glow current too low;16=Fuel holding magnet current too low;17=Stop solenoid hold coil current too low;18=Stop solenoid pull coil current too low;19=Optional DC out current too low;20=5V output voltage too low;21=Boost output current too low;22=Panel supply current too high;25=Starter battery voltage too low;26=Startup aborted (rotation too low);28=Rotation too low;29=Power contactor current too low;30=AC voltage L2 too low;31=AC frequency L2 too low;32=AC current L2 too low;33=AC power L2 too low;34=AC voltage L3 too low;35=AC frequency L3 too low;36=AC current L3 too low;37=AC power L3 too low;62=Fuel temperature too low;63=Fuel level too low;65=AC voltage L1 too high;66=AC frequency too high;67=AC current too high;68=AC power too high;70=Servo current too high;71=Oil pressure too high;72=Engine temperature too high;73=Winding temperature too high;74=Exhaust temperature too low;77=Starter current too low;78=Glow current too high;79=Glow current too high;80=Fuel holding magnet current too high;81=Stop solenoid hold coil current too high;82=Stop solenoid pull coil current too high;83=Optional DC out current too high;84=5V output voltage too high;85=Boost output current too high;89=Starter battery voltage too high;90=Startup aborted (rotation too high);92=Rotation too high;93=Power contactor current too high;94=AC voltage L2 too high;95=AC frequency L2 too high;96=AC current L2 too high;97=AC power L2 too high;98=AC voltage L3 too high;99=AC frequency L3 too high;100=AC current L3 too high;101=AC power L3 too high;126=Fuel temperature too high;127=Fuel level too high;130=Lost control unit;131=Lost panel;132=Service needed;133=Lost 3-phase module;134=Lost AGT module;135=Synchronization failure;137=Intake airfilter;139=Lost sync. module;140=Load-balance failed;141=Sync-mode deactivated;142=Engine controller;148=Rotating field wrong;149=Fuel level sensor lost;150=Init failed;151=Watchdog;152=Out: winding;153=Out: exhaust;154=Out: Cyl. head;155=Inverter over temperature;156=Inverter overload;157=Inverter communication lost;158=Inverter sync failed;159=CAN communication lost;160=L1 overload;161=L2 overload;162=L3 overload;163=DC overload;164=DC overvoltage;165=Emergency stop;166=No connection,3214,uint16,1,R +com.victronenergy.genset,/AutoStart,u,0=Disabled;1=Enabled,3215,uint16,1,R +com.victronenergy.genset,/Start,u,0=Stop;1=Start,3223,uint16,1,W +com.victronenergy.genset,/Engine/Load,d,%,3216,uint16,1,R +com.victronenergy.genset,/Engine/Speed,d,RPM,3217,uint16,1,R +com.victronenergy.genset,/Engine/OperatingHours,d,s,3218,uint16,0.01,R +com.victronenergy.genset,/Engine/CoolantTemperature,d,Degrees celsius,3219,int16,10,R +com.victronenergy.genset,/Engine/WindingTemperature,d,Degrees celsius,3220,int16,10,R +com.victronenergy.genset,/Engine/ExaustTemperature,d,Degrees celsius,3221,int16,10,R +com.victronenergy.genset,/StarterVoltage,d,V DC,3222,uint16,100,R +com.victronenergy.genset,/Engine/OilPressure,d,kPa,3224,int16,1,R +com.victronenergy.genset,/Ac/L1/Voltage,d,V AC,3200,uint16,10,R +com.victronenergy.genset,/Ac/L1/Current,d,A AC,3203,int16,10,R +com.victronenergy.genset,/Ac/L1/Power,d,W,3206,int16,1,R +com.victronenergy.genset,/Ac/L1/Frequency,d,Hz,3209,uint16,100,R +com.victronenergy.genset,/Ac/L2/Voltage,d,V AC,3201,uint16,10,R +com.victronenergy.genset,/Ac/L2/Current,d,A AC,3204,int16,10,R +com.victronenergy.genset,/Ac/L2/Power,d,W,3207,int16,1,R +com.victronenergy.genset,/Ac/L2/Frequency,d,Hz,3210,uint16,100,R +com.victronenergy.genset,/Ac/L3/Voltage,d,V AC,3202,uint16,10,R +com.victronenergy.genset,/Ac/L3/Current,d,A AC,3205,int16,10,R +com.victronenergy.genset,/Ac/L3/Power,d,W,3208,int16,1,R +com.victronenergy.genset,/Ac/L3/Frequency,d,Hz,3211,uint16,100,R +com.victronenergy.temperature,/ProductId,u,,3300,uint16,1,R +com.victronenergy.temperature,/Scale,d,,3301,uint16,100,R +com.victronenergy.temperature,/Offset,d,,3302,int16,100,R +com.victronenergy.temperature,/TemperatureType,u,0=Battery;1=Fridge;2=Generic,3303,uint16,1,R +com.victronenergy.temperature,/Temperature,d,Degrees celsius,3304,int16,100,R +com.victronenergy.temperature,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3305,uint16,1,R +com.victronenergy.temperature,/Humidity,u,%,3306,uint16,10,R +com.victronenergy.temperature,/BatteryVoltage,d,V,3307,uint16,100,R +com.victronenergy.temperature,/Pressure,u,hPa,3308,uint16,1,R +com.victronenergy.pulsemeter,/Aggregate,i,,3400,uint32,1,R +com.victronenergy.pulsemeter,/Count,i,,3402,uint32,1,R +com.victronenergy.digitalinput,/Count,i,,3420,uint32,1,R +com.victronenergy.digitalinput,/State,i,,3422,uint16,1,R +com.victronenergy.digitalinput,/Alarm,i,0=No alarm;2=Alarm,3423,uint16,1,R +com.victronenergy.digitalinput,/Type,i,2=Door;3=Bilge pump;4=Bilge alarm;5=Burglar alarm;6=Smoke alarm;7=Fire alarm;8=CO2 alarm;9=Generator,3424,uint16,1,R;11=ExtTransferSwitch,3424,uint16,1,R +com.victronenergy.generator,/ManualStart,i,0=Stop generator;1=Start generator,3500,uint16,1,W +com.victronenergy.generator,/RunningByConditionCode,i,0=Stopped;1=Manual;2=TestRun;3=LossOfComms;4=Soc;5=AcLoad;6=BatteryCurrent;7=BatteryVoltage;8=InverterTemperatur;9=InverterOverload;10=StopOnAc1,3501,uint16,1,R +com.victronenergy.generator,/Runtime,i,seconds,3502,uint16,1,R +com.victronenergy.generator,/QuietHours,i,0=Quiet hours inactive; 1=Quiet hours active,3503,uint16,1,R +com.victronenergy.generator,/Runtime,u,seconds,3504,uint32,1,R +com.victronenergy.generator,/State,i,0=Stopped;1=Running;10=Error,3506,uint16,1,R +com.victronenergy.generator,/Error,i,0=No Error;1=Remote disabled;2=Remote fault,3507,uint16,1,R +com.victronenergy.generator,/Alarms/NoGeneratorAtAcIn,i,0=No Alarm;2=Alarm,3508,uint16,1,R +com.victronenergy.generator,/AutoStartEnabled,i,0=Autostart disabled;1=Autostart enabled,3509,uint16,1,W +com.victronenergy.generator,/ServiceCounter,u,seconds,3510,uint32,1,R +com.victronenergy.generator,/ServiceCounterReset,u,1=Reset,3512,uint16,1,W +com.victronenergy.meteo,/Irradiance,d,W/m^2,3600,uint16,10,R +com.victronenergy.meteo,/WindSpeed,d,m/s,3601,uint16,10,R +com.victronenergy.meteo,/CellTemperature,d,Degrees celsius,3602,int16,10,R +com.victronenergy.meteo,/ExternalTemperature,d,Degrees celsius,3603,int16,10,R +com.victronenergy.evcharger,/ProductId,u,,3800,uint16,1,R +com.victronenergy.evcharger,/FirmwareVersion,u,,3802,uint32,1,R +com.victronenergy.evcharger,/Serial,s,,3804,string[6],,R +com.victronenergy.evcharger,/Model,s,,3810,string[4],,R +com.victronenergy.evcharger,/MaxCurrent,d,A,3814,uint16,1,W +com.victronenergy.evcharger,/Mode,u,0=Manual;1=Auto,3815,uint16,1,W +com.victronenergy.evcharger,/Ac/Energy/Forward,d,kWh,3816,uint32,100,R +com.victronenergy.evcharger,/Ac/L1/Power,d,W,3818,uint16,1,R +com.victronenergy.evcharger,/Ac/L2/Power,d,W,3819,uint16,1,R +com.victronenergy.evcharger,/Ac/L3/Power,d,W,3820,uint16,1,R +com.victronenergy.evcharger,/Ac/Power,d,W,3821,uint16,1,R +com.victronenergy.evcharger,/ChargingTime,d,s,3822,uint16,0.01,R +com.victronenergy.evcharger,/Current,d,A,3823,uint16,1,W +com.victronenergy.evcharger,/Status,u,0=Disconnected;1=Connected;2=Charging;3=Charged;4=Waiting for sun;5=Waiting for RFID;6=Waiting for start;7=Low SOC;8=Ground fault;9=Welded contacts;10=CP Input shorted;11=Residual current detected;12=Under voltage detected;13=Overvoltage detected;14=Overheating detected,3824,uint16,1,R +com.victronenergy.evcharger,/SetCurrent,d,A,3825,uint16,1,W +com.victronenergy.evcharger,/StartStop,u,0=Stop;1=Start,3826,uint16,1,W +com.victronenergy.evcharger,/Position,i,0=AC input 1;1=AC output;2=AC input 2,3827,uint16,1,W +com.victronenergy.acload,/Ac/L1/Power,d,W,3900,int16,1,R +com.victronenergy.acload,/Ac/L2/Power,d,W,3901,int16,1,R +com.victronenergy.acload,/Ac/L3/Power,d,W,3902,int16,1,R +com.victronenergy.acload,/Serial,s,,3903,string[7],,R +com.victronenergy.acload,/Ac/L1/Voltage,d,V AC,3910,uint16,10,R +com.victronenergy.acload,/Ac/L1/Current,d,A AC,3911,int16,10,R +com.victronenergy.acload,/Ac/L2/Voltage,d,V AC,3912,uint16,10,R +com.victronenergy.acload,/Ac/L2/Current,d,A AC,3913,int16,10,R +com.victronenergy.acload,/Ac/L3/Voltage,d,V AC,3914,uint16,10,R +com.victronenergy.acload,/Ac/L3/Current,d,A AC,3915,int16,10,R +com.victronenergy.acload,/Ac/L1/Energy/Forward,d,kWh,3916,uint32,100,R +com.victronenergy.acload,/Ac/L2/Energy/Forward,d,kWh,3918,uint32,100,R +com.victronenergy.acload,/Ac/L3/Energy/Forward,d,kWh,3920,uint32,100,R +com.victronenergy.fuelcell,/Dc/0/Voltage,d,V DC,4000,uint16,100,R +com.victronenergy.fuelcell,/Dc/0/Current,d,A DC,4001,int16,10,R +com.victronenergy.fuelcell,/Dc/1/Voltage,d,V DC,4002,int16,10,R +com.victronenergy.fuelcell,/Dc/0/Temperature,d,Degrees celsius,4003,int16,10,R +com.victronenergy.fuelcell,/History/EnergyOut,d,kWh,4004,uint32,100,R +com.victronenergy.fuelcell,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4006,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4007,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4008,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4009,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4010,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4011,uint16,1,R +com.victronenergy.alternator,/Dc/0/Voltage,d,V DC,4100,uint16,100,R +com.victronenergy.alternator,/Dc/0/Current,d,A DC,4101,int16,10,R +com.victronenergy.alternator,/Dc/1/Voltage,d,V DC,4102,int16,10,R +com.victronenergy.alternator,/Dc/0/Temperature,d,Degrees celsius,4103,int16,10,R +com.victronenergy.alternator,/History/EnergyOut,d,kWh,4104,uint32,100,R +com.victronenergy.alternator,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4106,uint16,1,R +com.victronenergy.alternator,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4107,uint16,1,R +com.victronenergy.alternator,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4108,uint16,1,R +com.victronenergy.alternator,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4109,uint16,1,R +com.victronenergy.alternator,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4110,uint16,1,R +com.victronenergy.alternator,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4111,uint16,1,R +com.victronenergy.alternator,/State,u,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;252=External control,4112,uint16,1,R +com.victronenergy.alternator,/ErrorCode,u,12=High battery temperature;13=High battery voltage;14=Low battery voltage;15=VBat exceeds $CPB;21=High alternator temperature;22=Alternator overspeed;24=Internal error;41=High field FET temperature;42=Sensor missing;43=Low VAlt;44=High Voltage offset;45=VAlt exceeds $CPB;51-52=Battery disconnect request;53=Battery instance out of range;54=Too many BMSes;55=AEBus fault;56=Too many Victron devices;58-61=Battery requested disconnection;91=BMS lost;92=Forced idle;201=DCDC converter fail;201-207=DCDC error,4113,uint16,1,R +com.victronenergy.alternator,/Engine/Speed,d,RPM,4114,uint16,1,R +com.victronenergy.alternator,/Speed,d,RPM,4115,uint16,1,R +com.victronenergy.alternator,/FieldDrive,q,%,4116,uint16,1,R +com.victronenergy.dcsource,/Dc/0/Voltage,d,V DC,4200,uint16,100,R +com.victronenergy.dcsource,/Dc/0/Current,d,A DC,4201,int16,10,R +com.victronenergy.dcsource,/Dc/1/Voltage,d,V DC,4202,int16,10,R +com.victronenergy.dcsource,/Dc/0/Temperature,d,Degrees centigrade,4203,int16,10,R +com.victronenergy.dcsource,/History/EnergyOut,d,kWh,4204,uint32,100,R +com.victronenergy.dcsource,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4206,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4207,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4208,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4209,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4210,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4211,uint16,1,R +com.victronenergy.dcload,/Dc/0/Voltage,d,V DC,4300,uint16,100,R +com.victronenergy.dcload,/Dc/0/Current,d,A DC,4301,int16,10,R +com.victronenergy.dcload,/Dc/1/Voltage,d,V DC,4302,int16,10,R +com.victronenergy.dcload,/Dc/0/Temperature,d,Degrees centigrade,4303,int16,10,R +com.victronenergy.dcload,/History/EnergyIn,d,kWh,4304,uint32,100,R +com.victronenergy.dcload,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4306,uint16,1,R +com.victronenergy.dcload,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4307,uint16,1,R +com.victronenergy.dcload,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4308,uint16,1,R +com.victronenergy.dcload,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4309,uint16,1,R +com.victronenergy.dcload,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4310,uint16,1,R +com.victronenergy.dcload,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4311,uint16,1,R +com.victronenergy.dcsystem,/Dc/0/Voltage,d,V DC,4400,uint16,100,R +com.victronenergy.dcsystem,/Dc/0/Current,d,A DC,4401,int16,10,R +com.victronenergy.dcsystem,/Dc/1/Voltage,d,V DC,4402,int16,10,R +com.victronenergy.dcsystem,/Dc/0/Temperature,d,Degrees centigrade,4403,int16,10,R +com.victronenergy.dcsystem,/History/EnergyOut,d,kWh,4404,uint32,100,R +com.victronenergy.dcsystem,/History/EnergyIn,d,kWh,4406,uint32,100,R +com.victronenergy.dcsystem,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4408,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4409,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4410,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4411,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4412,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4413,uint16,1,R +com.victronenergy.multi,/Ac/In/1/L1/V,d,V AC,4500,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/V,d,V AC,4501,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/V,d,V AC,4502,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/I,d,A AC,4503,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/I,d,A AC,4504,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/I,d,A AC,4505,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/P,d,W,4506,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L2/P,d,W,4507,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L3/P,d,W,4508,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L1/F,d,Hz,4509,uint16,100,R +com.victronenergy.multi,/Ac/Out/L1/V,d,V AC,4510,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/V,d,V AC,4511,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/V,d,V AC,4512,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/I,d,A AC,4513,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/I,d,A AC,4514,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/I,d,A AC,4515,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/P,d,W,4516,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L2/P,d,W,4517,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L3/P,d,W,4518,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L1/F,d,Hz,4519,uint16,100,R +com.victronenergy.multi,/Ac/In/1/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4520,uint16,1,R +com.victronenergy.multi,/Ac/In/2/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4521,uint16,1,R +com.victronenergy.multi,/Ac/In/1/CurrentLimit,d,A,4522,uint16,10,W +com.victronenergy.multi,/Ac/In/2/CurrentLimit,d,A,4523,uint16,10,W +com.victronenergy.multi,/Ac/NumberOfPhases,u,count,4524,uint16,1,R +com.victronenergy.multi,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,4525,uint16,1,R +com.victronenergy.multi,/Dc/0/Voltage,d,V DC,4526,uint16,100,R +com.victronenergy.multi,/Dc/0/Current,d,A DC,4527,int16,10,R +com.victronenergy.multi,/Dc/0/Temperature,d,Degrees celsius,4528,int16,10,R +com.victronenergy.multi,/Soc,d,%,4529,uint16,10,R +com.victronenergy.multi,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=External control,4530,uint16,1,R +com.victronenergy.multi,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,4531,uint16,1,W +com.victronenergy.multi,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,4532,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltage,u,0=Ok;1=Warning;2=Alarm,4533,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4534,uint16,1,R +com.victronenergy.multi,/Alarms/LowTemperature,u,0=Ok;1=Warning;2=Alarm,4535,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltage,u,0=Ok;1=Warning;2=Alarm,4536,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4537,uint16,1,R +com.victronenergy.multi,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,4538,uint16,1,R +com.victronenergy.multi,/Alarms/Ripple,u,0=Ok;1=Warning;2=Alarm,4539,uint16,1,R +com.victronenergy.multi,/Yield/Power,d,W,4540,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4541,uint16,10,R +com.victronenergy.multi,/Relay/0/State,i,0=Open;1=Closed,4542,uint16,1,R +com.victronenergy.multi,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4543,uint16,1,R +com.victronenergy.multi,/Pv/V,d,V DC,4544,uint16,10,R +com.victronenergy.multi,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,4545,uint16,1,R +com.victronenergy.multi,/Energy/AcIn1ToAcOut,d,kWh,4546,uint32,100,R +com.victronenergy.multi,/Energy/AcIn1ToInverter,d,kWh,4548,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToAcOut,d,kWh,4550,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToInverter,d,kWh,4552,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn1,d,kWh,4554,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn2,d,kWh,4556,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn1,d,kWh,4558,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn2,d,kWh,4560,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcOut,d,kWh,4562,uint32,100,R +com.victronenergy.multi,/Energy/OutToInverter,d,kWh,4564,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn1,d,kWh,4566,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn2,d,kWh,4568,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcOut,d,kWh,4570,uint32,100,R +com.victronenergy.multi,/Energy/SolarToBattery,d,kWh,4572,uint32,100,R +com.victronenergy.multi,/History/Daily/0/Yield,d,kWh,4574,uint16,10,R +com.victronenergy.multi,/History/Daily/0/MaxPower,d,W,4575,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Yield,d,kWh,4576,uint16,10,R +com.victronenergy.multi,/History/Daily/1/MaxPower,d,W,4577,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/0/Yield,d,kWh,4578,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/1/Yield,d,kWh,4579,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/2/Yield,d,kWh,4580,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/3/Yield,d,kWh,4581,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/0/Yield,d,kWh,4582,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/1/Yield,d,kWh,4583,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/2/Yield,d,kWh,4584,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/3/Yield,d,kWh,4585,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/0/MaxPower,d,W,4586,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/1/MaxPower,d,W,4587,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/2/MaxPower,d,W,4588,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/3/MaxPower,d,W,4589,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/0/MaxPower,d,W,4590,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/1/MaxPower,d,W,4591,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/2/MaxPower,d,W,4592,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/3/MaxPower,d,W,4593,uint16,1,R +com.victronenergy.multi,/Pv/0/V,d,V DC,4594,uint16,10,R +com.victronenergy.multi,/Pv/1/V,d,V DC,4595,uint16,10,R +com.victronenergy.multi,/Pv/2/V,d,V DC,4596,uint16,10,R +com.victronenergy.multi,/Pv/3/V,d,V DC,4597,uint16,10,R +com.victronenergy.multi,/Pv/0/P,d,W,4598,uint16,1,R +com.victronenergy.multi,/Pv/1/P,d,W,4599,uint16,1,R +com.victronenergy.multi,/Pv/2/P,d,W,4600,uint16,1,R +com.victronenergy.multi,/Pv/3/P,d,W,4601,uint16,1,R +com.victronenergy.multi,/Alarms/LowSoc,u,,4602,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4603,uint32,1,R +com.victronenergy.multi,/Pv/0/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4605,uint16,1,R +com.victronenergy.multi,/Pv/1/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4606,uint16,1,R +com.victronenergy.multi,/Pv/2/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4607,uint16,1,R +com.victronenergy.multi,/Pv/3/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4608,uint16,1,R +com.victronenergy.pump,/State,d,0=Stopped;1=Running,4700,uint16,1,R +com.victronenergy.settings,/Settings/Pump0/AutoStartEnabled,d,0=Disabled;1=Enabled,4701,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/Mode,d,0=Auto;1=On;2=Off,4702,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/StartValue,d,%,4703,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/StopValue,d,%,4704,uint16,1,W diff --git a/FileSets/v3.20~33/attributes.csv.orig b/FileSets/v3.20~33/attributes.csv.orig new file mode 100644 index 00000000..d9b38c04 --- /dev/null +++ b/FileSets/v3.20~33/attributes.csv.orig @@ -0,0 +1,668 @@ +com.victronenergy.gps,/Position/Latitude,d,Decimal degrees,2800,int32,10000000,R +com.victronenergy.gps,/Position/Longitude,d,Decimal degrees,2802,int32,10000000,R +com.victronenergy.gps,/Course,d,Degrees,2804,uint16,100,R +com.victronenergy.gps,/Speed,d,m/s,2805,uint16,100,R +com.victronenergy.gps,/Fix,y,,2806,uint16,1,R +com.victronenergy.gps,/NrOfSatellites,y,,2807,uint16,1,R +com.victronenergy.gps,/Altitude,d,m,2808,int32,10,R +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/State,i,0=BL disabled;1=Restarting;2=Self-consumption;3=Self-consumption;4=Self-consumption;5=Discharge disabled;6=Force charge;7=Sustain;9=Keep batteries charged;10=BL Disabled;11=BL Disabled (Low SoC),2900,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/MinimumSocLimit,d,%,2901,uint16,10,W +com.victronenergy.settings,/Settings/CGwacs/Hub4Mode,i,1=ESS with Phase Compensation;2=ESS without phase compensation;3=Disabled/External Control,2902,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/SocLimit,d,%,2903,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/V,d,V AC,3,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/V,d,V AC,4,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/V,d,V AC,5,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/I,d,A AC,6,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/I,d,A AC,7,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/I,d,A AC,8,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/F,d,Hz,9,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/F,d,Hz,10,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/F,d,Hz,11,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/P,i,VA or Watts,12,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/P,i,VA or Watts,13,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/P,i,VA or Watts,14,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L1/V,d,V AC,15,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L2/V,d,V AC,16,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L3/V,d,V AC,17,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L1/I,d,A AC,18,int16,10,R +com.victronenergy.vebus,/Ac/Out/L2/I,d,A AC,19,int16,10,R +com.victronenergy.vebus,/Ac/Out/L3/I,d,A AC,20,int16,10,R +com.victronenergy.vebus,/Ac/Out/L1/F,d,Hz,21,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/CurrentLimit,d,A,22,int16,10,W +com.victronenergy.vebus,/Ac/Out/L1/P,i,VA or Watts,23,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L2/P,i,VA or Watts,24,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L3/P,i,VA or Watts,25,int16,0.1,R +com.victronenergy.vebus,/Dc/0/Voltage,d,V DC,26,uint16,100,R +com.victronenergy.vebus,/Dc/0/Current,d,A DC,27,int16,10,R +com.victronenergy.vebus,/Ac/NumberOfPhases,u,count,28,uint16,1,R +com.victronenergy.vebus,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,29,uint16,1,R +com.victronenergy.vebus,/Soc,d,%,30,uint16,10,W +com.victronenergy.vebus,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=External control,31,uint16,1,R +com.victronenergy.vebus,/VebusError,u,0=No error;1=VE.Bus Error 1: Device is switched off because one of the other phases in the system has switched off;2=VE.Bus Error 2: New and old types MK2 are mixed in the system;3=VE.Bus Error 3: Not all- or more than- the expected devices were found in the system;4=VE.Bus Error 4: No other device whatsoever detected;5=VE.Bus Error 5: Overvoltage on AC-out;6=VE.Bus Error 6: Error in DDC Program;7=VE.Bus BMS connected- which requires an Assistant- but no assistant found;10=VE.Bus Error 10: System time synchronisation problem occurred;14=VE.Bus Error 14: Device cannot transmit data;16=VE.Bus Error 16: Dongle missing;17=VE.Bus Error 17: One of the devices assumed master status because the original master failed;18=VE.Bus Error 18: AC Overvoltage on the output of a slave has occurred while already switched off;22=VE.Bus Error 22: This device cannot function as slave;24=VE.Bus Error 24: Switch-over system protection initiated;25=VE.Bus Error 25: Firmware incompatibility. The firmware of one of the connected device is not sufficiently up to date to operate in conjunction with this device;26=VE.Bus Error 26: Internal error,32,uint16,1,R +com.victronenergy.vebus,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,33,uint16,1,W +com.victronenergy.vebus,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,34,uint16,1,R +com.victronenergy.vebus,/Alarms/LowBattery,u,0=Ok;1=Warning;2=Alarm,35,uint16,1,R +com.victronenergy.vebus,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,36,uint16,1,R +com.victronenergy.vebus,/Alarms/TemperatureSensor,u,0=Ok;1=Warning;2=Alarm,42,uint16,1,R +com.victronenergy.vebus,/Alarms/VoltageSensor,u,0=Ok;1=Warning;2=Alarm,43,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/HighTemperature,u,0=Ok;1=Warning;2=Alarm,44,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/LowBattery,u,0=Ok;1=Warning;2=Alarm,45,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Overload,u,0=Ok;1=Warning;2=Alarm,46,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Ripple,u,0=Ok;1=Warning;2=Alarm,47,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/HighTemperature,u,0=Ok;1=Warning;2=Alarm,48,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/LowBattery,u,0=Ok;1=Warning;2=Alarm,49,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Overload,u,0=Ok;1=Warning;2=Alarm,50,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Ripple,u,0=Ok;1=Warning;2=Alarm,51,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/HighTemperature,u,0=Ok;1=Warning;2=Alarm,52,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/LowBattery,u,0=Ok;1=Warning;2=Alarm,53,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Overload,u,0=Ok;1=Warning;2=Alarm,54,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Ripple,u,0=Ok;1=Warning;2=Alarm,55,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,37,int16,1,W +com.victronenergy.vebus,/Hub4/DisableCharge,u,0=Charge allowed;1=Charge disabled,38,uint16,1,W +com.victronenergy.vebus,/Hub4/DisableFeedIn,u,0=Feed in allowed;1=Feed in disabled,39,uint16,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,40,int16,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,41,int16,1,W +com.victronenergy.vebus,/PvInverter/Disable,u,0=PV enabled;1=PV disabled,56,uint16,1,W +com.victronenergy.vebus,/Bms/AllowToCharge,u,0=No;1=Yes,57,uint16,1,R +com.victronenergy.vebus,/Bms/AllowToDischarge,u,0=No;1=Yes,58,uint16,1,R +com.victronenergy.vebus,/Bms/BmsExpected,u,0=No;1=Yes,59,uint16,1,R +com.victronenergy.vebus,/Bms/Error,u,0=No;1=Yes,60,uint16,1,R +com.victronenergy.vebus,/Dc/0/Temperature,d,Degrees celsius,61,int16,10,R +com.victronenergy.vebus,/SystemReset,y,0=No action;1=VE.Bus Reset,62,uint16,1,W +com.victronenergy.vebus,/Alarms/PhaseRotation,u,0=Ok;1=Warning,63,uint16,1,R +com.victronenergy.vebus,/Alarms/GridLost,i,0=No alarm;2=Alarm,64,uint16,1,R +com.victronenergy.vebus,/Alarms/BmsPreAlarm,u,0=OK;1=Pre-Alarm,94,uint16,1,R +com.victronenergy.vebus,/Hub4/DoNotFeedInOvervoltage,i,0=Feed in overvoltage;1=Don't feed in overvoltage,65,uint16,1,W +com.victronenergy.vebus,/Hub4/L1/MaxFeedInPower,d,W,66,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L2/MaxFeedInPower,d,W,67,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L3/MaxFeedInPower,d,W,68,uint16,0.01,W +com.victronenergy.vebus,/Ac/State/IgnoreAcIn1,i,0=AC input not ignored; 1=AC input ignored,69,uint16,1,R +com.victronenergy.vebus,/Ac/State/IgnoreAcIn2,i,0=AC input not ignored; 1=AC input ignored,70,uint16,1,R +com.victronenergy.vebus,/Hub4/TargetPowerIsMaxFeedIn,i,0=AcPowerSetpoint interpreted normally; 1=AcPowerSetpoint as OvervoltageFeedIn limit,71,uint16,,W +com.victronenergy.vebus,/Hub4/FixSolarOffsetTo100mV,i,0=OvervoltageFeedIn uses 1V offset; 1=OvervoltageFeedIn uses 0.1V offset,72,uint16,,W +com.victronenergy.vebus,/Hub4/Sustain,i,0=Sustain inactive; 1=Sustain active,73,uint16,1,R +com.victronenergy.vebus,/Energy/AcIn1ToAcOut,d,kWh,74,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn1ToInverter,d,kWh,76,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToAcOut,d,kWh,78,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToInverter,d,kWh,80,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn1,d,kWh,82,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn2,d,kWh,84,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn1,d,kWh,86,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn2,d,kWh,88,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcOut,d,kWh,90,uint32,100,R +com.victronenergy.vebus,/Energy/OutToInverter,d,kWh,92,uint32,100,R +com.victronenergy.vebus,/VebusChargeState,u,0=Initialising;1=Bulk;2=Absorption;3=Float;4=Storage;5=Absorb repeat;6=Forced absorb;7=Equalise;8=Bulk stopped;9=Unknown,95,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,96,int32,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,98,int32,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,100,int32,1,W +com.victronenergy.vebus,/Dc/0/PreferRenewableEnergy,i,0=Not preferred;1=Preferred,102,uint16,1,W +com.victronenergy.vebus,/Ac/Control/RemoteGeneratorSelected,i,0=Generator not selected;1=Generator selected,103,uint16,1,W +com.victronenergy.vebus,/Ac/State/RemoteGeneratorSelected,i,0=Generator not selected;1=Generator selected,104,uint16,1,R +com.victronenergy.battery,/Dc/0/Power,i,W,258,int16,1,R +com.victronenergy.battery,/Dc/0/Voltage,d,V DC,259,uint16,100,R +com.victronenergy.battery,/Dc/1/Voltage,d,V DC,260,uint16,100,R +com.victronenergy.battery,/Dc/0/Current,d,A DC,261,int16,10,R +com.victronenergy.battery,/Dc/0/Temperature,d,Degrees celsius,262,int16,10,R +com.victronenergy.battery,/Dc/0/MidVoltage,d,V DC,263,uint16,100,R +com.victronenergy.battery,/Dc/0/MidVoltageDeviation,d,%,264,uint16,100,R +com.victronenergy.battery,/ConsumedAmphours,d,Ah,265,uint16,-10,R +com.victronenergy.battery,/Soc,y,%,266,uint16,10,R +com.victronenergy.battery,/Soh,y,%,304,uint16,10,R +com.victronenergy.battery,/TimeToGo,q,seconds,303,uint16,0.01,R +com.victronenergy.battery,/Info/MaxChargeVoltage,u,V DC,305,uint16,10,R +com.victronenergy.battery,/Info/BatteryLowVoltage,u,V DC,306,uint16,10,R +com.victronenergy.battery,/Info/MaxChargeCurrent,u,A DC,307,uint16,10,R +com.victronenergy.battery,/Info/MaxDischargeCurrent,u,A DC,308,uint16,10,R +com.victronenergy.battery,/Alarms/Alarm,y,0=No alarm;2=Alarm,267,uint16,1,R +com.victronenergy.battery,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,268,uint16,1,R +com.victronenergy.battery,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,269,uint16,1,R +com.victronenergy.battery,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,270,uint16,1,R +com.victronenergy.battery,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,271,uint16,1,R +com.victronenergy.battery,/Alarms/LowSoc,u,0=No alarm;2=Alarm,272,uint16,1,R +com.victronenergy.battery,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,273,uint16,1,R +com.victronenergy.battery,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,274,uint16,1,R +com.victronenergy.battery,/Alarms/MidVoltage,u,0=No alarm;2=Alarm,275,uint16,1,R +com.victronenergy.battery,/Alarms/LowFusedVoltage,u,0=No alarm;2=Alarm,276,uint16,1,R +com.victronenergy.battery,/Alarms/HighFusedVoltage,u,0=No alarm;2=Alarm,277,uint16,1,R +com.victronenergy.battery,/Alarms/FuseBlown,u,0=No alarm;2=Alarm,278,uint16,1,R +com.victronenergy.battery,/Alarms/HighInternalTemperature,u,0=No alarm;2=Alarm,279,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeCurrent,u,0=No alarm;2=Alarm,320,uint16,1,R +com.victronenergy.battery,/Alarms/HighDischargeCurrent,u,0=No alarm;2=Alarm,321,uint16,1,R +com.victronenergy.battery,/Alarms/CellImbalance,u,0=No alarm;2=Alarm,322,uint16,1,R +com.victronenergy.battery,/Alarms/InternalFailure,u,0=No alarm;2=Alarm,323,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeTemperature,u,0=No alarm;2=Alarm,324,uint16,1,R +com.victronenergy.battery,/Alarms/LowChargeTemperature,u,0=No alarm;2=Alarm,325,uint16,1,R +com.victronenergy.battery,/Alarms/LowCellVoltage,u,0=No alarm;1=Almost discharged;2=Alarm,326,uint16,1,R +com.victronenergy.battery,/Relay/0/State,y,0=Open;1=Closed,280,uint16,1,W +com.victronenergy.battery,/History/DeepestDischarge,d,Ah,281,uint16,-10,R +com.victronenergy.battery,/History/LastDischarge,d,Ah,282,uint16,-10,R +com.victronenergy.battery,/History/AverageDischarge,d,Ah,283,uint16,-10,R +com.victronenergy.battery,/History/ChargeCycles,i,count,284,uint16,1,R +com.victronenergy.battery,/History/FullDischarges,i,count,285,uint16,1,R +com.victronenergy.battery,/History/TotalAhDrawn,d,Ah,286,uint16,-10,R +com.victronenergy.battery,/History/MinimumVoltage,d,V DC,287,uint16,100,R +com.victronenergy.battery,/History/MaximumVoltage,d,V DC,288,uint16,100,R +com.victronenergy.battery,/History/TimeSinceLastFullCharge,i,seconds,289,uint16,0.01,R +com.victronenergy.battery,/History/AutomaticSyncs,i,count,290,uint16,1,R +com.victronenergy.battery,/History/LowVoltageAlarms,i,count,291,uint16,1,R +com.victronenergy.battery,/History/HighVoltageAlarms,i,count,292,uint16,1,R +com.victronenergy.battery,/History/LowStarterVoltageAlarms,i,count,293,uint16,1,R +com.victronenergy.battery,/History/HighStarterVoltageAlarms,i,count,294,uint16,1,R +com.victronenergy.battery,/History/MinimumStarterVoltage,d,V DC,295,uint16,100,R +com.victronenergy.battery,/History/MaximumStarterVoltage,d,V DC,296,uint16,100,R +com.victronenergy.battery,/History/LowFusedVoltageAlarms,i,count,297,uint16,1,R +com.victronenergy.battery,/History/HighFusedVoltageAlarms,i,count,298,uint16,1,R +com.victronenergy.battery,/History/MinimumFusedVoltage,d,V DC,299,uint16,100,R +com.victronenergy.battery,/History/MaximumFusedVoltage,d,V DC,300,uint16,100,R +com.victronenergy.battery,/History/DischargedEnergy,d,kWh,301,uint16,10,R +com.victronenergy.battery,/History/ChargedEnergy,d,kWh,302,uint16,10,R +com.victronenergy.battery,/Capacity,d,Ah,309,uint16,10,R +com.victronenergy.battery,/State,y,0=Initializing (Wait start);1=Initializing (before boot);2=Initializing (Before boot delay);3=Initializing (Wait boot);4=Initializing;5=Initializing (Measure battery voltage);6=Initializing (Calculate battery voltage);7=Initializing (Wait bus voltage);8=Initializing (Wait for lynx shunt);9=Running;10=Error;11=Unused;12=Shutdown;13=Slave updating;14=Standby;15=Going to run;16=Per-charging;17=Contactor check,1282,uint16,1,R +com.victronenergy.battery,/ErrorCode,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1283,uint16,1,R +com.victronenergy.battery,/SystemSwitch,y,0=Disabled;1=Enabled,1284,uint16,1,R +com.victronenergy.battery,/Balancing,y,0=Inactive;1=Active,1285,uint16,1,R +com.victronenergy.battery,/System/NrOfBatteries,y,count,1286,uint16,1,R +com.victronenergy.battery,/System/BatteriesParallel,y,count,1287,uint16,1,R +com.victronenergy.battery,/System/BatteriesSeries,y,count,1288,uint16,1,R +com.victronenergy.battery,/System/NrOfCellsPerBattery,y,count,1289,uint16,1,R +com.victronenergy.battery,/System/MinCellVoltage,d,V DC,1290,uint16,100,R +com.victronenergy.battery,/System/MaxCellVoltage,d,V DC,1291,uint16,100,R +com.victronenergy.battery,/Diagnostics/ShutDownsDueError,q,count,1292,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1293,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1294,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1295,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1296,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Time,u,,310,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Time,u,,312,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Time,u,,314,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Time,u,,316,int32,1,R +com.victronenergy.battery,/System/MinCellTemperature,d,Degrees celsius,318,int16,10,R +com.victronenergy.battery,/System/MaxCellTemperature,d,Degrees celsius,319,int16,10,R +com.victronenergy.battery,/Io/AllowToCharge,y,0=No;1=Yes,1297,uint16,1,R +com.victronenergy.battery,/Io/AllowToDischarge,y,0=No;1=Yes,1298,uint16,1,R +com.victronenergy.battery,/Io/ExternalRelay,y,0=Inactive;1=Active,1299,uint16,1,R +com.victronenergy.battery,/History/MinimumCellVoltage,d,V DC,1300,uint16,100,R +com.victronenergy.battery,/History/MaximumCellVoltage,d,V DC,1301,uint16,100,R +com.victronenergy.battery,/System/NrOfModulesOffline,u,,1302,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesOnline,u,,1303,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingCharge,u,,1304,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingDischarge,u,,1305,uint16,1,R +com.victronenergy.battery,/System/MinVoltageCellId,s,,1306,string[4],1,R +com.victronenergy.battery,/System/MaxVoltageCellId,s,,1310,string[4],1,R +com.victronenergy.battery,/System/MinTemperatureCellId,s,,1314,string[4],1,R +com.victronenergy.battery,/System/MaxTemperatureCellId,s,,1318,string[4],1,R +com.victronenergy.battery,/Mode,i,3=On;252=Standby,1319,uint16,1,W +com.victronenergy.solarcharger,/Dc/0/Voltage,d,V DC,771,uint16,100,R +com.victronenergy.solarcharger,/Dc/0/Current,d,A DC,772,int16,10,R +com.victronenergy.solarcharger,/Dc/0/Temperature,d,Degrees celsius,773,int16,10,R +com.victronenergy.solarcharger,/Mode,i,1=On;4=Off,774,uint16,1,W +com.victronenergy.solarcharger,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;11=Other (Hub-1);252=Hub-1,775,uint16,1,R +com.victronenergy.solarcharger,/Pv/V,d,V DC,776,uint16,100,R +com.victronenergy.solarcharger,/Pv/I,d,A DC,777,,10,R,HANDLED IN mappings.c +com.victronenergy.solarcharger,/Yield/Power,d,W,789,uint16,10,R +com.victronenergy.solarcharger,/Equalization/Pending,i,0=No;1=Yes;2=Error;3=Unavailable- Unknown,778,uint16,1,R +com.victronenergy.solarcharger,/Equalization/TimeRemaining,d,seconds,779,uint16,10,R +com.victronenergy.solarcharger,/Relay/0/State,i,0=Open;1=Closed,780,uint16,1,R +com.victronenergy.solarcharger,/Alarms/Alarm,i,0=No alarm;2=Alarm,781,uint16,1,R +com.victronenergy.solarcharger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,782,uint16,1,R +com.victronenergy.solarcharger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,783,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Yield,d,kWh,784,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/MaxPower,d,W,785,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Yield,d,kWh,786,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/MaxPower,d,W,787,uint16,1,R +com.victronenergy.solarcharger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,788,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,790,uint16,10,R +com.victronenergy.solarcharger,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,791,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/V,d,V DC,3700,uint16,100,R +com.victronenergy.solarcharger,/Pv/1/V,d,V DC,3701,uint16,100,R +com.victronenergy.solarcharger,/Pv/2/V,d,V DC,3702,uint16,100,R +com.victronenergy.solarcharger,/Pv/3/V,d,V DC,3703,uint16,100,R +com.victronenergy.solarcharger,RESERVED,d,,3704,reserved[4],1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/Yield,d,kWh,3708,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/Yield,d,kWh,3709,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/Yield,d,kWh,3710,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/Yield,d,kWh,3711,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/Yield,d,kWh,3712,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/Yield,d,kWh,3713,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/Yield,d,kWh,3714,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/Yield,d,kWh,3715,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/MaxPower,d,W,3716,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/MaxPower,d,W,3717,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/MaxPower,d,W,3718,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/MaxPower,d,W,3719,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/MaxPower,d,W,3720,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/MaxPower,d,W,3721,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/MaxPower,d,W,3722,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/MaxPower,d,W,3723,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/P,d,W,3724,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/P,d,W,3725,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/P,d,W,3726,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/P,d,W,3727,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,3728,uint32,1,R +com.victronenergy.solarcharger,/Yield/Power,d,W,3730,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3731,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3732,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3733,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3734,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L1/Power,d,W,808,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L2/Power,d,W,809,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L3/Power,d,W,810,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L1/Power,d,W,811,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L2/Power,d,W,812,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L3/Power,d,W,813,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L1/Power,d,W,814,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L2/Power,d,W,815,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L3/Power,d,W,816,uint16,1,R +com.victronenergy.system,/Dc/Pv/Power,d,W,850,uint16,1,R +com.victronenergy.system,/Dc/Pv/Current,d,A DC,851,int16,10,R +com.victronenergy.system,/Dc/Charger/Power,d,W,855,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L1/Power,d,W,817,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L2/Power,d,W,818,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L3/Power,d,W,819,uint16,1,R +com.victronenergy.system,/Ac/Grid/L1/Power,d,W,820,int16,1,R +com.victronenergy.system,/Ac/Grid/L2/Power,d,W,821,int16,1,R +com.victronenergy.system,/Ac/Grid/L3/Power,d,W,822,int16,1,R +com.victronenergy.system,/Ac/Genset/L1/Power,d,W,823,int16,1,R +com.victronenergy.system,/Ac/Genset/L2/Power,d,W,824,int16,1,R +com.victronenergy.system,/Ac/Genset/L3/Power,d,W,825,int16,1,R +com.victronenergy.system,/Ac/ActiveIn/Source,u,0=Not available;1=Grid;2=Generator;3=Shore power;240=Not connected,826,int16,1,R +com.victronenergy.system,/Dc/System/Power,d,W,860,int16,1,R +com.victronenergy.system,/Dc/Battery/Voltage,d,V DC,840,uint16,10,R +com.victronenergy.system,/Dc/Battery/Current,d,A DC,841,int16,10,R +com.victronenergy.system,/Dc/Battery/Power,d,W,842,int16,1,R +com.victronenergy.system,/Dc/Vebus/Current,d,A DC,865,int16,10,R +com.victronenergy.system,/Dc/Vebus/Power,d,W,866,int16,1,R +com.victronenergy.system,/Dc/Battery/Soc,d,%,843,uint16,1,R +com.victronenergy.system,/Dc/Battery/State,i,0=idle;1=charging;2=discharging,844,uint16,1,R +com.victronenergy.system,/Dc/Battery/ConsumedAmphours,d,Ah,845,uint16,-10,R +com.victronenergy.system,/Dc/Battery/TimeToGo,d,s,846,uint16,0.01,R +com.victronenergy.system,/Relay/0/State,i,0=Open;1=Closed,806,uint16,1,W +com.victronenergy.system,/Relay/1/State,i,0=Open;1=Closed,807,uint16,1,W +com.victronenergy.system,/Serial,s,,800,string[6],1,R +com.victronenergy.pvinverter,/Position,i,0=AC input 1;1=AC output;2=AC input 2,1026,uint16,1,R +com.victronenergy.pvinverter,/Serial,s,,1039,string[7],1,R +com.victronenergy.pvinverter,/Ac/L1/Voltage,d,V AC,1027,uint16,10,R +com.victronenergy.pvinverter,/Ac/L1/Current,d,A AC,1028,int16,10,R +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1029,uint16,1,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1030,uint16,100,R +com.victronenergy.pvinverter,/Ac/L2/Voltage,d,V AC,1031,uint16,10,R +com.victronenergy.pvinverter,/Ac/L2/Current,d,A AC,1032,int16,10,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1033,uint16,1,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1034,uint16,100,R +com.victronenergy.pvinverter,/Ac/L3/Voltage,d,V AC,1035,uint16,10,R +com.victronenergy.pvinverter,/Ac/L3/Current,d,A AC,1036,int16,10,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1037,uint16,1,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1038,uint16,100,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1046,uint32,100,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1048,uint32,100,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1050,uint32,100,R +com.victronenergy.pvinverter,/Ac/Power,i,kW,1052,int32,1,W +com.victronenergy.pvinverter,/Ac/MaxPower,u,kW,1054,uint32,1,W +com.victronenergy.pvinverter,/Ac/PowerLimit,u,kW,1056,uint32,1,W +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1058,uint32,1,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1060,uint32,1,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1062,uint32,1,R +com.victronenergy.motordrive,/Motor/RPM,d,RPM,2048,int16,1,R +com.victronenergy.motordrive,/Motor/Temperature,d,Degrees celsius,2049,int16,10,R +com.victronenergy.motordrive,/Dc/0/Voltage,d,V DC,2050,uint16,100,R +com.victronenergy.motordrive,/Dc/0/Current,d,A DC,2051,int16,10,R +com.victronenergy.motordrive,/Dc/0/Power,d,W,2052,int16,10,R +com.victronenergy.motordrive,/Controller/Temperature,d,Degrees celsius,2053,int16,10,R +com.victronenergy.charger,/Dc/0/Voltage,d,V DC,2307,uint16,100,R +com.victronenergy.charger,/Dc/0/Current,d,A DC,2308,int16,10,R +com.victronenergy.charger,/Dc/0/Temperature,d,Degrees celsius,2309,int16,10,R +com.victronenergy.charger,/Dc/1/Voltage,d,V DC,2310,uint16,100,R +com.victronenergy.charger,/Dc/1/Current,d,A DC,2311,int16,10,R +com.victronenergy.charger,/Dc/2/Voltage,d,V DC,2312,uint16,100,R +com.victronenergy.charger,/Dc/2/Current,d,A DC,2313,int16,10,R +com.victronenergy.charger,/Ac/In/L1/I,d,A AC,2314,int16,10,R +com.victronenergy.charger,/Ac/In/L1/P,d,W DC,2315,uint16,1,R +com.victronenergy.charger,/Ac/In/CurrentLimit,d,A AC,2316,int16,10,W +com.victronenergy.charger,/Mode,i,0=Off;1=On;2=Error;3=Unavailable- Unknown,2317,uint16,1,W +com.victronenergy.charger,/State,i,0=Off;1=Low Power Mode;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply mode;252=External control,2318,uint16,1,R +com.victronenergy.charger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,2319,uint16,1,R +com.victronenergy.charger,/Relay/0/State,i,0=Open;1=Closed,2320,uint16,1,R +com.victronenergy.charger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,2321,uint16,1,R +com.victronenergy.charger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,2322,uint16,1,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2600,int16,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2601,int16,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2602,int16,1,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2603,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2604,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2605,uint16,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2606,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2607,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2608,uint16,100,R +com.victronenergy.grid,/Serial,s,,2609,string[7],,R +com.victronenergy.grid,/Ac/L1/Voltage,d,V AC,2616,uint16,10,R +com.victronenergy.grid,/Ac/L1/Current,d,A AC,2617,int16,10,R +com.victronenergy.grid,/Ac/L2/Voltage,d,V AC,2618,uint16,10,R +com.victronenergy.grid,/Ac/L2/Current,d,A AC,2619,int16,10,R +com.victronenergy.grid,/Ac/L3/Voltage,d,V AC,2620,uint16,10,R +com.victronenergy.grid,/Ac/L3/Current,d,A AC,2621,int16,10,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2622,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2624,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2626,uint32,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2628,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2630,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2632,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Forward,d,kWh,2634,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Reverse,d,kWh,2636,uint32,100,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2638,int32,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2640,int32,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2642,int32,1,R +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2700,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2703,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/MaxChargePercentage,d,%,2701,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePercentage,d,%,2702,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePower,d,W,2704,int16,0.1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeCurrent,d,A,2705,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxFeedInPower,d,W,2706,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/OvervoltageFeedIn,i,0=Don't feed excess DC-coupled PV into grid;1=Feed excess DC-coupled PV into the grid,2707,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/PreventFeedback,i,0=Feed excess AC-coupled PV into grid;1=Don't feed excess AC-coupled PV into the grid,2708,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeVoltage,d,V,2710,uint16,10,W +com.victronenergy.settings,/Settings/SystemSetup/AcInput1,u,0=Unused;1=Grid;2=Genset;3=Shore,2711,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/AcInput2,u,0=Unused;1=Grid;2=Genset;3=Shore,2712,uint16,1,W +com.victronenergy.hub4,/PvPowerLimiterActive,i,0=Feed-in limiting inactive;1=Feed-in limiting active,2709,uint16,1,R +com.victronenergy.tank,/ProductId,u,,3000,uint16,1,R +com.victronenergy.tank,/Capacity,d,m3,3001,uint32,10000,R +com.victronenergy.tank,/FluidType,u,0=Fuel;1=Fresh water;2=Waste water;3=Live well;4=Oil;5=Black water (sewage);6=Gasoline;7=Diesel;8=LPG;9=LNG;10=Hydraulic oil;11=Raw water,3003,uint16,1,R +com.victronenergy.tank,/Level,d,%,3004,uint16,10,R +com.victronenergy.tank,/Remaining,d,m3,3005,uint32,10000,R +com.victronenergy.tank,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3007,uint16,1,R +com.victronenergy.inverter,/ProductId,u,,3127,uint16,1,R +com.victronenergy.inverter,/FirmwareVersion,u,,3125,uint16,1,R +com.victronenergy.inverter,/Ac/Out/L1/I,d,A AC,3100,int16,10,R +com.victronenergy.inverter,/Ac/Out/L1/V,d,V AC,3101,uint16,10,R +com.victronenergy.inverter,/Ac/Out/L1/P,d,W AC,3102,int16,0.1,R +com.victronenergy.inverter,/Alarms/HighTemperature,u,0=No alarm;1=Warning;2=Alarm,3110,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltage,u,0=No alarm;1=Warning;2=Alarm,3111,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3112,uint16,1,R +com.victronenergy.inverter,/Alarms/LowTemperature,u,0=No alarm;1=Warning;2=Alarm,3113,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltage,u,0=No alarm;1=Warning;2=Alarm,3114,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3115,uint16,1,R +com.victronenergy.inverter,/Alarms/Overload,u,0=No alarm;1=Warning;2=Alarm,3116,uint16,1,R +com.victronenergy.inverter,/Alarms/Ripple,u,0=No alarm;1=Warning;2=Alarm,3117,uint16,1,R +com.victronenergy.inverter,/Dc/0/Voltage,d,V DC,3105,uint16,100,R +com.victronenergy.inverter,/Dc/0/Current,d,A DC,3106,int16,10,R +com.victronenergy.inverter,/Mode,u,2=On;4=Off;5=Eco,3126,uint16,1,W +com.victronenergy.inverter,/State,u,0=Off;1=Low power mode (search mode);2=Fault;9=Inverting (on),3128,uint16,1,R +com.victronenergy.inverter,/Energy/InverterToAcOut,d,kWh,3130,uint32,100,R +com.victronenergy.inverter,/Energy/OutToInverter,d,kWh,3132,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToAcOut,d,kWh,3134,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToBattery,d,kWh,3136,uint32,100,R +com.victronenergy.inverter,/Pv/V,d,V DC,3138,uint16,10,R +com.victronenergy.inverter,/Pv/0/V,d,V DC,3140,uint16,10,R +com.victronenergy.inverter,/Pv/1/V,d,V DC,3141,uint16,10,R +com.victronenergy.inverter,/Pv/2/V,d,V DC,3142,uint16,10,R +com.victronenergy.inverter,/Pv/3/V,d,V DC,3143,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/Yield,d,kWh,3148,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/Yield,d,kWh,3149,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/Yield,d,kWh,3150,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/Yield,d,kWh,3151,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/Yield,d,kWh,3152,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/Yield,d,kWh,3153,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/Yield,d,kWh,3154,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/Yield,d,kWh,3155,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/MaxPower,d,W,3156,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/MaxPower,d,W,3157,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/MaxPower,d,W,3158,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/MaxPower,d,W,3159,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/MaxPower,d,W,3160,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/MaxPower,d,W,3161,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/MaxPower,d,W,3162,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/MaxPower,d,W,3163,uint16,1,R +com.victronenergy.inverter,/Pv/0/P,d,W,3164,uint16,1,R +com.victronenergy.inverter,/Pv/1/P,d,W,3165,uint16,1,R +com.victronenergy.inverter,/Pv/2/P,d,W,3166,uint16,1,R +com.victronenergy.inverter,/Pv/3/P,d,W,3167,uint16,1,R +com.victronenergy.inverter,/Alarms/LowSoc,u,,3168,uint16,1,R +com.victronenergy.inverter,/Pv/0/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3169,uint16,1,R +com.victronenergy.inverter,/Pv/1/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3170,uint16,1,R +com.victronenergy.inverter,/Pv/2/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3171,uint16,1,R +com.victronenergy.inverter,/Pv/3/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3172,uint16,1,R +com.victronenergy.genset,/ProductId,u,,3212,uint16,1,R +com.victronenergy.genset,/StatusCode,u,0=Standby;1=Startup 1;2=Startup 2;3=Startup 3;4=Startup 4;5=Startup 5;6=Startup 6;7=Startup 7;8=Running;9=Stopping;10=Error,3213,uint16,1,R +com.victronenergy.genset,/ErrorCode,u,0=No error;1=AC voltage L1 too low;2=AC frequency L1 too low;3=AC current too low;4=AC power too low;5=Emergency stop;6=Servo current too low;7=Oil pressure too low;8=Engine temperature too low;9=Winding temperature too low;10=Exhaust temperature too low;13=Starter current too low;14=Glow current too low;15=Glow current too low;16=Fuel holding magnet current too low;17=Stop solenoid hold coil current too low;18=Stop solenoid pull coil current too low;19=Optional DC out current too low;20=5V output voltage too low;21=Boost output current too low;22=Panel supply current too high;25=Starter battery voltage too low;26=Startup aborted (rotation too low);28=Rotation too low;29=Power contactor current too low;30=AC voltage L2 too low;31=AC frequency L2 too low;32=AC current L2 too low;33=AC power L2 too low;34=AC voltage L3 too low;35=AC frequency L3 too low;36=AC current L3 too low;37=AC power L3 too low;62=Fuel temperature too low;63=Fuel level too low;65=AC voltage L1 too high;66=AC frequency too high;67=AC current too high;68=AC power too high;70=Servo current too high;71=Oil pressure too high;72=Engine temperature too high;73=Winding temperature too high;74=Exhaust temperature too low;77=Starter current too low;78=Glow current too high;79=Glow current too high;80=Fuel holding magnet current too high;81=Stop solenoid hold coil current too high;82=Stop solenoid pull coil current too high;83=Optional DC out current too high;84=5V output voltage too high;85=Boost output current too high;89=Starter battery voltage too high;90=Startup aborted (rotation too high);92=Rotation too high;93=Power contactor current too high;94=AC voltage L2 too high;95=AC frequency L2 too high;96=AC current L2 too high;97=AC power L2 too high;98=AC voltage L3 too high;99=AC frequency L3 too high;100=AC current L3 too high;101=AC power L3 too high;126=Fuel temperature too high;127=Fuel level too high;130=Lost control unit;131=Lost panel;132=Service needed;133=Lost 3-phase module;134=Lost AGT module;135=Synchronization failure;137=Intake airfilter;139=Lost sync. module;140=Load-balance failed;141=Sync-mode deactivated;142=Engine controller;148=Rotating field wrong;149=Fuel level sensor lost;150=Init failed;151=Watchdog;152=Out: winding;153=Out: exhaust;154=Out: Cyl. head;155=Inverter over temperature;156=Inverter overload;157=Inverter communication lost;158=Inverter sync failed;159=CAN communication lost;160=L1 overload;161=L2 overload;162=L3 overload;163=DC overload;164=DC overvoltage;165=Emergency stop;166=No connection,3214,uint16,1,R +com.victronenergy.genset,/AutoStart,u,0=Disabled;1=Enabled,3215,uint16,1,R +com.victronenergy.genset,/Start,u,0=Stop;1=Start,3223,uint16,1,W +com.victronenergy.genset,/Engine/Load,d,%,3216,uint16,1,R +com.victronenergy.genset,/Engine/Speed,d,RPM,3217,uint16,1,R +com.victronenergy.genset,/Engine/OperatingHours,d,s,3218,uint16,0.01,R +com.victronenergy.genset,/Engine/CoolantTemperature,d,Degrees celsius,3219,int16,10,R +com.victronenergy.genset,/Engine/WindingTemperature,d,Degrees celsius,3220,int16,10,R +com.victronenergy.genset,/Engine/ExaustTemperature,d,Degrees celsius,3221,int16,10,R +com.victronenergy.genset,/StarterVoltage,d,V DC,3222,uint16,100,R +com.victronenergy.genset,/Engine/OilPressure,d,kPa,3224,int16,1,R +com.victronenergy.genset,/Ac/L1/Voltage,d,V AC,3200,uint16,10,R +com.victronenergy.genset,/Ac/L1/Current,d,A AC,3203,int16,10,R +com.victronenergy.genset,/Ac/L1/Power,d,W,3206,int16,1,R +com.victronenergy.genset,/Ac/L1/Frequency,d,Hz,3209,uint16,100,R +com.victronenergy.genset,/Ac/L2/Voltage,d,V AC,3201,uint16,10,R +com.victronenergy.genset,/Ac/L2/Current,d,A AC,3204,int16,10,R +com.victronenergy.genset,/Ac/L2/Power,d,W,3207,int16,1,R +com.victronenergy.genset,/Ac/L2/Frequency,d,Hz,3210,uint16,100,R +com.victronenergy.genset,/Ac/L3/Voltage,d,V AC,3202,uint16,10,R +com.victronenergy.genset,/Ac/L3/Current,d,A AC,3205,int16,10,R +com.victronenergy.genset,/Ac/L3/Power,d,W,3208,int16,1,R +com.victronenergy.genset,/Ac/L3/Frequency,d,Hz,3211,uint16,100,R +com.victronenergy.temperature,/ProductId,u,,3300,uint16,1,R +com.victronenergy.temperature,/Scale,d,,3301,uint16,100,R +com.victronenergy.temperature,/Offset,d,,3302,int16,100,R +com.victronenergy.temperature,/TemperatureType,u,0=Battery;1=Fridge;2=Generic,3303,uint16,1,R +com.victronenergy.temperature,/Temperature,d,Degrees celsius,3304,int16,100,R +com.victronenergy.temperature,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3305,uint16,1,R +com.victronenergy.temperature,/Humidity,u,%,3306,uint16,10,R +com.victronenergy.temperature,/BatteryVoltage,d,V,3307,uint16,100,R +com.victronenergy.temperature,/Pressure,u,hPa,3308,uint16,1,R +com.victronenergy.pulsemeter,/Aggregate,i,,3400,uint32,1,R +com.victronenergy.pulsemeter,/Count,i,,3402,uint32,1,R +com.victronenergy.digitalinput,/Count,i,,3420,uint32,1,R +com.victronenergy.digitalinput,/State,i,,3422,uint16,1,R +com.victronenergy.digitalinput,/Alarm,i,0=No alarm;2=Alarm,3423,uint16,1,R +com.victronenergy.digitalinput,/Type,i,2=Door;3=Bilge pump;4=Bilge alarm;5=Burglar alarm;6=Smoke alarm;7=Fire alarm;8=CO2 alarm;9=Generator,3424,uint16,1,R +com.victronenergy.generator,/ManualStart,i,0=Stop generator;1=Start generator,3500,uint16,1,W +com.victronenergy.generator,/RunningByConditionCode,i,0=Stopped;1=Manual;2=TestRun;3=LossOfComms;4=Soc;5=AcLoad;6=BatteryCurrent;7=BatteryVoltage;8=InverterTemperatur;9=InverterOverload;10=StopOnAc1,3501,uint16,1,R +com.victronenergy.generator,/Runtime,i,seconds,3502,uint16,1,R +com.victronenergy.generator,/QuietHours,i,0=Quiet hours inactive; 1=Quiet hours active,3503,uint16,1,R +com.victronenergy.generator,/Runtime,u,seconds,3504,uint32,1,R +com.victronenergy.generator,/State,i,0=Stopped;1=Running;10=Error,3506,uint16,1,R +com.victronenergy.generator,/Error,i,0=No Error;1=Remote disabled;2=Remote fault,3507,uint16,1,R +com.victronenergy.generator,/Alarms/NoGeneratorAtAcIn,i,0=No Alarm;2=Alarm,3508,uint16,1,R +com.victronenergy.generator,/AutoStartEnabled,i,0=Autostart disabled;1=Autostart enabled,3509,uint16,1,W +com.victronenergy.generator,/ServiceCounter,u,seconds,3510,uint32,1,R +com.victronenergy.generator,/ServiceCounterReset,u,1=Reset,3512,uint16,1,W +com.victronenergy.meteo,/Irradiance,d,W/m^2,3600,uint16,10,R +com.victronenergy.meteo,/WindSpeed,d,m/s,3601,uint16,10,R +com.victronenergy.meteo,/CellTemperature,d,Degrees celsius,3602,int16,10,R +com.victronenergy.meteo,/ExternalTemperature,d,Degrees celsius,3603,int16,10,R +com.victronenergy.evcharger,/ProductId,u,,3800,uint16,1,R +com.victronenergy.evcharger,/FirmwareVersion,u,,3802,uint32,1,R +com.victronenergy.evcharger,/Serial,s,,3804,string[6],,R +com.victronenergy.evcharger,/Model,s,,3810,string[4],,R +com.victronenergy.evcharger,/MaxCurrent,d,A,3814,uint16,1,W +com.victronenergy.evcharger,/Mode,u,0=Manual;1=Auto,3815,uint16,1,W +com.victronenergy.evcharger,/Ac/Energy/Forward,d,kWh,3816,uint32,100,R +com.victronenergy.evcharger,/Ac/L1/Power,d,W,3818,uint16,1,R +com.victronenergy.evcharger,/Ac/L2/Power,d,W,3819,uint16,1,R +com.victronenergy.evcharger,/Ac/L3/Power,d,W,3820,uint16,1,R +com.victronenergy.evcharger,/Ac/Power,d,W,3821,uint16,1,R +com.victronenergy.evcharger,/ChargingTime,d,s,3822,uint16,0.01,R +com.victronenergy.evcharger,/Current,d,A,3823,uint16,1,W +com.victronenergy.evcharger,/Status,u,0=Disconnected;1=Connected;2=Charging;3=Charged;4=Waiting for sun;5=Waiting for RFID;6=Waiting for start;7=Low SOC;8=Ground fault;9=Welded contacts;10=CP Input shorted;11=Residual current detected;12=Under voltage detected;13=Overvoltage detected;14=Overheating detected,3824,uint16,1,R +com.victronenergy.evcharger,/SetCurrent,d,A,3825,uint16,1,W +com.victronenergy.evcharger,/StartStop,u,0=Stop;1=Start,3826,uint16,1,W +com.victronenergy.evcharger,/Position,i,0=AC input 1;1=AC output;2=AC input 2,3827,uint16,1,W +com.victronenergy.acload,/Ac/L1/Power,d,W,3900,int16,1,R +com.victronenergy.acload,/Ac/L2/Power,d,W,3901,int16,1,R +com.victronenergy.acload,/Ac/L3/Power,d,W,3902,int16,1,R +com.victronenergy.acload,/Serial,s,,3903,string[7],,R +com.victronenergy.acload,/Ac/L1/Voltage,d,V AC,3910,uint16,10,R +com.victronenergy.acload,/Ac/L1/Current,d,A AC,3911,int16,10,R +com.victronenergy.acload,/Ac/L2/Voltage,d,V AC,3912,uint16,10,R +com.victronenergy.acload,/Ac/L2/Current,d,A AC,3913,int16,10,R +com.victronenergy.acload,/Ac/L3/Voltage,d,V AC,3914,uint16,10,R +com.victronenergy.acload,/Ac/L3/Current,d,A AC,3915,int16,10,R +com.victronenergy.acload,/Ac/L1/Energy/Forward,d,kWh,3916,uint32,100,R +com.victronenergy.acload,/Ac/L2/Energy/Forward,d,kWh,3918,uint32,100,R +com.victronenergy.acload,/Ac/L3/Energy/Forward,d,kWh,3920,uint32,100,R +com.victronenergy.fuelcell,/Dc/0/Voltage,d,V DC,4000,uint16,100,R +com.victronenergy.fuelcell,/Dc/0/Current,d,A DC,4001,int16,10,R +com.victronenergy.fuelcell,/Dc/1/Voltage,d,V DC,4002,int16,10,R +com.victronenergy.fuelcell,/Dc/0/Temperature,d,Degrees celsius,4003,int16,10,R +com.victronenergy.fuelcell,/History/EnergyOut,d,kWh,4004,uint32,100,R +com.victronenergy.fuelcell,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4006,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4007,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4008,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4009,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4010,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4011,uint16,1,R +com.victronenergy.alternator,/Dc/0/Voltage,d,V DC,4100,uint16,100,R +com.victronenergy.alternator,/Dc/0/Current,d,A DC,4101,int16,10,R +com.victronenergy.alternator,/Dc/1/Voltage,d,V DC,4102,int16,10,R +com.victronenergy.alternator,/Dc/0/Temperature,d,Degrees celsius,4103,int16,10,R +com.victronenergy.alternator,/History/EnergyOut,d,kWh,4104,uint32,100,R +com.victronenergy.alternator,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4106,uint16,1,R +com.victronenergy.alternator,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4107,uint16,1,R +com.victronenergy.alternator,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4108,uint16,1,R +com.victronenergy.alternator,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4109,uint16,1,R +com.victronenergy.alternator,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4110,uint16,1,R +com.victronenergy.alternator,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4111,uint16,1,R +com.victronenergy.alternator,/State,u,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;252=External control,4112,uint16,1,R +com.victronenergy.alternator,/ErrorCode,u,12=High battery temperature;13=High battery voltage;14=Low battery voltage;15=VBat exceeds $CPB;21=High alternator temperature;22=Alternator overspeed;24=Internal error;41=High field FET temperature;42=Sensor missing;43=Low VAlt;44=High Voltage offset;45=VAlt exceeds $CPB;51-52=Battery disconnect request;53=Battery instance out of range;54=Too many BMSes;55=AEBus fault;56=Too many Victron devices;58-61=Battery requested disconnection;91=BMS lost;92=Forced idle;201=DCDC converter fail;201-207=DCDC error,4113,uint16,1,R +com.victronenergy.alternator,/Engine/Speed,d,RPM,4114,uint16,1,R +com.victronenergy.alternator,/Speed,d,RPM,4115,uint16,1,R +com.victronenergy.alternator,/FieldDrive,q,%,4116,uint16,1,R +com.victronenergy.dcsource,/Dc/0/Voltage,d,V DC,4200,uint16,100,R +com.victronenergy.dcsource,/Dc/0/Current,d,A DC,4201,int16,10,R +com.victronenergy.dcsource,/Dc/1/Voltage,d,V DC,4202,int16,10,R +com.victronenergy.dcsource,/Dc/0/Temperature,d,Degrees centigrade,4203,int16,10,R +com.victronenergy.dcsource,/History/EnergyOut,d,kWh,4204,uint32,100,R +com.victronenergy.dcsource,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4206,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4207,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4208,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4209,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4210,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4211,uint16,1,R +com.victronenergy.dcload,/Dc/0/Voltage,d,V DC,4300,uint16,100,R +com.victronenergy.dcload,/Dc/0/Current,d,A DC,4301,int16,10,R +com.victronenergy.dcload,/Dc/1/Voltage,d,V DC,4302,int16,10,R +com.victronenergy.dcload,/Dc/0/Temperature,d,Degrees centigrade,4303,int16,10,R +com.victronenergy.dcload,/History/EnergyIn,d,kWh,4304,uint32,100,R +com.victronenergy.dcload,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4306,uint16,1,R +com.victronenergy.dcload,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4307,uint16,1,R +com.victronenergy.dcload,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4308,uint16,1,R +com.victronenergy.dcload,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4309,uint16,1,R +com.victronenergy.dcload,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4310,uint16,1,R +com.victronenergy.dcload,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4311,uint16,1,R +com.victronenergy.dcsystem,/Dc/0/Voltage,d,V DC,4400,uint16,100,R +com.victronenergy.dcsystem,/Dc/0/Current,d,A DC,4401,int16,10,R +com.victronenergy.dcsystem,/Dc/1/Voltage,d,V DC,4402,int16,10,R +com.victronenergy.dcsystem,/Dc/0/Temperature,d,Degrees centigrade,4403,int16,10,R +com.victronenergy.dcsystem,/History/EnergyOut,d,kWh,4404,uint32,100,R +com.victronenergy.dcsystem,/History/EnergyIn,d,kWh,4406,uint32,100,R +com.victronenergy.dcsystem,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4408,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4409,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4410,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4411,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4412,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4413,uint16,1,R +com.victronenergy.multi,/Ac/In/1/L1/V,d,V AC,4500,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/V,d,V AC,4501,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/V,d,V AC,4502,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/I,d,A AC,4503,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/I,d,A AC,4504,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/I,d,A AC,4505,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/P,d,W,4506,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L2/P,d,W,4507,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L3/P,d,W,4508,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L1/F,d,Hz,4509,uint16,100,R +com.victronenergy.multi,/Ac/Out/L1/V,d,V AC,4510,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/V,d,V AC,4511,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/V,d,V AC,4512,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/I,d,A AC,4513,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/I,d,A AC,4514,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/I,d,A AC,4515,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/P,d,W,4516,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L2/P,d,W,4517,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L3/P,d,W,4518,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L1/F,d,Hz,4519,uint16,100,R +com.victronenergy.multi,/Ac/In/1/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4520,uint16,1,R +com.victronenergy.multi,/Ac/In/2/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4521,uint16,1,R +com.victronenergy.multi,/Ac/In/1/CurrentLimit,d,A,4522,uint16,10,W +com.victronenergy.multi,/Ac/In/2/CurrentLimit,d,A,4523,uint16,10,W +com.victronenergy.multi,/Ac/NumberOfPhases,u,count,4524,uint16,1,R +com.victronenergy.multi,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,4525,uint16,1,R +com.victronenergy.multi,/Dc/0/Voltage,d,V DC,4526,uint16,100,R +com.victronenergy.multi,/Dc/0/Current,d,A DC,4527,int16,10,R +com.victronenergy.multi,/Dc/0/Temperature,d,Degrees celsius,4528,int16,10,R +com.victronenergy.multi,/Soc,d,%,4529,uint16,10,R +com.victronenergy.multi,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=External control,4530,uint16,1,R +com.victronenergy.multi,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,4531,uint16,1,W +com.victronenergy.multi,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,4532,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltage,u,0=Ok;1=Warning;2=Alarm,4533,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4534,uint16,1,R +com.victronenergy.multi,/Alarms/LowTemperature,u,0=Ok;1=Warning;2=Alarm,4535,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltage,u,0=Ok;1=Warning;2=Alarm,4536,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4537,uint16,1,R +com.victronenergy.multi,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,4538,uint16,1,R +com.victronenergy.multi,/Alarms/Ripple,u,0=Ok;1=Warning;2=Alarm,4539,uint16,1,R +com.victronenergy.multi,/Yield/Power,d,W,4540,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4541,uint16,10,R +com.victronenergy.multi,/Relay/0/State,i,0=Open;1=Closed,4542,uint16,1,R +com.victronenergy.multi,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4543,uint16,1,R +com.victronenergy.multi,/Pv/V,d,V DC,4544,uint16,10,R +com.victronenergy.multi,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,4545,uint16,1,R +com.victronenergy.multi,/Energy/AcIn1ToAcOut,d,kWh,4546,uint32,100,R +com.victronenergy.multi,/Energy/AcIn1ToInverter,d,kWh,4548,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToAcOut,d,kWh,4550,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToInverter,d,kWh,4552,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn1,d,kWh,4554,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn2,d,kWh,4556,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn1,d,kWh,4558,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn2,d,kWh,4560,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcOut,d,kWh,4562,uint32,100,R +com.victronenergy.multi,/Energy/OutToInverter,d,kWh,4564,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn1,d,kWh,4566,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn2,d,kWh,4568,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcOut,d,kWh,4570,uint32,100,R +com.victronenergy.multi,/Energy/SolarToBattery,d,kWh,4572,uint32,100,R +com.victronenergy.multi,/History/Daily/0/Yield,d,kWh,4574,uint16,10,R +com.victronenergy.multi,/History/Daily/0/MaxPower,d,W,4575,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Yield,d,kWh,4576,uint16,10,R +com.victronenergy.multi,/History/Daily/1/MaxPower,d,W,4577,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/0/Yield,d,kWh,4578,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/1/Yield,d,kWh,4579,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/2/Yield,d,kWh,4580,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/3/Yield,d,kWh,4581,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/0/Yield,d,kWh,4582,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/1/Yield,d,kWh,4583,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/2/Yield,d,kWh,4584,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/3/Yield,d,kWh,4585,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/0/MaxPower,d,W,4586,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/1/MaxPower,d,W,4587,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/2/MaxPower,d,W,4588,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/3/MaxPower,d,W,4589,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/0/MaxPower,d,W,4590,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/1/MaxPower,d,W,4591,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/2/MaxPower,d,W,4592,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/3/MaxPower,d,W,4593,uint16,1,R +com.victronenergy.multi,/Pv/0/V,d,V DC,4594,uint16,10,R +com.victronenergy.multi,/Pv/1/V,d,V DC,4595,uint16,10,R +com.victronenergy.multi,/Pv/2/V,d,V DC,4596,uint16,10,R +com.victronenergy.multi,/Pv/3/V,d,V DC,4597,uint16,10,R +com.victronenergy.multi,/Pv/0/P,d,W,4598,uint16,1,R +com.victronenergy.multi,/Pv/1/P,d,W,4599,uint16,1,R +com.victronenergy.multi,/Pv/2/P,d,W,4600,uint16,1,R +com.victronenergy.multi,/Pv/3/P,d,W,4601,uint16,1,R +com.victronenergy.multi,/Alarms/LowSoc,u,,4602,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4603,uint32,1,R +com.victronenergy.multi,/Pv/0/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4605,uint16,1,R +com.victronenergy.multi,/Pv/1/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4606,uint16,1,R +com.victronenergy.multi,/Pv/2/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4607,uint16,1,R +com.victronenergy.multi,/Pv/3/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4608,uint16,1,R +com.victronenergy.pump,/State,d,0=Stopped;1=Running,4700,uint16,1,R +com.victronenergy.settings,/Settings/Pump0/AutoStartEnabled,d,0=Disabled;1=Enabled,4701,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/Mode,d,0=Auto;1=On;2=Off,4702,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/StartValue,d,%,4703,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/StopValue,d,%,4704,uint16,1,W diff --git a/FileSets/v3.20~33/dbus_digitalinputs.py b/FileSets/v3.20~33/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.20~33/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.20~33/dbus_generator.py b/FileSets/v3.20~33/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.20~33/dbus_generator.py +++ b/FileSets/v3.20~33/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~33/main.qml b/FileSets/v3.20~33/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.20~33/main.qml +++ b/FileSets/v3.20~33/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~33/styles.css b/FileSets/v3.20~33/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.20~33/styles.css +++ b/FileSets/v3.20~33/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~34/Battery.qml b/FileSets/v3.20~34/Battery.qml deleted file mode 120000 index 794e9dd0..00000000 --- a/FileSets/v3.20~34/Battery.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/COMPLETE b/FileSets/v3.20~34/COMPLETE deleted file mode 100644 index e69de29b..00000000 diff --git a/FileSets/v3.20~34/DetailAcInput.qml b/FileSets/v3.20~34/DetailAcInput.qml deleted file mode 120000 index 8b226ba8..00000000 --- a/FileSets/v3.20~34/DetailAcInput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/DetailInverter.qml b/FileSets/v3.20~34/DetailInverter.qml deleted file mode 120000 index 5ddd5ce8..00000000 --- a/FileSets/v3.20~34/DetailInverter.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/DetailLoadsCombined.qml b/FileSets/v3.20~34/DetailLoadsCombined.qml deleted file mode 120000 index b000afaa..00000000 --- a/FileSets/v3.20~34/DetailLoadsCombined.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/DetailLoadsOnInput.qml b/FileSets/v3.20~34/DetailLoadsOnInput.qml deleted file mode 120000 index 901e0820..00000000 --- a/FileSets/v3.20~34/DetailLoadsOnInput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/DetailLoadsOnOutput.qml b/FileSets/v3.20~34/DetailLoadsOnOutput.qml deleted file mode 120000 index 142fee12..00000000 --- a/FileSets/v3.20~34/DetailLoadsOnOutput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/HubData.qml b/FileSets/v3.20~34/HubData.qml deleted file mode 120000 index df42560b..00000000 --- a/FileSets/v3.20~34/HubData.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/LINKS_ONLY b/FileSets/v3.20~34/LINKS_ONLY deleted file mode 100644 index e69de29b..00000000 diff --git a/FileSets/v3.20~34/MbEditBox.qml b/FileSets/v3.20~34/MbEditBox.qml deleted file mode 120000 index a6185dba..00000000 --- a/FileSets/v3.20~34/MbEditBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/MbEditBoxDateTime.qml b/FileSets/v3.20~34/MbEditBoxDateTime.qml deleted file mode 120000 index 158d88d0..00000000 --- a/FileSets/v3.20~34/MbEditBoxDateTime.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/MbItem.qml b/FileSets/v3.20~34/MbItem.qml deleted file mode 120000 index 8dfa4b06..00000000 --- a/FileSets/v3.20~34/MbItem.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/MbSpinBox.qml b/FileSets/v3.20~34/MbSpinBox.qml deleted file mode 120000 index b0dffaae..00000000 --- a/FileSets/v3.20~34/MbSpinBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/MbStyle.qml b/FileSets/v3.20~34/MbStyle.qml deleted file mode 120000 index 4accbc46..00000000 --- a/FileSets/v3.20~34/MbStyle.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/MbSubMenu.qml b/FileSets/v3.20~34/MbSubMenu.qml deleted file mode 120000 index d1172169..00000000 --- a/FileSets/v3.20~34/MbSubMenu.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/Multi.qml b/FileSets/v3.20~34/Multi.qml deleted file mode 120000 index 9a2fa57b..00000000 --- a/FileSets/v3.20~34/Multi.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/ObjectAcConnection.qml b/FileSets/v3.20~34/ObjectAcConnection.qml deleted file mode 120000 index 406d6613..00000000 --- a/FileSets/v3.20~34/ObjectAcConnection.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~34/OverviewAcValuesEnhanced.qml deleted file mode 120000 index 09322f1d..00000000 --- a/FileSets/v3.20~34/OverviewAcValuesEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewBox.qml b/FileSets/v3.20~34/OverviewBox.qml deleted file mode 120000 index 8c3baac0..00000000 --- a/FileSets/v3.20~34/OverviewBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewConnection.qml b/FileSets/v3.20~34/OverviewConnection.qml deleted file mode 120000 index 52cb8f85..00000000 --- a/FileSets/v3.20~34/OverviewConnection.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewConnectionEnd.qml b/FileSets/v3.20~34/OverviewConnectionEnd.qml deleted file mode 120000 index 04bf981f..00000000 --- a/FileSets/v3.20~34/OverviewConnectionEnd.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewFlowComplex.qml b/FileSets/v3.20~34/OverviewFlowComplex.qml deleted file mode 120000 index 6089ae4c..00000000 --- a/FileSets/v3.20~34/OverviewFlowComplex.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~34/OverviewGeneratorEnhanced.qml deleted file mode 120000 index ebdde7dc..00000000 --- a/FileSets/v3.20~34/OverviewGeneratorEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~34/OverviewGeneratorRelayEnhanced.qml deleted file mode 120000 index 54b24f30..00000000 --- a/FileSets/v3.20~34/OverviewGeneratorRelayEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewGridParallel.qml b/FileSets/v3.20~34/OverviewGridParallel.qml deleted file mode 120000 index c31a5a0f..00000000 --- a/FileSets/v3.20~34/OverviewGridParallel.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewHub.qml b/FileSets/v3.20~34/OverviewHub.qml deleted file mode 120000 index 9f251775..00000000 --- a/FileSets/v3.20~34/OverviewHub.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewHubEnhanced.qml b/FileSets/v3.20~34/OverviewHubEnhanced.qml deleted file mode 120000 index 0c37301c..00000000 --- a/FileSets/v3.20~34/OverviewHubEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewMobileEnhanced.qml b/FileSets/v3.20~34/OverviewMobileEnhanced.qml deleted file mode 120000 index 79cb1fcb..00000000 --- a/FileSets/v3.20~34/OverviewMobileEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewSolarCharger.qml b/FileSets/v3.20~34/OverviewSolarCharger.qml deleted file mode 120000 index 73220270..00000000 --- a/FileSets/v3.20~34/OverviewSolarCharger.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewSolarInverter.qml b/FileSets/v3.20~34/OverviewSolarInverter.qml deleted file mode 120000 index dd6f7b40..00000000 --- a/FileSets/v3.20~34/OverviewSolarInverter.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewTankDelegate.qml b/FileSets/v3.20~34/OverviewTankDelegate.qml deleted file mode 120000 index 9ac457b6..00000000 --- a/FileSets/v3.20~34/OverviewTankDelegate.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewTanks.qml b/FileSets/v3.20~34/OverviewTanks.qml deleted file mode 120000 index 975b464a..00000000 --- a/FileSets/v3.20~34/OverviewTanks.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~34/OverviewTanksTempsDigInputs.qml deleted file mode 120000 index 6cd0cfc3..00000000 --- a/FileSets/v3.20~34/OverviewTanksTempsDigInputs.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/PageGenerator.qml b/FileSets/v3.20~34/PageGenerator.qml deleted file mode 120000 index 05b5cccb..00000000 --- a/FileSets/v3.20~34/PageGenerator.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/PageMain.qml b/FileSets/v3.20~34/PageMain.qml deleted file mode 120000 index c42009d8..00000000 --- a/FileSets/v3.20~34/PageMain.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageMain.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/PageSettingsDisplay.qml b/FileSets/v3.20~34/PageSettingsDisplay.qml deleted file mode 120000 index 809804c4..00000000 --- a/FileSets/v3.20~34/PageSettingsDisplay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/PageSettingsGenerator.qml b/FileSets/v3.20~34/PageSettingsGenerator.qml deleted file mode 120000 index 54543635..00000000 --- a/FileSets/v3.20~34/PageSettingsGenerator.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/PageSettingsGuiMods.qml b/FileSets/v3.20~34/PageSettingsGuiMods.qml deleted file mode 120000 index c4dc4998..00000000 --- a/FileSets/v3.20~34/PageSettingsGuiMods.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~37/PageSettingsGuiMods.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/PageSettingsRelay.qml b/FileSets/v3.20~34/PageSettingsRelay.qml deleted file mode 120000 index e083e872..00000000 --- a/FileSets/v3.20~34/PageSettingsRelay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/PowerGauge.qml b/FileSets/v3.20~34/PowerGauge.qml deleted file mode 120000 index 2ed81452..00000000 --- a/FileSets/v3.20~34/PowerGauge.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/Tile.qml b/FileSets/v3.20~34/Tile.qml deleted file mode 120000 index db98506f..00000000 --- a/FileSets/v3.20~34/Tile.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/TileDigIn.qml b/FileSets/v3.20~34/TileDigIn.qml deleted file mode 120000 index c6408a84..00000000 --- a/FileSets/v3.20~34/TileDigIn.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/TileRelay.qml b/FileSets/v3.20~34/TileRelay.qml deleted file mode 120000 index 200caf92..00000000 --- a/FileSets/v3.20~34/TileRelay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/TileText.qml b/FileSets/v3.20~34/TileText.qml deleted file mode 120000 index 8f17d6b3..00000000 --- a/FileSets/v3.20~34/TileText.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/dbus_generator.py b/FileSets/v3.20~34/dbus_generator.py deleted file mode 120000 index f0d38f59..00000000 --- a/FileSets/v3.20~34/dbus_generator.py +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~34/dbus_systemcalc.py b/FileSets/v3.20~34/dbus_systemcalc.py deleted file mode 120000 index a1d9cef2..00000000 --- a/FileSets/v3.20~34/dbus_systemcalc.py +++ /dev/null @@ -1 +0,0 @@ -../v3.20~35/dbus_systemcalc.py \ No newline at end of file diff --git a/FileSets/v3.20~34/main.qml b/FileSets/v3.20~34/main.qml deleted file mode 120000 index aafeae08..00000000 --- a/FileSets/v3.20~34/main.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~34/startstop.py b/FileSets/v3.20~34/startstop.py deleted file mode 120000 index b962b8d5..00000000 --- a/FileSets/v3.20~34/startstop.py +++ /dev/null @@ -1 +0,0 @@ -../v3.20~37/startstop.py \ No newline at end of file diff --git a/FileSets/v3.20~34/styles.css b/FileSets/v3.20~34/styles.css deleted file mode 120000 index 4af38df2..00000000 --- a/FileSets/v3.20~34/styles.css +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~35/Battery.qml b/FileSets/v3.20~35/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.20~35/Battery.qml +++ b/FileSets/v3.20~35/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/DetailAcInput.qml b/FileSets/v3.20~35/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.20~35/DetailAcInput.qml +++ b/FileSets/v3.20~35/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/DetailInverter.qml b/FileSets/v3.20~35/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.20~35/DetailInverter.qml +++ b/FileSets/v3.20~35/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/DetailLoadsCombined.qml b/FileSets/v3.20~35/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.20~35/DetailLoadsCombined.qml +++ b/FileSets/v3.20~35/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/DetailLoadsOnInput.qml b/FileSets/v3.20~35/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.20~35/DetailLoadsOnInput.qml +++ b/FileSets/v3.20~35/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/DetailLoadsOnOutput.qml b/FileSets/v3.20~35/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.20~35/DetailLoadsOnOutput.qml +++ b/FileSets/v3.20~35/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/HubData.qml b/FileSets/v3.20~35/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.20~35/HubData.qml +++ b/FileSets/v3.20~35/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/MbEditBox.qml b/FileSets/v3.20~35/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.20~35/MbEditBox.qml +++ b/FileSets/v3.20~35/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/MbEditBoxDateTime.qml b/FileSets/v3.20~35/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.20~35/MbEditBoxDateTime.qml +++ b/FileSets/v3.20~35/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/MbItem.qml b/FileSets/v3.20~35/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.20~35/MbItem.qml +++ b/FileSets/v3.20~35/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/MbItemDigitalInput.qml b/FileSets/v3.20~35/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.20~35/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/MbSpinBox.qml b/FileSets/v3.20~35/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.20~35/MbSpinBox.qml +++ b/FileSets/v3.20~35/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/MbStyle.qml b/FileSets/v3.20~35/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.20~35/MbStyle.qml +++ b/FileSets/v3.20~35/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/MbSubMenu.qml b/FileSets/v3.20~35/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.20~35/MbSubMenu.qml +++ b/FileSets/v3.20~35/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/Multi.qml b/FileSets/v3.20~35/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.20~35/Multi.qml +++ b/FileSets/v3.20~35/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/ObjectAcConnection.qml b/FileSets/v3.20~35/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.20~35/ObjectAcConnection.qml +++ b/FileSets/v3.20~35/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~35/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.20~35/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.20~35/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewBox.qml b/FileSets/v3.20~35/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.20~35/OverviewBox.qml +++ b/FileSets/v3.20~35/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewConnection.qml b/FileSets/v3.20~35/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.20~35/OverviewConnection.qml +++ b/FileSets/v3.20~35/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewConnectionEnd.qml b/FileSets/v3.20~35/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.20~35/OverviewConnectionEnd.qml +++ b/FileSets/v3.20~35/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewFlowComplex.qml b/FileSets/v3.20~35/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.20~35/OverviewFlowComplex.qml +++ b/FileSets/v3.20~35/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~35/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.20~35/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.20~35/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~35/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.20~35/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.20~35/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewGridParallel.qml b/FileSets/v3.20~35/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.20~35/OverviewGridParallel.qml +++ b/FileSets/v3.20~35/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewHub.qml b/FileSets/v3.20~35/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.20~35/OverviewHub.qml +++ b/FileSets/v3.20~35/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewHubEnhanced.qml b/FileSets/v3.20~35/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.20~35/OverviewHubEnhanced.qml +++ b/FileSets/v3.20~35/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewMobileEnhanced.qml b/FileSets/v3.20~35/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.20~35/OverviewMobileEnhanced.qml +++ b/FileSets/v3.20~35/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewSolarCharger.qml b/FileSets/v3.20~35/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.20~35/OverviewSolarCharger.qml +++ b/FileSets/v3.20~35/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewSolarInverter.qml b/FileSets/v3.20~35/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.20~35/OverviewSolarInverter.qml +++ b/FileSets/v3.20~35/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewTankDelegate.qml b/FileSets/v3.20~35/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.20~35/OverviewTankDelegate.qml +++ b/FileSets/v3.20~35/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewTanks.qml b/FileSets/v3.20~35/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.20~35/OverviewTanks.qml +++ b/FileSets/v3.20~35/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~35/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.20~35/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.20~35/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/PageDigitalInput.qml b/FileSets/v3.20~35/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.20~35/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/PageGenerator.qml b/FileSets/v3.20~35/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.20~35/PageGenerator.qml +++ b/FileSets/v3.20~35/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/PageMain.qml b/FileSets/v3.20~35/PageMain.qml index c42009d8..6bcbcd1a 120000 --- a/FileSets/v3.20~35/PageMain.qml +++ b/FileSets/v3.20~35/PageMain.qml @@ -1 +1 @@ -../v3.20~42/PageMain.qml \ No newline at end of file +../v3.20~45/PageMain.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/PageSettingsDisplay.qml b/FileSets/v3.20~35/PageSettingsDisplay.qml index 809804c4..a7f4a2c4 120000 --- a/FileSets/v3.20~35/PageSettingsDisplay.qml +++ b/FileSets/v3.20~35/PageSettingsDisplay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsDisplay.qml \ No newline at end of file +../v3.30~1/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/PageSettingsGenerator.qml b/FileSets/v3.20~35/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.20~35/PageSettingsGenerator.qml +++ b/FileSets/v3.20~35/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/PageSettingsRelay.qml b/FileSets/v3.20~35/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.20~35/PageSettingsRelay.qml +++ b/FileSets/v3.20~35/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/PowerGauge.qml b/FileSets/v3.20~35/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.20~35/PowerGauge.qml +++ b/FileSets/v3.20~35/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/Tile.qml b/FileSets/v3.20~35/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.20~35/Tile.qml +++ b/FileSets/v3.20~35/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/TileDigIn.qml b/FileSets/v3.20~35/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.20~35/TileDigIn.qml +++ b/FileSets/v3.20~35/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/TileRelay.qml b/FileSets/v3.20~35/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.20~35/TileRelay.qml +++ b/FileSets/v3.20~35/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/TileText.qml b/FileSets/v3.20~35/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.20~35/TileText.qml +++ b/FileSets/v3.20~35/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/attributes.csv b/FileSets/v3.20~35/attributes.csv new file mode 120000 index 00000000..60c4d4d5 --- /dev/null +++ b/FileSets/v3.20~35/attributes.csv @@ -0,0 +1 @@ +../v3.30~1/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.20~35/dbus_digitalinputs.py b/FileSets/v3.20~35/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.20~35/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.20~35/dbus_generator.py b/FileSets/v3.20~35/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.20~35/dbus_generator.py +++ b/FileSets/v3.20~35/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~35/main.qml b/FileSets/v3.20~35/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.20~35/main.qml +++ b/FileSets/v3.20~35/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~35/styles.css b/FileSets/v3.20~35/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.20~35/styles.css +++ b/FileSets/v3.20~35/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~36/Battery.qml b/FileSets/v3.20~36/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.20~36/Battery.qml +++ b/FileSets/v3.20~36/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/DetailAcInput.qml b/FileSets/v3.20~36/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.20~36/DetailAcInput.qml +++ b/FileSets/v3.20~36/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/DetailInverter.qml b/FileSets/v3.20~36/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.20~36/DetailInverter.qml +++ b/FileSets/v3.20~36/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/DetailLoadsCombined.qml b/FileSets/v3.20~36/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.20~36/DetailLoadsCombined.qml +++ b/FileSets/v3.20~36/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/DetailLoadsOnInput.qml b/FileSets/v3.20~36/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.20~36/DetailLoadsOnInput.qml +++ b/FileSets/v3.20~36/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/DetailLoadsOnOutput.qml b/FileSets/v3.20~36/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.20~36/DetailLoadsOnOutput.qml +++ b/FileSets/v3.20~36/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/HubData.qml b/FileSets/v3.20~36/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.20~36/HubData.qml +++ b/FileSets/v3.20~36/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/MbEditBox.qml b/FileSets/v3.20~36/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.20~36/MbEditBox.qml +++ b/FileSets/v3.20~36/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/MbEditBoxDateTime.qml b/FileSets/v3.20~36/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.20~36/MbEditBoxDateTime.qml +++ b/FileSets/v3.20~36/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/MbItem.qml b/FileSets/v3.20~36/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.20~36/MbItem.qml +++ b/FileSets/v3.20~36/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/MbItemDigitalInput.qml b/FileSets/v3.20~36/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.20~36/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/MbSpinBox.qml b/FileSets/v3.20~36/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.20~36/MbSpinBox.qml +++ b/FileSets/v3.20~36/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/MbStyle.qml b/FileSets/v3.20~36/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.20~36/MbStyle.qml +++ b/FileSets/v3.20~36/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/MbSubMenu.qml b/FileSets/v3.20~36/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.20~36/MbSubMenu.qml +++ b/FileSets/v3.20~36/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/Multi.qml b/FileSets/v3.20~36/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.20~36/Multi.qml +++ b/FileSets/v3.20~36/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/ObjectAcConnection.qml b/FileSets/v3.20~36/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.20~36/ObjectAcConnection.qml +++ b/FileSets/v3.20~36/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~36/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.20~36/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.20~36/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewBox.qml b/FileSets/v3.20~36/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.20~36/OverviewBox.qml +++ b/FileSets/v3.20~36/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewConnection.qml b/FileSets/v3.20~36/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.20~36/OverviewConnection.qml +++ b/FileSets/v3.20~36/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewConnectionEnd.qml b/FileSets/v3.20~36/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.20~36/OverviewConnectionEnd.qml +++ b/FileSets/v3.20~36/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewFlowComplex.qml b/FileSets/v3.20~36/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.20~36/OverviewFlowComplex.qml +++ b/FileSets/v3.20~36/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~36/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.20~36/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.20~36/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~36/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.20~36/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.20~36/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewGridParallel.qml b/FileSets/v3.20~36/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.20~36/OverviewGridParallel.qml +++ b/FileSets/v3.20~36/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewHub.qml b/FileSets/v3.20~36/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.20~36/OverviewHub.qml +++ b/FileSets/v3.20~36/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewHubEnhanced.qml b/FileSets/v3.20~36/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.20~36/OverviewHubEnhanced.qml +++ b/FileSets/v3.20~36/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewMobileEnhanced.qml b/FileSets/v3.20~36/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.20~36/OverviewMobileEnhanced.qml +++ b/FileSets/v3.20~36/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewSolarCharger.qml b/FileSets/v3.20~36/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.20~36/OverviewSolarCharger.qml +++ b/FileSets/v3.20~36/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewSolarInverter.qml b/FileSets/v3.20~36/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.20~36/OverviewSolarInverter.qml +++ b/FileSets/v3.20~36/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewTankDelegate.qml b/FileSets/v3.20~36/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.20~36/OverviewTankDelegate.qml +++ b/FileSets/v3.20~36/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewTanks.qml b/FileSets/v3.20~36/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.20~36/OverviewTanks.qml +++ b/FileSets/v3.20~36/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~36/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.20~36/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.20~36/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/PageDigitalInput.qml b/FileSets/v3.20~36/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.20~36/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/PageGenerator.qml b/FileSets/v3.20~36/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.20~36/PageGenerator.qml +++ b/FileSets/v3.20~36/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/PageMain.qml b/FileSets/v3.20~36/PageMain.qml index c42009d8..6bcbcd1a 120000 --- a/FileSets/v3.20~36/PageMain.qml +++ b/FileSets/v3.20~36/PageMain.qml @@ -1 +1 @@ -../v3.20~42/PageMain.qml \ No newline at end of file +../v3.20~45/PageMain.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/PageSettingsDisplay.qml b/FileSets/v3.20~36/PageSettingsDisplay.qml index 809804c4..a7f4a2c4 120000 --- a/FileSets/v3.20~36/PageSettingsDisplay.qml +++ b/FileSets/v3.20~36/PageSettingsDisplay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsDisplay.qml \ No newline at end of file +../v3.30~1/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/PageSettingsGenerator.qml b/FileSets/v3.20~36/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.20~36/PageSettingsGenerator.qml +++ b/FileSets/v3.20~36/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/PageSettingsRelay.qml b/FileSets/v3.20~36/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.20~36/PageSettingsRelay.qml +++ b/FileSets/v3.20~36/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/PowerGauge.qml b/FileSets/v3.20~36/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.20~36/PowerGauge.qml +++ b/FileSets/v3.20~36/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/Tile.qml b/FileSets/v3.20~36/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.20~36/Tile.qml +++ b/FileSets/v3.20~36/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/TileDigIn.qml b/FileSets/v3.20~36/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.20~36/TileDigIn.qml +++ b/FileSets/v3.20~36/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/TileRelay.qml b/FileSets/v3.20~36/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.20~36/TileRelay.qml +++ b/FileSets/v3.20~36/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/TileText.qml b/FileSets/v3.20~36/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.20~36/TileText.qml +++ b/FileSets/v3.20~36/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/attributes.csv b/FileSets/v3.20~36/attributes.csv new file mode 120000 index 00000000..60c4d4d5 --- /dev/null +++ b/FileSets/v3.20~36/attributes.csv @@ -0,0 +1 @@ +../v3.30~1/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.20~36/dbus_digitalinputs.py b/FileSets/v3.20~36/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.20~36/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.20~36/dbus_generator.py b/FileSets/v3.20~36/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.20~36/dbus_generator.py +++ b/FileSets/v3.20~36/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~36/main.qml b/FileSets/v3.20~36/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.20~36/main.qml +++ b/FileSets/v3.20~36/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~36/styles.css b/FileSets/v3.20~36/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.20~36/styles.css +++ b/FileSets/v3.20~36/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~37/Battery.qml b/FileSets/v3.20~37/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.20~37/Battery.qml +++ b/FileSets/v3.20~37/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/DetailAcInput.qml b/FileSets/v3.20~37/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.20~37/DetailAcInput.qml +++ b/FileSets/v3.20~37/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/DetailInverter.qml b/FileSets/v3.20~37/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.20~37/DetailInverter.qml +++ b/FileSets/v3.20~37/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/DetailLoadsCombined.qml b/FileSets/v3.20~37/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.20~37/DetailLoadsCombined.qml +++ b/FileSets/v3.20~37/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/DetailLoadsOnInput.qml b/FileSets/v3.20~37/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.20~37/DetailLoadsOnInput.qml +++ b/FileSets/v3.20~37/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/DetailLoadsOnOutput.qml b/FileSets/v3.20~37/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.20~37/DetailLoadsOnOutput.qml +++ b/FileSets/v3.20~37/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/HubData.qml b/FileSets/v3.20~37/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.20~37/HubData.qml +++ b/FileSets/v3.20~37/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/MbEditBox.qml b/FileSets/v3.20~37/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.20~37/MbEditBox.qml +++ b/FileSets/v3.20~37/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/MbEditBoxDateTime.qml b/FileSets/v3.20~37/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.20~37/MbEditBoxDateTime.qml +++ b/FileSets/v3.20~37/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/MbItem.qml b/FileSets/v3.20~37/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.20~37/MbItem.qml +++ b/FileSets/v3.20~37/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/MbItemDigitalInput.qml b/FileSets/v3.20~37/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.20~37/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/MbSpinBox.qml b/FileSets/v3.20~37/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.20~37/MbSpinBox.qml +++ b/FileSets/v3.20~37/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/MbStyle.qml b/FileSets/v3.20~37/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.20~37/MbStyle.qml +++ b/FileSets/v3.20~37/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/MbSubMenu.qml b/FileSets/v3.20~37/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.20~37/MbSubMenu.qml +++ b/FileSets/v3.20~37/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/Multi.qml b/FileSets/v3.20~37/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.20~37/Multi.qml +++ b/FileSets/v3.20~37/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/ObjectAcConnection.qml b/FileSets/v3.20~37/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.20~37/ObjectAcConnection.qml +++ b/FileSets/v3.20~37/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~37/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.20~37/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.20~37/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewBox.qml b/FileSets/v3.20~37/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.20~37/OverviewBox.qml +++ b/FileSets/v3.20~37/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewConnection.qml b/FileSets/v3.20~37/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.20~37/OverviewConnection.qml +++ b/FileSets/v3.20~37/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewConnectionEnd.qml b/FileSets/v3.20~37/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.20~37/OverviewConnectionEnd.qml +++ b/FileSets/v3.20~37/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewFlowComplex.qml b/FileSets/v3.20~37/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.20~37/OverviewFlowComplex.qml +++ b/FileSets/v3.20~37/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~37/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.20~37/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.20~37/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~37/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.20~37/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.20~37/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewGridParallel.qml b/FileSets/v3.20~37/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.20~37/OverviewGridParallel.qml +++ b/FileSets/v3.20~37/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewHub.qml b/FileSets/v3.20~37/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.20~37/OverviewHub.qml +++ b/FileSets/v3.20~37/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewHubEnhanced.qml b/FileSets/v3.20~37/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.20~37/OverviewHubEnhanced.qml +++ b/FileSets/v3.20~37/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewMobileEnhanced.qml b/FileSets/v3.20~37/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.20~37/OverviewMobileEnhanced.qml +++ b/FileSets/v3.20~37/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewSolarCharger.qml b/FileSets/v3.20~37/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.20~37/OverviewSolarCharger.qml +++ b/FileSets/v3.20~37/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewSolarInverter.qml b/FileSets/v3.20~37/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.20~37/OverviewSolarInverter.qml +++ b/FileSets/v3.20~37/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewTankDelegate.qml b/FileSets/v3.20~37/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.20~37/OverviewTankDelegate.qml +++ b/FileSets/v3.20~37/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewTanks.qml b/FileSets/v3.20~37/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.20~37/OverviewTanks.qml +++ b/FileSets/v3.20~37/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~37/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.20~37/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.20~37/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/PageDigitalInput.qml b/FileSets/v3.20~37/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.20~37/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/PageGenerator.qml b/FileSets/v3.20~37/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.20~37/PageGenerator.qml +++ b/FileSets/v3.20~37/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/PageMain.qml b/FileSets/v3.20~37/PageMain.qml index c42009d8..6bcbcd1a 120000 --- a/FileSets/v3.20~37/PageMain.qml +++ b/FileSets/v3.20~37/PageMain.qml @@ -1 +1 @@ -../v3.20~42/PageMain.qml \ No newline at end of file +../v3.20~45/PageMain.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/PageSettingsDisplay.qml b/FileSets/v3.20~37/PageSettingsDisplay.qml index 809804c4..a7f4a2c4 120000 --- a/FileSets/v3.20~37/PageSettingsDisplay.qml +++ b/FileSets/v3.20~37/PageSettingsDisplay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsDisplay.qml \ No newline at end of file +../v3.30~1/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/PageSettingsGenerator.qml b/FileSets/v3.20~37/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.20~37/PageSettingsGenerator.qml +++ b/FileSets/v3.20~37/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/PageSettingsRelay.qml b/FileSets/v3.20~37/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.20~37/PageSettingsRelay.qml +++ b/FileSets/v3.20~37/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/PowerGauge.qml b/FileSets/v3.20~37/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.20~37/PowerGauge.qml +++ b/FileSets/v3.20~37/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/Tile.qml b/FileSets/v3.20~37/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.20~37/Tile.qml +++ b/FileSets/v3.20~37/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/TileDigIn.qml b/FileSets/v3.20~37/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.20~37/TileDigIn.qml +++ b/FileSets/v3.20~37/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/TileRelay.qml b/FileSets/v3.20~37/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.20~37/TileRelay.qml +++ b/FileSets/v3.20~37/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/TileText.qml b/FileSets/v3.20~37/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.20~37/TileText.qml +++ b/FileSets/v3.20~37/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/attributes.csv b/FileSets/v3.20~37/attributes.csv new file mode 120000 index 00000000..60c4d4d5 --- /dev/null +++ b/FileSets/v3.20~37/attributes.csv @@ -0,0 +1 @@ +../v3.30~1/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.20~37/dbus_digitalinputs.py b/FileSets/v3.20~37/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.20~37/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.20~37/dbus_generator.py b/FileSets/v3.20~37/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.20~37/dbus_generator.py +++ b/FileSets/v3.20~37/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~37/main.qml b/FileSets/v3.20~37/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.20~37/main.qml +++ b/FileSets/v3.20~37/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~37/startstop.py b/FileSets/v3.20~37/startstop.py index 2287387e..438ccc46 100644 --- a/FileSets/v3.20~37/startstop.py +++ b/FileSets/v3.20~37/startstop.py @@ -281,7 +281,6 @@ def __init__(self, instance): #### GuiMods warm-up / cool-down self._warmUpEndTime = 0 self._coolDownEndTime = 0 - self._postCoolDownEndTime = 0 self._ac1isIgnored = False self._ac2isIgnored = False self._activeAcInIsIgnored = False @@ -1206,7 +1205,7 @@ def _start_generator(self, condition): self._warmUpEndTime = 0 self._coolDownEndTime = 0 - self._postCoolDownEndTime = 0 + self._stoptime = 0 self._update_remote_switch() else: # WARMUP, COOLDOWN, RUNNING, STOPPING @@ -1230,6 +1229,7 @@ def _start_generator(self, condition): self._dbusservice['/RunningByCondition'] = condition self._dbusservice['/RunningByConditionCode'] = RunningConditions.lookup(condition) + def _stop_generator(self): state = self._dbusservice['/State'] remote_running = self._get_remote_switch_state() @@ -1237,55 +1237,46 @@ def _stop_generator(self): if running or remote_running: #### GuiMods warm-up / cool-down - # run for cool-down period before stopping - # cooldown end time is updated while generator is running - # and generator feeds Multi AC input - if self._currentTime < self._coolDownEndTime: - if state != States.COOLDOWN: - self._dbusservice['/State'] = States.COOLDOWN + if state == States.RUNNING: + state = States.COOLDOWN + if self._currentTime < self._coolDownEndTime: self.log_info ("starting cool-down") - return - - # When we arrive here, a stop command was given and cool-down period has elapesed - # Stop the engine, but if we're coming from cooldown, delay another - # while in the STOPPING state before reactivating AC-in. - if state == States.COOLDOWN: - self.log_info ("starting post cool-down") - # delay restoring load to give generator a chance to stop -#### GuiMods warm-up / cool-down - self._postCoolDownEndTime = self._currentTime + self._settings['postcooldowntime'] - self._dbusservice['/State'] = States.STOPPING - self._update_remote_switch() # Stop engine - self.log_info('Stopping generator that was running by %s condition' % - str(self._dbusservice['/RunningByCondition'])) - return - - # Wait for engine stop + elif self._settings['cooldowntime'] != 0: + self.log_info ("skipping cool-down -- no AC load on generator") + + # warm-up should also transition to stopping + # cool-down time will have expired since it's set to 0 when starting + # and there has not yet been a load on the generator + if state in (States.WARMUP, States.COOLDOWN): + # cool down complete + if self._currentTime > self._coolDownEndTime: + state = States.STOPPING + self.log_info('Stopping generator that was running by %s condition' % + str(self._dbusservice['/RunningByCondition'])) + self._update_remote_switch() # Stop engine + self._stoptime = self._currentTime + self._settings['generatorstoptime'] + if self._currentTime < self._stoptime: + self.log_info ("waiting for generator so stop") + if state == States.STOPPING: - if self._currentTime < self._postCoolDownEndTime: - return - else: - self.log_info ("post cool-down delay complete") - - # generator stop was reported when entering post cool-down - # don't report it again - else: - self.log_info('Stopping generator that was running by %s condition' % - str(self._dbusservice['/RunningByCondition'])) - - # All other possibilities are handled now. Cooldown is over or not - # configured and we waited for the generator to shut down. - self._dbusservice['/State'] = States.STOPPED - self._update_remote_switch() + # wait for stop period expired - finish up transition to STOPPED + if self._currentTime > self._stoptime: + if self._settings['generatorstoptime'] != 0: + self.log_info ("generator stop time reached - OK to reconnect AC") + state = States.STOPPED + self._update_remote_switch() + self._dbusservice['/RunningByCondition'] = '' + self._dbusservice['/RunningByConditionCode'] = RunningConditions.Stopped + self._update_accumulated_time() + self._starttime = 0 + self._dbusservice['/Runtime'] = 0 + self._dbusservice['/ManualStartTimer'] = 0 + self._manualstarttimer = 0 + self._last_runtime_update = 0 + + self._dbusservice['/State'] = state #### end GuiMods warm-up / cool-down - self._dbusservice['/RunningByCondition'] = '' - self._dbusservice['/RunningByConditionCode'] = RunningConditions.Stopped - self._update_accumulated_time() - self._starttime = 0 - self._dbusservice['/Runtime'] = 0 - self._dbusservice['/ManualStartTimer'] = 0 - self._manualstarttimer = 0 - self._last_runtime_update = 0 + # This is here so the Multi/Quattro can be told to disconnect AC-in, # so that we can do warm-up and cool-down. @@ -1334,9 +1325,9 @@ def _update_remote_switch(self): self._set_remote_switch_state(dbus.Int32(v, variant_level=1)) #### GuiMods if v == True: - logging.info ("updating remote switch to running") + self.log_info ("updating remote switch to running") else: - logging.info ("updating remote switch to stopped") + self.log_info ("updating remote switch to stopped") def _get_remote_switch_state(self): raise Exception('This function should be overridden') diff --git a/FileSets/v3.20~37/styles.css b/FileSets/v3.20~37/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.20~37/styles.css +++ b/FileSets/v3.20~37/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~38/Battery.qml b/FileSets/v3.20~38/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.20~38/Battery.qml +++ b/FileSets/v3.20~38/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/DetailAcInput.qml b/FileSets/v3.20~38/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.20~38/DetailAcInput.qml +++ b/FileSets/v3.20~38/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/DetailInverter.qml b/FileSets/v3.20~38/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.20~38/DetailInverter.qml +++ b/FileSets/v3.20~38/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/DetailLoadsCombined.qml b/FileSets/v3.20~38/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.20~38/DetailLoadsCombined.qml +++ b/FileSets/v3.20~38/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/DetailLoadsOnInput.qml b/FileSets/v3.20~38/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.20~38/DetailLoadsOnInput.qml +++ b/FileSets/v3.20~38/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/DetailLoadsOnOutput.qml b/FileSets/v3.20~38/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.20~38/DetailLoadsOnOutput.qml +++ b/FileSets/v3.20~38/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/HubData.qml b/FileSets/v3.20~38/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.20~38/HubData.qml +++ b/FileSets/v3.20~38/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/MbEditBox.qml b/FileSets/v3.20~38/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.20~38/MbEditBox.qml +++ b/FileSets/v3.20~38/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/MbEditBoxDateTime.qml b/FileSets/v3.20~38/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.20~38/MbEditBoxDateTime.qml +++ b/FileSets/v3.20~38/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/MbItem.qml b/FileSets/v3.20~38/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.20~38/MbItem.qml +++ b/FileSets/v3.20~38/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/MbItemDigitalInput.qml b/FileSets/v3.20~38/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.20~38/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/MbSpinBox.qml b/FileSets/v3.20~38/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.20~38/MbSpinBox.qml +++ b/FileSets/v3.20~38/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/MbStyle.qml b/FileSets/v3.20~38/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.20~38/MbStyle.qml +++ b/FileSets/v3.20~38/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/MbSubMenu.qml b/FileSets/v3.20~38/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.20~38/MbSubMenu.qml +++ b/FileSets/v3.20~38/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/Multi.qml b/FileSets/v3.20~38/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.20~38/Multi.qml +++ b/FileSets/v3.20~38/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/ObjectAcConnection.qml b/FileSets/v3.20~38/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.20~38/ObjectAcConnection.qml +++ b/FileSets/v3.20~38/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~38/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.20~38/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.20~38/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewBox.qml b/FileSets/v3.20~38/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.20~38/OverviewBox.qml +++ b/FileSets/v3.20~38/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewConnection.qml b/FileSets/v3.20~38/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.20~38/OverviewConnection.qml +++ b/FileSets/v3.20~38/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewConnectionEnd.qml b/FileSets/v3.20~38/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.20~38/OverviewConnectionEnd.qml +++ b/FileSets/v3.20~38/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewFlowComplex.qml b/FileSets/v3.20~38/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.20~38/OverviewFlowComplex.qml +++ b/FileSets/v3.20~38/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~38/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.20~38/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.20~38/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~38/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.20~38/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.20~38/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewGridParallel.qml b/FileSets/v3.20~38/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.20~38/OverviewGridParallel.qml +++ b/FileSets/v3.20~38/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewHub.qml b/FileSets/v3.20~38/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.20~38/OverviewHub.qml +++ b/FileSets/v3.20~38/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewHubEnhanced.qml b/FileSets/v3.20~38/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.20~38/OverviewHubEnhanced.qml +++ b/FileSets/v3.20~38/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewMobileEnhanced.qml b/FileSets/v3.20~38/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.20~38/OverviewMobileEnhanced.qml +++ b/FileSets/v3.20~38/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewSolarCharger.qml b/FileSets/v3.20~38/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.20~38/OverviewSolarCharger.qml +++ b/FileSets/v3.20~38/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewSolarInverter.qml b/FileSets/v3.20~38/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.20~38/OverviewSolarInverter.qml +++ b/FileSets/v3.20~38/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewTankDelegate.qml b/FileSets/v3.20~38/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.20~38/OverviewTankDelegate.qml +++ b/FileSets/v3.20~38/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewTanks.qml b/FileSets/v3.20~38/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.20~38/OverviewTanks.qml +++ b/FileSets/v3.20~38/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~38/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.20~38/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.20~38/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/PageDigitalInput.qml b/FileSets/v3.20~38/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.20~38/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/PageGenerator.qml b/FileSets/v3.20~38/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.20~38/PageGenerator.qml +++ b/FileSets/v3.20~38/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/PageMain.qml b/FileSets/v3.20~38/PageMain.qml index c42009d8..6bcbcd1a 120000 --- a/FileSets/v3.20~38/PageMain.qml +++ b/FileSets/v3.20~38/PageMain.qml @@ -1 +1 @@ -../v3.20~42/PageMain.qml \ No newline at end of file +../v3.20~45/PageMain.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/PageSettingsDisplay.qml b/FileSets/v3.20~38/PageSettingsDisplay.qml index 809804c4..a7f4a2c4 120000 --- a/FileSets/v3.20~38/PageSettingsDisplay.qml +++ b/FileSets/v3.20~38/PageSettingsDisplay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsDisplay.qml \ No newline at end of file +../v3.30~1/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/PageSettingsGenerator.qml b/FileSets/v3.20~38/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.20~38/PageSettingsGenerator.qml +++ b/FileSets/v3.20~38/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/PageSettingsRelay.qml b/FileSets/v3.20~38/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.20~38/PageSettingsRelay.qml +++ b/FileSets/v3.20~38/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/PowerGauge.qml b/FileSets/v3.20~38/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.20~38/PowerGauge.qml +++ b/FileSets/v3.20~38/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/Tile.qml b/FileSets/v3.20~38/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.20~38/Tile.qml +++ b/FileSets/v3.20~38/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/TileDigIn.qml b/FileSets/v3.20~38/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.20~38/TileDigIn.qml +++ b/FileSets/v3.20~38/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/TileRelay.qml b/FileSets/v3.20~38/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.20~38/TileRelay.qml +++ b/FileSets/v3.20~38/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/TileText.qml b/FileSets/v3.20~38/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.20~38/TileText.qml +++ b/FileSets/v3.20~38/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/attributes.csv b/FileSets/v3.20~38/attributes.csv new file mode 120000 index 00000000..60c4d4d5 --- /dev/null +++ b/FileSets/v3.20~38/attributes.csv @@ -0,0 +1 @@ +../v3.30~1/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.20~38/dbus_digitalinputs.py b/FileSets/v3.20~38/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.20~38/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.20~38/dbus_generator.py b/FileSets/v3.20~38/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.20~38/dbus_generator.py +++ b/FileSets/v3.20~38/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~38/main.qml b/FileSets/v3.20~38/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.20~38/main.qml +++ b/FileSets/v3.20~38/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~38/startstop.py b/FileSets/v3.20~38/startstop.py index 81dd97dd..566c105d 100644 --- a/FileSets/v3.20~38/startstop.py +++ b/FileSets/v3.20~38/startstop.py @@ -281,7 +281,6 @@ def __init__(self, instance): #### GuiMods warm-up / cool-down self._warmUpEndTime = 0 self._coolDownEndTime = 0 - self._postCoolDownEndTime = 0 self._ac1isIgnored = False self._ac2isIgnored = False self._activeAcInIsIgnored = False @@ -1208,7 +1207,7 @@ def _start_generator(self, condition): self._warmUpEndTime = 0 self._coolDownEndTime = 0 - self._postCoolDownEndTime = 0 + self._stoptime = 0 self._update_remote_switch() else: # WARMUP, COOLDOWN, RUNNING, STOPPING @@ -1239,55 +1238,46 @@ def _stop_generator(self): if running or remote_running: #### GuiMods warm-up / cool-down - # run for cool-down period before stopping - # cooldown end time is updated while generator is running - # and generator feeds Multi AC input - if self._currentTime < self._coolDownEndTime: - if state != States.COOLDOWN: - self._dbusservice['/State'] = States.COOLDOWN + if state == States.RUNNING: + state = States.COOLDOWN + if self._currentTime < self._coolDownEndTime: self.log_info ("starting cool-down") - return - - # When we arrive here, a stop command was given and cool-down period has elapesed - # Stop the engine, but if we're coming from cooldown, delay another - # while in the STOPPING state before reactivating AC-in. - if state == States.COOLDOWN: - self.log_info ("starting post cool-down") - # delay restoring load to give generator a chance to stop -#### GuiMods warm-up / cool-down - self._postCoolDownEndTime = self._currentTime + self._settings['postcooldowntime'] - self._dbusservice['/State'] = States.STOPPING - self._update_remote_switch() # Stop engine - self.log_info('Stopping generator that was running by %s condition' % - str(self._dbusservice['/RunningByCondition'])) - return - - # Wait for engine stop + elif self._settings['cooldowntime'] != 0: + self.log_info ("skipping cool-down -- no AC load on generator") + + # warm-up should also transition to stopping + # cool-down time will have expired since it's set to 0 when starting + # and there has not yet been a load on the generator + if state in (States.WARMUP, States.COOLDOWN): + # cool down complete + if self._currentTime > self._coolDownEndTime: + state = States.STOPPING + self.log_info('Stopping generator that was running by %s condition' % + str(self._dbusservice['/RunningByCondition'])) + self._update_remote_switch() # Stop engine + self._stoptime = self._currentTime + self._settings['generatorstoptime'] + if self._currentTime < self._stoptime: + self.log_info ("waiting for generator so stop") + if state == States.STOPPING: - if self._currentTime < self._postCoolDownEndTime: - return - else: - self.log_info ("post cool-down delay complete") - - # generator stop was reported when entering post cool-down - # don't report it again - else: - self.log_info('Stopping generator that was running by %s condition' % - str(self._dbusservice['/RunningByCondition'])) - - # All other possibilities are handled now. Cooldown is over or not - # configured and we waited for the generator to shut down. - self._dbusservice['/State'] = States.STOPPED - self._update_remote_switch() + # wait for stop period expired - finish up transition to STOPPED + if self._currentTime > self._stoptime: + if self._settings['generatorstoptime'] != 0: + self.log_info ("generator stop time reached - OK to reconnect AC") + state = States.STOPPED + self._update_remote_switch() + self._dbusservice['/RunningByCondition'] = '' + self._dbusservice['/RunningByConditionCode'] = RunningConditions.Stopped + self._update_accumulated_time() + self._starttime = 0 + self._dbusservice['/Runtime'] = 0 + self._dbusservice['/ManualStartTimer'] = 0 + self._manualstarttimer = 0 + self._last_runtime_update = 0 + + self._dbusservice['/State'] = state #### end GuiMods warm-up / cool-down - self._dbusservice['/RunningByCondition'] = '' - self._dbusservice['/RunningByConditionCode'] = RunningConditions.Stopped - self._update_accumulated_time() - self._starttime = 0 - self._dbusservice['/Runtime'] = 0 - self._dbusservice['/ManualStartTimer'] = 0 - self._manualstarttimer = 0 - self._last_runtime_update = 0 + # This is here so the Multi/Quattro can be told to disconnect AC-in, # so that we can do warm-up and cool-down. @@ -1336,9 +1326,9 @@ def _update_remote_switch(self): self._set_remote_switch_state(dbus.Int32(v, variant_level=1)) #### GuiMods if v == True: - logging.info ("updating remote switch to running") + self.log_info ("updating remote switch to running") else: - logging.info ("updating remote switch to stopped") + self.log_info ("updating remote switch to stopped") def _get_remote_switch_state(self): raise Exception('This function should be overridden') diff --git a/FileSets/v3.20~38/styles.css b/FileSets/v3.20~38/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.20~38/styles.css +++ b/FileSets/v3.20~38/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~40/Battery.qml b/FileSets/v3.20~40/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.20~40/Battery.qml +++ b/FileSets/v3.20~40/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/DetailAcInput.qml b/FileSets/v3.20~40/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.20~40/DetailAcInput.qml +++ b/FileSets/v3.20~40/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/DetailInverter.qml b/FileSets/v3.20~40/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.20~40/DetailInverter.qml +++ b/FileSets/v3.20~40/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/DetailLoadsCombined.qml b/FileSets/v3.20~40/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.20~40/DetailLoadsCombined.qml +++ b/FileSets/v3.20~40/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/DetailLoadsOnInput.qml b/FileSets/v3.20~40/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.20~40/DetailLoadsOnInput.qml +++ b/FileSets/v3.20~40/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/DetailLoadsOnOutput.qml b/FileSets/v3.20~40/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.20~40/DetailLoadsOnOutput.qml +++ b/FileSets/v3.20~40/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/HubData.qml b/FileSets/v3.20~40/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.20~40/HubData.qml +++ b/FileSets/v3.20~40/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/MbEditBox.qml b/FileSets/v3.20~40/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.20~40/MbEditBox.qml +++ b/FileSets/v3.20~40/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/MbEditBoxDateTime.qml b/FileSets/v3.20~40/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.20~40/MbEditBoxDateTime.qml +++ b/FileSets/v3.20~40/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/MbItem.qml b/FileSets/v3.20~40/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.20~40/MbItem.qml +++ b/FileSets/v3.20~40/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/MbItemDigitalInput.qml b/FileSets/v3.20~40/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.20~40/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/MbSpinBox.qml b/FileSets/v3.20~40/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.20~40/MbSpinBox.qml +++ b/FileSets/v3.20~40/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/MbStyle.qml b/FileSets/v3.20~40/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.20~40/MbStyle.qml +++ b/FileSets/v3.20~40/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/MbSubMenu.qml b/FileSets/v3.20~40/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.20~40/MbSubMenu.qml +++ b/FileSets/v3.20~40/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/Multi.qml b/FileSets/v3.20~40/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.20~40/Multi.qml +++ b/FileSets/v3.20~40/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/ObjectAcConnection.qml b/FileSets/v3.20~40/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.20~40/ObjectAcConnection.qml +++ b/FileSets/v3.20~40/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~40/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.20~40/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.20~40/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewBox.qml b/FileSets/v3.20~40/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.20~40/OverviewBox.qml +++ b/FileSets/v3.20~40/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewConnection.qml b/FileSets/v3.20~40/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.20~40/OverviewConnection.qml +++ b/FileSets/v3.20~40/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewConnectionEnd.qml b/FileSets/v3.20~40/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.20~40/OverviewConnectionEnd.qml +++ b/FileSets/v3.20~40/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewFlowComplex.qml b/FileSets/v3.20~40/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.20~40/OverviewFlowComplex.qml +++ b/FileSets/v3.20~40/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~40/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.20~40/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.20~40/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~40/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.20~40/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.20~40/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewGridParallel.qml b/FileSets/v3.20~40/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.20~40/OverviewGridParallel.qml +++ b/FileSets/v3.20~40/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewHub.qml b/FileSets/v3.20~40/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.20~40/OverviewHub.qml +++ b/FileSets/v3.20~40/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewHubEnhanced.qml b/FileSets/v3.20~40/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.20~40/OverviewHubEnhanced.qml +++ b/FileSets/v3.20~40/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewMobileEnhanced.qml b/FileSets/v3.20~40/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.20~40/OverviewMobileEnhanced.qml +++ b/FileSets/v3.20~40/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewSolarCharger.qml b/FileSets/v3.20~40/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.20~40/OverviewSolarCharger.qml +++ b/FileSets/v3.20~40/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewSolarInverter.qml b/FileSets/v3.20~40/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.20~40/OverviewSolarInverter.qml +++ b/FileSets/v3.20~40/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewTankDelegate.qml b/FileSets/v3.20~40/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.20~40/OverviewTankDelegate.qml +++ b/FileSets/v3.20~40/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewTanks.qml b/FileSets/v3.20~40/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.20~40/OverviewTanks.qml +++ b/FileSets/v3.20~40/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~40/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.20~40/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.20~40/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/PageDigitalInput.qml b/FileSets/v3.20~40/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.20~40/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/PageGenerator.qml b/FileSets/v3.20~40/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.20~40/PageGenerator.qml +++ b/FileSets/v3.20~40/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/PageMain.qml b/FileSets/v3.20~40/PageMain.qml index c42009d8..6bcbcd1a 120000 --- a/FileSets/v3.20~40/PageMain.qml +++ b/FileSets/v3.20~40/PageMain.qml @@ -1 +1 @@ -../v3.20~42/PageMain.qml \ No newline at end of file +../v3.20~45/PageMain.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/PageSettingsDisplay.qml b/FileSets/v3.20~40/PageSettingsDisplay.qml index 809804c4..a7f4a2c4 120000 --- a/FileSets/v3.20~40/PageSettingsDisplay.qml +++ b/FileSets/v3.20~40/PageSettingsDisplay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsDisplay.qml \ No newline at end of file +../v3.30~1/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/PageSettingsGenerator.qml b/FileSets/v3.20~40/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.20~40/PageSettingsGenerator.qml +++ b/FileSets/v3.20~40/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/PageSettingsGuiMods.qml b/FileSets/v3.20~40/PageSettingsGuiMods.qml index 879fe9c7..c3d81573 120000 --- a/FileSets/v3.20~40/PageSettingsGuiMods.qml +++ b/FileSets/v3.20~40/PageSettingsGuiMods.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGuiMods.qml \ No newline at end of file +../v3.30~1/PageSettingsGuiMods.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/PageSettingsRelay.qml b/FileSets/v3.20~40/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.20~40/PageSettingsRelay.qml +++ b/FileSets/v3.20~40/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/PowerGauge.qml b/FileSets/v3.20~40/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.20~40/PowerGauge.qml +++ b/FileSets/v3.20~40/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/Tile.qml b/FileSets/v3.20~40/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.20~40/Tile.qml +++ b/FileSets/v3.20~40/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/TileDigIn.qml b/FileSets/v3.20~40/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.20~40/TileDigIn.qml +++ b/FileSets/v3.20~40/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/TileRelay.qml b/FileSets/v3.20~40/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.20~40/TileRelay.qml +++ b/FileSets/v3.20~40/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/TileText.qml b/FileSets/v3.20~40/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.20~40/TileText.qml +++ b/FileSets/v3.20~40/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/attributes.csv b/FileSets/v3.20~40/attributes.csv new file mode 120000 index 00000000..60c4d4d5 --- /dev/null +++ b/FileSets/v3.20~40/attributes.csv @@ -0,0 +1 @@ +../v3.30~1/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.20~40/dbus_digitalinputs.py b/FileSets/v3.20~40/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.20~40/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.20~40/dbus_generator.py b/FileSets/v3.20~40/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.20~40/dbus_generator.py +++ b/FileSets/v3.20~40/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~40/main.qml b/FileSets/v3.20~40/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.20~40/main.qml +++ b/FileSets/v3.20~40/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~40/startstop.py b/FileSets/v3.20~40/startstop.py index 45d29332..7ba211a4 120000 --- a/FileSets/v3.20~40/startstop.py +++ b/FileSets/v3.20~40/startstop.py @@ -1 +1 @@ -../v3.20~42/startstop.py \ No newline at end of file +../v3.20~43/startstop.py \ No newline at end of file diff --git a/FileSets/v3.20~40/styles.css b/FileSets/v3.20~40/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.20~40/styles.css +++ b/FileSets/v3.20~40/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~41/Battery.qml b/FileSets/v3.20~41/Battery.qml index 794e9dd0..c7149e0b 120000 --- a/FileSets/v3.20~41/Battery.qml +++ b/FileSets/v3.20~41/Battery.qml @@ -1 +1 @@ -../v3.20~42/Battery.qml \ No newline at end of file +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/DetailAcInput.qml b/FileSets/v3.20~41/DetailAcInput.qml index 8b226ba8..eafc88e8 120000 --- a/FileSets/v3.20~41/DetailAcInput.qml +++ b/FileSets/v3.20~41/DetailAcInput.qml @@ -1 +1 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/DetailInverter.qml b/FileSets/v3.20~41/DetailInverter.qml index 5ddd5ce8..f51d2a5f 120000 --- a/FileSets/v3.20~41/DetailInverter.qml +++ b/FileSets/v3.20~41/DetailInverter.qml @@ -1 +1 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/DetailLoadsCombined.qml b/FileSets/v3.20~41/DetailLoadsCombined.qml index b000afaa..8b48e62a 120000 --- a/FileSets/v3.20~41/DetailLoadsCombined.qml +++ b/FileSets/v3.20~41/DetailLoadsCombined.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/DetailLoadsOnInput.qml b/FileSets/v3.20~41/DetailLoadsOnInput.qml index 901e0820..dede455b 120000 --- a/FileSets/v3.20~41/DetailLoadsOnInput.qml +++ b/FileSets/v3.20~41/DetailLoadsOnInput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/DetailLoadsOnOutput.qml b/FileSets/v3.20~41/DetailLoadsOnOutput.qml index 142fee12..431fc2d5 120000 --- a/FileSets/v3.20~41/DetailLoadsOnOutput.qml +++ b/FileSets/v3.20~41/DetailLoadsOnOutput.qml @@ -1 +1 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/HubData.qml b/FileSets/v3.20~41/HubData.qml index df42560b..3c632321 120000 --- a/FileSets/v3.20~41/HubData.qml +++ b/FileSets/v3.20~41/HubData.qml @@ -1 +1 @@ -../v3.20~42/HubData.qml \ No newline at end of file +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/MbEditBox.qml b/FileSets/v3.20~41/MbEditBox.qml index a6185dba..1667d1ec 120000 --- a/FileSets/v3.20~41/MbEditBox.qml +++ b/FileSets/v3.20~41/MbEditBox.qml @@ -1 +1 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/MbEditBoxDateTime.qml b/FileSets/v3.20~41/MbEditBoxDateTime.qml index 158d88d0..ae8e4115 120000 --- a/FileSets/v3.20~41/MbEditBoxDateTime.qml +++ b/FileSets/v3.20~41/MbEditBoxDateTime.qml @@ -1 +1 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/MbItem.qml b/FileSets/v3.20~41/MbItem.qml index 8dfa4b06..a67db29c 120000 --- a/FileSets/v3.20~41/MbItem.qml +++ b/FileSets/v3.20~41/MbItem.qml @@ -1 +1 @@ -../v3.20~42/MbItem.qml \ No newline at end of file +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/MbItemDigitalInput.qml b/FileSets/v3.20~41/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.20~41/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/MbSpinBox.qml b/FileSets/v3.20~41/MbSpinBox.qml index b0dffaae..a485feef 120000 --- a/FileSets/v3.20~41/MbSpinBox.qml +++ b/FileSets/v3.20~41/MbSpinBox.qml @@ -1 +1 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/MbStyle.qml b/FileSets/v3.20~41/MbStyle.qml index 4accbc46..93b051ea 120000 --- a/FileSets/v3.20~41/MbStyle.qml +++ b/FileSets/v3.20~41/MbStyle.qml @@ -1 +1 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/MbSubMenu.qml b/FileSets/v3.20~41/MbSubMenu.qml index d1172169..a48ff284 120000 --- a/FileSets/v3.20~41/MbSubMenu.qml +++ b/FileSets/v3.20~41/MbSubMenu.qml @@ -1 +1 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/Multi.qml b/FileSets/v3.20~41/Multi.qml index 9a2fa57b..2c7111e5 120000 --- a/FileSets/v3.20~41/Multi.qml +++ b/FileSets/v3.20~41/Multi.qml @@ -1 +1 @@ -../v3.20~42/Multi.qml \ No newline at end of file +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/ObjectAcConnection.qml b/FileSets/v3.20~41/ObjectAcConnection.qml index 406d6613..d56c08b7 120000 --- a/FileSets/v3.20~41/ObjectAcConnection.qml +++ b/FileSets/v3.20~41/ObjectAcConnection.qml @@ -1 +1 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~41/OverviewAcValuesEnhanced.qml index 09322f1d..74f5a60c 120000 --- a/FileSets/v3.20~41/OverviewAcValuesEnhanced.qml +++ b/FileSets/v3.20~41/OverviewAcValuesEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewBox.qml b/FileSets/v3.20~41/OverviewBox.qml index 8c3baac0..eb491c22 120000 --- a/FileSets/v3.20~41/OverviewBox.qml +++ b/FileSets/v3.20~41/OverviewBox.qml @@ -1 +1 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewConnection.qml b/FileSets/v3.20~41/OverviewConnection.qml index 52cb8f85..30f98775 120000 --- a/FileSets/v3.20~41/OverviewConnection.qml +++ b/FileSets/v3.20~41/OverviewConnection.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewConnectionEnd.qml b/FileSets/v3.20~41/OverviewConnectionEnd.qml index 04bf981f..b075cf89 120000 --- a/FileSets/v3.20~41/OverviewConnectionEnd.qml +++ b/FileSets/v3.20~41/OverviewConnectionEnd.qml @@ -1 +1 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewFlowComplex.qml b/FileSets/v3.20~41/OverviewFlowComplex.qml index 6089ae4c..b999d865 120000 --- a/FileSets/v3.20~41/OverviewFlowComplex.qml +++ b/FileSets/v3.20~41/OverviewFlowComplex.qml @@ -1 +1 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~41/OverviewGeneratorEnhanced.qml index ebdde7dc..8e49ae38 120000 --- a/FileSets/v3.20~41/OverviewGeneratorEnhanced.qml +++ b/FileSets/v3.20~41/OverviewGeneratorEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~41/OverviewGeneratorRelayEnhanced.qml index 54b24f30..89ec5c80 120000 --- a/FileSets/v3.20~41/OverviewGeneratorRelayEnhanced.qml +++ b/FileSets/v3.20~41/OverviewGeneratorRelayEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewGridParallel.qml b/FileSets/v3.20~41/OverviewGridParallel.qml index c31a5a0f..8805f49b 120000 --- a/FileSets/v3.20~41/OverviewGridParallel.qml +++ b/FileSets/v3.20~41/OverviewGridParallel.qml @@ -1 +1 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewHub.qml b/FileSets/v3.20~41/OverviewHub.qml index 9f251775..4f783368 120000 --- a/FileSets/v3.20~41/OverviewHub.qml +++ b/FileSets/v3.20~41/OverviewHub.qml @@ -1 +1 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewHubEnhanced.qml b/FileSets/v3.20~41/OverviewHubEnhanced.qml index 0c37301c..1313cd6d 120000 --- a/FileSets/v3.20~41/OverviewHubEnhanced.qml +++ b/FileSets/v3.20~41/OverviewHubEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewMobileEnhanced.qml b/FileSets/v3.20~41/OverviewMobileEnhanced.qml index 79cb1fcb..cf10db90 120000 --- a/FileSets/v3.20~41/OverviewMobileEnhanced.qml +++ b/FileSets/v3.20~41/OverviewMobileEnhanced.qml @@ -1 +1 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewSolarCharger.qml b/FileSets/v3.20~41/OverviewSolarCharger.qml index 73220270..c91bd340 120000 --- a/FileSets/v3.20~41/OverviewSolarCharger.qml +++ b/FileSets/v3.20~41/OverviewSolarCharger.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewSolarInverter.qml b/FileSets/v3.20~41/OverviewSolarInverter.qml index dd6f7b40..7b5882bd 120000 --- a/FileSets/v3.20~41/OverviewSolarInverter.qml +++ b/FileSets/v3.20~41/OverviewSolarInverter.qml @@ -1 +1 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewTankDelegate.qml b/FileSets/v3.20~41/OverviewTankDelegate.qml index 9ac457b6..d04fbe81 120000 --- a/FileSets/v3.20~41/OverviewTankDelegate.qml +++ b/FileSets/v3.20~41/OverviewTankDelegate.qml @@ -1 +1 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewTanks.qml b/FileSets/v3.20~41/OverviewTanks.qml index 975b464a..fbfd8158 120000 --- a/FileSets/v3.20~41/OverviewTanks.qml +++ b/FileSets/v3.20~41/OverviewTanks.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~41/OverviewTanksTempsDigInputs.qml index 6cd0cfc3..90d6f2b8 120000 --- a/FileSets/v3.20~41/OverviewTanksTempsDigInputs.qml +++ b/FileSets/v3.20~41/OverviewTanksTempsDigInputs.qml @@ -1 +1 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/PageDigitalInput.qml b/FileSets/v3.20~41/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.20~41/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/PageGenerator.qml b/FileSets/v3.20~41/PageGenerator.qml index 05b5cccb..67c2caf8 120000 --- a/FileSets/v3.20~41/PageGenerator.qml +++ b/FileSets/v3.20~41/PageGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/PageMain.qml b/FileSets/v3.20~41/PageMain.qml index c42009d8..6bcbcd1a 120000 --- a/FileSets/v3.20~41/PageMain.qml +++ b/FileSets/v3.20~41/PageMain.qml @@ -1 +1 @@ -../v3.20~42/PageMain.qml \ No newline at end of file +../v3.20~45/PageMain.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/PageSettingsDisplay.qml b/FileSets/v3.20~41/PageSettingsDisplay.qml index 809804c4..a7f4a2c4 120000 --- a/FileSets/v3.20~41/PageSettingsDisplay.qml +++ b/FileSets/v3.20~41/PageSettingsDisplay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsDisplay.qml \ No newline at end of file +../v3.30~1/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/PageSettingsGenerator.qml b/FileSets/v3.20~41/PageSettingsGenerator.qml index 54543635..ec678157 120000 --- a/FileSets/v3.20~41/PageSettingsGenerator.qml +++ b/FileSets/v3.20~41/PageSettingsGenerator.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file +../v3.20~43/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/PageSettingsGuiMods.qml b/FileSets/v3.20~41/PageSettingsGuiMods.qml index 879fe9c7..c3d81573 120000 --- a/FileSets/v3.20~41/PageSettingsGuiMods.qml +++ b/FileSets/v3.20~41/PageSettingsGuiMods.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsGuiMods.qml \ No newline at end of file +../v3.30~1/PageSettingsGuiMods.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/PageSettingsRelay.qml b/FileSets/v3.20~41/PageSettingsRelay.qml index e083e872..97e3819f 120000 --- a/FileSets/v3.20~41/PageSettingsRelay.qml +++ b/FileSets/v3.20~41/PageSettingsRelay.qml @@ -1 +1 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/PowerGauge.qml b/FileSets/v3.20~41/PowerGauge.qml index 2ed81452..ca15d0b8 120000 --- a/FileSets/v3.20~41/PowerGauge.qml +++ b/FileSets/v3.20~41/PowerGauge.qml @@ -1 +1 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/Tile.qml b/FileSets/v3.20~41/Tile.qml index db98506f..1fa513f1 120000 --- a/FileSets/v3.20~41/Tile.qml +++ b/FileSets/v3.20~41/Tile.qml @@ -1 +1 @@ -../v3.20~42/Tile.qml \ No newline at end of file +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/TileDigIn.qml b/FileSets/v3.20~41/TileDigIn.qml index c6408a84..afe73e1a 120000 --- a/FileSets/v3.20~41/TileDigIn.qml +++ b/FileSets/v3.20~41/TileDigIn.qml @@ -1 +1 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/TileRelay.qml b/FileSets/v3.20~41/TileRelay.qml index 200caf92..76c4f708 120000 --- a/FileSets/v3.20~41/TileRelay.qml +++ b/FileSets/v3.20~41/TileRelay.qml @@ -1 +1 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/TileText.qml b/FileSets/v3.20~41/TileText.qml index 8f17d6b3..0bdf2dfe 120000 --- a/FileSets/v3.20~41/TileText.qml +++ b/FileSets/v3.20~41/TileText.qml @@ -1 +1 @@ -../v3.20~42/TileText.qml \ No newline at end of file +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/attributes.csv b/FileSets/v3.20~41/attributes.csv new file mode 120000 index 00000000..60c4d4d5 --- /dev/null +++ b/FileSets/v3.20~41/attributes.csv @@ -0,0 +1 @@ +../v3.30~1/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.20~41/dbus_digitalinputs.py b/FileSets/v3.20~41/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.20~41/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.20~41/dbus_generator.py b/FileSets/v3.20~41/dbus_generator.py index f0d38f59..46fdc3e2 120000 --- a/FileSets/v3.20~41/dbus_generator.py +++ b/FileSets/v3.20~41/dbus_generator.py @@ -1 +1 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file +../v3.20~43/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~41/main.qml b/FileSets/v3.20~41/main.qml index aafeae08..3643ba23 120000 --- a/FileSets/v3.20~41/main.qml +++ b/FileSets/v3.20~41/main.qml @@ -1 +1 @@ -../v3.20~42/main.qml \ No newline at end of file +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~41/startstop.py b/FileSets/v3.20~41/startstop.py index 45d29332..7ba211a4 120000 --- a/FileSets/v3.20~41/startstop.py +++ b/FileSets/v3.20~41/startstop.py @@ -1 +1 @@ -../v3.20~42/startstop.py \ No newline at end of file +../v3.20~43/startstop.py \ No newline at end of file diff --git a/FileSets/v3.20~41/styles.css b/FileSets/v3.20~41/styles.css index 4af38df2..8f367634 120000 --- a/FileSets/v3.20~41/styles.css +++ b/FileSets/v3.20~41/styles.css @@ -1 +1 @@ -../v3.20~42/styles.css \ No newline at end of file +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~42/COMPLETE b/FileSets/v3.20~42/COMPLETE deleted file mode 100644 index e69de29b..00000000 diff --git a/FileSets/v3.20~43/Battery.qml b/FileSets/v3.20~43/Battery.qml new file mode 120000 index 00000000..c7149e0b --- /dev/null +++ b/FileSets/v3.20~43/Battery.qml @@ -0,0 +1 @@ +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~17/COMPLETE b/FileSets/v3.20~43/COMPLETE similarity index 100% rename from FileSets/v3.20~17/COMPLETE rename to FileSets/v3.20~43/COMPLETE diff --git a/FileSets/v3.20~43/DetailAcInput.qml b/FileSets/v3.20~43/DetailAcInput.qml new file mode 120000 index 00000000..eafc88e8 --- /dev/null +++ b/FileSets/v3.20~43/DetailAcInput.qml @@ -0,0 +1 @@ +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/DetailInverter.qml b/FileSets/v3.20~43/DetailInverter.qml new file mode 120000 index 00000000..f51d2a5f --- /dev/null +++ b/FileSets/v3.20~43/DetailInverter.qml @@ -0,0 +1 @@ +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/DetailLoadsCombined.qml b/FileSets/v3.20~43/DetailLoadsCombined.qml new file mode 120000 index 00000000..8b48e62a --- /dev/null +++ b/FileSets/v3.20~43/DetailLoadsCombined.qml @@ -0,0 +1 @@ +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/DetailLoadsOnInput.qml b/FileSets/v3.20~43/DetailLoadsOnInput.qml new file mode 120000 index 00000000..dede455b --- /dev/null +++ b/FileSets/v3.20~43/DetailLoadsOnInput.qml @@ -0,0 +1 @@ +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/DetailLoadsOnOutput.qml b/FileSets/v3.20~43/DetailLoadsOnOutput.qml new file mode 120000 index 00000000..431fc2d5 --- /dev/null +++ b/FileSets/v3.20~43/DetailLoadsOnOutput.qml @@ -0,0 +1 @@ +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/HubData.qml b/FileSets/v3.20~43/HubData.qml new file mode 120000 index 00000000..3c632321 --- /dev/null +++ b/FileSets/v3.20~43/HubData.qml @@ -0,0 +1 @@ +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/MbEditBox.qml b/FileSets/v3.20~43/MbEditBox.qml new file mode 120000 index 00000000..1667d1ec --- /dev/null +++ b/FileSets/v3.20~43/MbEditBox.qml @@ -0,0 +1 @@ +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/MbEditBoxDateTime.qml b/FileSets/v3.20~43/MbEditBoxDateTime.qml new file mode 120000 index 00000000..ae8e4115 --- /dev/null +++ b/FileSets/v3.20~43/MbEditBoxDateTime.qml @@ -0,0 +1 @@ +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/MbItem.qml b/FileSets/v3.20~43/MbItem.qml new file mode 120000 index 00000000..a67db29c --- /dev/null +++ b/FileSets/v3.20~43/MbItem.qml @@ -0,0 +1 @@ +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/MbItemDigitalInput.qml b/FileSets/v3.20~43/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.20~43/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/MbSpinBox.qml b/FileSets/v3.20~43/MbSpinBox.qml new file mode 120000 index 00000000..a485feef --- /dev/null +++ b/FileSets/v3.20~43/MbSpinBox.qml @@ -0,0 +1 @@ +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/MbStyle.qml b/FileSets/v3.20~43/MbStyle.qml new file mode 120000 index 00000000..93b051ea --- /dev/null +++ b/FileSets/v3.20~43/MbStyle.qml @@ -0,0 +1 @@ +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/MbSubMenu.qml b/FileSets/v3.20~43/MbSubMenu.qml new file mode 120000 index 00000000..a48ff284 --- /dev/null +++ b/FileSets/v3.20~43/MbSubMenu.qml @@ -0,0 +1 @@ +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/Multi.qml b/FileSets/v3.20~43/Multi.qml new file mode 120000 index 00000000..2c7111e5 --- /dev/null +++ b/FileSets/v3.20~43/Multi.qml @@ -0,0 +1 @@ +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/ObjectAcConnection.qml b/FileSets/v3.20~43/ObjectAcConnection.qml new file mode 120000 index 00000000..d56c08b7 --- /dev/null +++ b/FileSets/v3.20~43/ObjectAcConnection.qml @@ -0,0 +1 @@ +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~43/OverviewAcValuesEnhanced.qml new file mode 120000 index 00000000..74f5a60c --- /dev/null +++ b/FileSets/v3.20~43/OverviewAcValuesEnhanced.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewBox.qml b/FileSets/v3.20~43/OverviewBox.qml new file mode 120000 index 00000000..eb491c22 --- /dev/null +++ b/FileSets/v3.20~43/OverviewBox.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewConnection.qml b/FileSets/v3.20~43/OverviewConnection.qml new file mode 120000 index 00000000..30f98775 --- /dev/null +++ b/FileSets/v3.20~43/OverviewConnection.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewConnectionEnd.qml b/FileSets/v3.20~43/OverviewConnectionEnd.qml new file mode 120000 index 00000000..b075cf89 --- /dev/null +++ b/FileSets/v3.20~43/OverviewConnectionEnd.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewFlowComplex.qml b/FileSets/v3.20~43/OverviewFlowComplex.qml new file mode 120000 index 00000000..b999d865 --- /dev/null +++ b/FileSets/v3.20~43/OverviewFlowComplex.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~43/OverviewGeneratorEnhanced.qml new file mode 120000 index 00000000..8e49ae38 --- /dev/null +++ b/FileSets/v3.20~43/OverviewGeneratorEnhanced.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~43/OverviewGeneratorRelayEnhanced.qml new file mode 120000 index 00000000..89ec5c80 --- /dev/null +++ b/FileSets/v3.20~43/OverviewGeneratorRelayEnhanced.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewGridParallel.qml b/FileSets/v3.20~43/OverviewGridParallel.qml new file mode 120000 index 00000000..8805f49b --- /dev/null +++ b/FileSets/v3.20~43/OverviewGridParallel.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewHub.qml b/FileSets/v3.20~43/OverviewHub.qml new file mode 120000 index 00000000..4f783368 --- /dev/null +++ b/FileSets/v3.20~43/OverviewHub.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewHubEnhanced.qml b/FileSets/v3.20~43/OverviewHubEnhanced.qml new file mode 120000 index 00000000..1313cd6d --- /dev/null +++ b/FileSets/v3.20~43/OverviewHubEnhanced.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewMobileEnhanced.qml b/FileSets/v3.20~43/OverviewMobileEnhanced.qml new file mode 120000 index 00000000..cf10db90 --- /dev/null +++ b/FileSets/v3.20~43/OverviewMobileEnhanced.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewSolarCharger.qml b/FileSets/v3.20~43/OverviewSolarCharger.qml new file mode 120000 index 00000000..c91bd340 --- /dev/null +++ b/FileSets/v3.20~43/OverviewSolarCharger.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewSolarInverter.qml b/FileSets/v3.20~43/OverviewSolarInverter.qml new file mode 120000 index 00000000..7b5882bd --- /dev/null +++ b/FileSets/v3.20~43/OverviewSolarInverter.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewTankDelegate.qml b/FileSets/v3.20~43/OverviewTankDelegate.qml new file mode 120000 index 00000000..d04fbe81 --- /dev/null +++ b/FileSets/v3.20~43/OverviewTankDelegate.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewTanks.qml b/FileSets/v3.20~43/OverviewTanks.qml new file mode 120000 index 00000000..fbfd8158 --- /dev/null +++ b/FileSets/v3.20~43/OverviewTanks.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~43/OverviewTanksTempsDigInputs.qml new file mode 120000 index 00000000..90d6f2b8 --- /dev/null +++ b/FileSets/v3.20~43/OverviewTanksTempsDigInputs.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/PageDigitalInput.qml b/FileSets/v3.20~43/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.20~43/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/PageGenerator.qml b/FileSets/v3.20~43/PageGenerator.qml new file mode 120000 index 00000000..67c2caf8 --- /dev/null +++ b/FileSets/v3.20~43/PageGenerator.qml @@ -0,0 +1 @@ +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/PageMain.qml b/FileSets/v3.20~43/PageMain.qml new file mode 120000 index 00000000..6bcbcd1a --- /dev/null +++ b/FileSets/v3.20~43/PageMain.qml @@ -0,0 +1 @@ +../v3.20~45/PageMain.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/PageSettingsDisplay.qml b/FileSets/v3.20~43/PageSettingsDisplay.qml new file mode 120000 index 00000000..a7f4a2c4 --- /dev/null +++ b/FileSets/v3.20~43/PageSettingsDisplay.qml @@ -0,0 +1 @@ +../v3.30~1/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~42/PageSettingsGenerator.qml b/FileSets/v3.20~43/PageSettingsGenerator.qml similarity index 97% rename from FileSets/v3.20~42/PageSettingsGenerator.qml rename to FileSets/v3.20~43/PageSettingsGenerator.qml index d35d7dad..ede23ece 100644 --- a/FileSets/v3.20~42/PageSettingsGenerator.qml +++ b/FileSets/v3.20~43/PageSettingsGenerator.qml @@ -64,13 +64,13 @@ MbPage { //// GuiMods MbSpinBox { - description: qsTr("Post-cool-down time") + description: qsTr("Generator stop time") show: capabilities.value & warmupCapability item { - bind: Utils.path(settingsBindPrefix, "/PostCoolDownTime") + bind: Utils.path(settingsBindPrefix, "/GeneratorStopTime") unit: "s" decimals: 0 - step: 5 + step: 1 } } diff --git a/FileSets/v3.20~42/PageSettingsGenerator.qml.orig b/FileSets/v3.20~43/PageSettingsGenerator.qml.orig similarity index 100% rename from FileSets/v3.20~42/PageSettingsGenerator.qml.orig rename to FileSets/v3.20~43/PageSettingsGenerator.qml.orig diff --git a/FileSets/v3.20~43/PageSettingsGuiMods.qml b/FileSets/v3.20~43/PageSettingsGuiMods.qml new file mode 120000 index 00000000..c3d81573 --- /dev/null +++ b/FileSets/v3.20~43/PageSettingsGuiMods.qml @@ -0,0 +1 @@ +../v3.30~1/PageSettingsGuiMods.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/PageSettingsRelay.qml b/FileSets/v3.20~43/PageSettingsRelay.qml new file mode 120000 index 00000000..97e3819f --- /dev/null +++ b/FileSets/v3.20~43/PageSettingsRelay.qml @@ -0,0 +1 @@ +../v3.20~45/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/PowerGauge.qml b/FileSets/v3.20~43/PowerGauge.qml new file mode 120000 index 00000000..ca15d0b8 --- /dev/null +++ b/FileSets/v3.20~43/PowerGauge.qml @@ -0,0 +1 @@ +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/Tile.qml b/FileSets/v3.20~43/Tile.qml new file mode 120000 index 00000000..1fa513f1 --- /dev/null +++ b/FileSets/v3.20~43/Tile.qml @@ -0,0 +1 @@ +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/TileDigIn.qml b/FileSets/v3.20~43/TileDigIn.qml new file mode 120000 index 00000000..afe73e1a --- /dev/null +++ b/FileSets/v3.20~43/TileDigIn.qml @@ -0,0 +1 @@ +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/TileRelay.qml b/FileSets/v3.20~43/TileRelay.qml new file mode 120000 index 00000000..76c4f708 --- /dev/null +++ b/FileSets/v3.20~43/TileRelay.qml @@ -0,0 +1 @@ +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/TileText.qml b/FileSets/v3.20~43/TileText.qml new file mode 120000 index 00000000..0bdf2dfe --- /dev/null +++ b/FileSets/v3.20~43/TileText.qml @@ -0,0 +1 @@ +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~43/attributes.csv b/FileSets/v3.20~43/attributes.csv new file mode 120000 index 00000000..60c4d4d5 --- /dev/null +++ b/FileSets/v3.20~43/attributes.csv @@ -0,0 +1 @@ +../v3.30~1/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.20~43/dbus_digitalinputs.py b/FileSets/v3.20~43/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.20~43/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.20~42/dbus_generator.py b/FileSets/v3.20~43/dbus_generator.py similarity index 99% rename from FileSets/v3.20~42/dbus_generator.py rename to FileSets/v3.20~43/dbus_generator.py index 16cec575..8f8538cc 100755 --- a/FileSets/v3.20~42/dbus_generator.py +++ b/FileSets/v3.20~43/dbus_generator.py @@ -176,7 +176,7 @@ def __init__(self): 'warmuptime': ['/Settings/{0}/WarmUpTime', 0, 0, 600], 'cooldowntime': ['/Settings/{0}/CoolDownTime', 0, 0, 600], #### GuiMods warm-up / cool-down - ignore AC to allow generator to stop - 'postcooldowntime': ['/Settings/{0}/PostCoolDownTime', 15, 0, 600] + 'generatorstoptime': ['/Settings/{0}/GeneratorStopTime', 0, 0, 600] } settings = {} diff --git a/FileSets/v3.20~42/dbus_generator.py.orig b/FileSets/v3.20~43/dbus_generator.py.orig similarity index 100% rename from FileSets/v3.20~42/dbus_generator.py.orig rename to FileSets/v3.20~43/dbus_generator.py.orig diff --git a/FileSets/v3.20~42/dbus_systemcalc.py b/FileSets/v3.20~43/dbus_systemcalc.py similarity index 100% rename from FileSets/v3.20~42/dbus_systemcalc.py rename to FileSets/v3.20~43/dbus_systemcalc.py diff --git a/FileSets/v3.20~42/dbus_systemcalc.py.orig b/FileSets/v3.20~43/dbus_systemcalc.py.orig similarity index 100% rename from FileSets/v3.20~42/dbus_systemcalc.py.orig rename to FileSets/v3.20~43/dbus_systemcalc.py.orig diff --git a/FileSets/v3.20~43/main.qml b/FileSets/v3.20~43/main.qml new file mode 120000 index 00000000..3643ba23 --- /dev/null +++ b/FileSets/v3.20~43/main.qml @@ -0,0 +1 @@ +../v3.20~45/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~42/startstop.py b/FileSets/v3.20~43/startstop.py similarity index 96% rename from FileSets/v3.20~42/startstop.py rename to FileSets/v3.20~43/startstop.py index e220c1c5..e199f2fa 100644 --- a/FileSets/v3.20~42/startstop.py +++ b/FileSets/v3.20~43/startstop.py @@ -281,7 +281,6 @@ def __init__(self, instance): #### GuiMods warm-up / cool-down self._warmUpEndTime = 0 self._coolDownEndTime = 0 - self._postCoolDownEndTime = 0 self._ac1isIgnored = False self._ac2isIgnored = False self._activeAcInIsIgnored = False @@ -1215,7 +1214,7 @@ def _start_generator(self, condition): self._warmUpEndTime = 0 self._coolDownEndTime = 0 - self._postCoolDownEndTime = 0 + self._stoptime = 0 self._update_remote_switch() else: # WARMUP, COOLDOWN, RUNNING, STOPPING @@ -1246,55 +1245,46 @@ def _stop_generator(self): if running or remote_running: #### GuiMods warm-up / cool-down - # run for cool-down period before stopping - # cooldown end time is updated while generator is running - # and generator feeds Multi AC input - if self._currentTime < self._coolDownEndTime: - if state != States.COOLDOWN: - self._dbusservice['/State'] = States.COOLDOWN + if state == States.RUNNING: + state = States.COOLDOWN + if self._currentTime < self._coolDownEndTime: self.log_info ("starting cool-down") - return - - # When we arrive here, a stop command was given and cool-down period has elapesed - # Stop the engine, but if we're coming from cooldown, delay another - # while in the STOPPING state before reactivating AC-in. - if state == States.COOLDOWN: - self.log_info ("starting post cool-down") - # delay restoring load to give generator a chance to stop -#### GuiMods warm-up / cool-down - self._postCoolDownEndTime = self._currentTime + self._settings['postcooldowntime'] - self._dbusservice['/State'] = States.STOPPING - self._update_remote_switch() # Stop engine - self.log_info('Stopping generator that was running by %s condition' % - str(self._dbusservice['/RunningByCondition'])) - return - - # Wait for engine stop + elif self._settings['cooldowntime'] != 0: + self.log_info ("skipping cool-down -- no AC load on generator") + + # warm-up should also transition to stopping + # cool-down time will have expired since it's set to 0 when starting + # and there has not yet been a load on the generator + if state in (States.WARMUP, States.COOLDOWN): + # cool down complete + if self._currentTime > self._coolDownEndTime: + state = States.STOPPING + self.log_info('Stopping generator that was running by %s condition' % + str(self._dbusservice['/RunningByCondition'])) + self._update_remote_switch() # Stop engine + self._stoptime = self._currentTime + self._settings['generatorstoptime'] + if self._currentTime < self._stoptime: + self.log_info ("waiting for generator so stop") + if state == States.STOPPING: - if self._currentTime < self._postCoolDownEndTime: - return - else: - self.log_info ("post cool-down delay complete") - - # generator stop was reported when entering post cool-down - # don't report it again - else: - self.log_info('Stopping generator that was running by %s condition' % - str(self._dbusservice['/RunningByCondition'])) - - # All other possibilities are handled now. Cooldown is over or not - # configured and we waited for the generator to shut down. - self._dbusservice['/State'] = States.STOPPED - self._update_remote_switch() + # wait for stop period expired - finish up transition to STOPPED + if self._currentTime > self._stoptime: + if self._settings['generatorstoptime'] != 0: + self.log_info ("generator stop time reached - OK to reconnect AC") + state = States.STOPPED + self._update_remote_switch() + self._dbusservice['/RunningByCondition'] = '' + self._dbusservice['/RunningByConditionCode'] = RunningConditions.Stopped + self._update_accumulated_time() + self._starttime = 0 + self._dbusservice['/Runtime'] = 0 + self._dbusservice['/ManualStartTimer'] = 0 + self._manualstarttimer = 0 + self._last_runtime_update = 0 + + self._dbusservice['/State'] = state #### end GuiMods warm-up / cool-down - self._dbusservice['/RunningByCondition'] = '' - self._dbusservice['/RunningByConditionCode'] = RunningConditions.Stopped - self._update_accumulated_time() - self._starttime = 0 - self._dbusservice['/Runtime'] = 0 - self._dbusservice['/ManualStartTimer'] = 0 - self._manualstarttimer = 0 - self._last_runtime_update = 0 + # This is here so the Multi/Quattro can be told to disconnect AC-in, # so that we can do warm-up and cool-down. @@ -1343,9 +1333,9 @@ def _update_remote_switch(self): self._set_remote_switch_state(dbus.Int32(v, variant_level=1)) #### GuiMods if v == True: - logging.info ("updating remote switch to running") + self.log_info ("updating remote switch to running") else: - logging.info ("updating remote switch to stopped") + self.log_info ("updating remote switch to stopped") def _get_remote_switch_state(self): raise Exception('This function should be overridden') diff --git a/FileSets/v3.20~42/startstop.py.orig b/FileSets/v3.20~43/startstop.py.orig similarity index 100% rename from FileSets/v3.20~42/startstop.py.orig rename to FileSets/v3.20~43/startstop.py.orig diff --git a/FileSets/v3.20~43/styles.css b/FileSets/v3.20~43/styles.css new file mode 120000 index 00000000..8f367634 --- /dev/null +++ b/FileSets/v3.20~43/styles.css @@ -0,0 +1 @@ +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~45/Battery.qml b/FileSets/v3.20~45/Battery.qml new file mode 120000 index 00000000..c7149e0b --- /dev/null +++ b/FileSets/v3.20~45/Battery.qml @@ -0,0 +1 @@ +../v3.30~1/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~18/COMPLETE b/FileSets/v3.20~45/COMPLETE similarity index 100% rename from FileSets/v3.20~18/COMPLETE rename to FileSets/v3.20~45/COMPLETE diff --git a/FileSets/v3.20~45/DetailAcInput.qml b/FileSets/v3.20~45/DetailAcInput.qml new file mode 120000 index 00000000..eafc88e8 --- /dev/null +++ b/FileSets/v3.20~45/DetailAcInput.qml @@ -0,0 +1 @@ +../v3.30~1/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/DetailInverter.qml b/FileSets/v3.20~45/DetailInverter.qml new file mode 120000 index 00000000..f51d2a5f --- /dev/null +++ b/FileSets/v3.20~45/DetailInverter.qml @@ -0,0 +1 @@ +../v3.30~1/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/DetailLoadsCombined.qml b/FileSets/v3.20~45/DetailLoadsCombined.qml new file mode 120000 index 00000000..8b48e62a --- /dev/null +++ b/FileSets/v3.20~45/DetailLoadsCombined.qml @@ -0,0 +1 @@ +../v3.30~1/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/DetailLoadsOnInput.qml b/FileSets/v3.20~45/DetailLoadsOnInput.qml new file mode 120000 index 00000000..dede455b --- /dev/null +++ b/FileSets/v3.20~45/DetailLoadsOnInput.qml @@ -0,0 +1 @@ +../v3.30~1/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/DetailLoadsOnOutput.qml b/FileSets/v3.20~45/DetailLoadsOnOutput.qml new file mode 120000 index 00000000..431fc2d5 --- /dev/null +++ b/FileSets/v3.20~45/DetailLoadsOnOutput.qml @@ -0,0 +1 @@ +../v3.30~1/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/HubData.qml b/FileSets/v3.20~45/HubData.qml new file mode 120000 index 00000000..3c632321 --- /dev/null +++ b/FileSets/v3.20~45/HubData.qml @@ -0,0 +1 @@ +../v3.30~1/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/MbEditBox.qml b/FileSets/v3.20~45/MbEditBox.qml new file mode 120000 index 00000000..1667d1ec --- /dev/null +++ b/FileSets/v3.20~45/MbEditBox.qml @@ -0,0 +1 @@ +../v3.30~1/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/MbEditBoxDateTime.qml b/FileSets/v3.20~45/MbEditBoxDateTime.qml new file mode 120000 index 00000000..ae8e4115 --- /dev/null +++ b/FileSets/v3.20~45/MbEditBoxDateTime.qml @@ -0,0 +1 @@ +../v3.30~1/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/MbItem.qml b/FileSets/v3.20~45/MbItem.qml new file mode 120000 index 00000000..a67db29c --- /dev/null +++ b/FileSets/v3.20~45/MbItem.qml @@ -0,0 +1 @@ +../v3.30~1/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/MbItemDigitalInput.qml b/FileSets/v3.20~45/MbItemDigitalInput.qml new file mode 120000 index 00000000..d72702aa --- /dev/null +++ b/FileSets/v3.20~45/MbItemDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/MbItemDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/MbSpinBox.qml b/FileSets/v3.20~45/MbSpinBox.qml new file mode 120000 index 00000000..a485feef --- /dev/null +++ b/FileSets/v3.20~45/MbSpinBox.qml @@ -0,0 +1 @@ +../v3.30~1/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/MbStyle.qml b/FileSets/v3.20~45/MbStyle.qml new file mode 120000 index 00000000..93b051ea --- /dev/null +++ b/FileSets/v3.20~45/MbStyle.qml @@ -0,0 +1 @@ +../v3.30~1/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/MbSubMenu.qml b/FileSets/v3.20~45/MbSubMenu.qml new file mode 120000 index 00000000..a48ff284 --- /dev/null +++ b/FileSets/v3.20~45/MbSubMenu.qml @@ -0,0 +1 @@ +../v3.30~1/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/Multi.qml b/FileSets/v3.20~45/Multi.qml new file mode 120000 index 00000000..2c7111e5 --- /dev/null +++ b/FileSets/v3.20~45/Multi.qml @@ -0,0 +1 @@ +../v3.30~1/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/ObjectAcConnection.qml b/FileSets/v3.20~45/ObjectAcConnection.qml new file mode 120000 index 00000000..d56c08b7 --- /dev/null +++ b/FileSets/v3.20~45/ObjectAcConnection.qml @@ -0,0 +1 @@ +../v3.30~1/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~45/OverviewAcValuesEnhanced.qml new file mode 120000 index 00000000..74f5a60c --- /dev/null +++ b/FileSets/v3.20~45/OverviewAcValuesEnhanced.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewBox.qml b/FileSets/v3.20~45/OverviewBox.qml new file mode 120000 index 00000000..eb491c22 --- /dev/null +++ b/FileSets/v3.20~45/OverviewBox.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewConnection.qml b/FileSets/v3.20~45/OverviewConnection.qml new file mode 120000 index 00000000..30f98775 --- /dev/null +++ b/FileSets/v3.20~45/OverviewConnection.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewConnectionEnd.qml b/FileSets/v3.20~45/OverviewConnectionEnd.qml new file mode 120000 index 00000000..b075cf89 --- /dev/null +++ b/FileSets/v3.20~45/OverviewConnectionEnd.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewFlowComplex.qml b/FileSets/v3.20~45/OverviewFlowComplex.qml new file mode 120000 index 00000000..b999d865 --- /dev/null +++ b/FileSets/v3.20~45/OverviewFlowComplex.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~45/OverviewGeneratorEnhanced.qml new file mode 120000 index 00000000..8e49ae38 --- /dev/null +++ b/FileSets/v3.20~45/OverviewGeneratorEnhanced.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~45/OverviewGeneratorRelayEnhanced.qml new file mode 120000 index 00000000..89ec5c80 --- /dev/null +++ b/FileSets/v3.20~45/OverviewGeneratorRelayEnhanced.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewGridParallel.qml b/FileSets/v3.20~45/OverviewGridParallel.qml new file mode 120000 index 00000000..8805f49b --- /dev/null +++ b/FileSets/v3.20~45/OverviewGridParallel.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewHub.qml b/FileSets/v3.20~45/OverviewHub.qml new file mode 120000 index 00000000..4f783368 --- /dev/null +++ b/FileSets/v3.20~45/OverviewHub.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewHubEnhanced.qml b/FileSets/v3.20~45/OverviewHubEnhanced.qml new file mode 120000 index 00000000..1313cd6d --- /dev/null +++ b/FileSets/v3.20~45/OverviewHubEnhanced.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewMobileEnhanced.qml b/FileSets/v3.20~45/OverviewMobileEnhanced.qml new file mode 120000 index 00000000..cf10db90 --- /dev/null +++ b/FileSets/v3.20~45/OverviewMobileEnhanced.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewSolarCharger.qml b/FileSets/v3.20~45/OverviewSolarCharger.qml new file mode 120000 index 00000000..c91bd340 --- /dev/null +++ b/FileSets/v3.20~45/OverviewSolarCharger.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewSolarInverter.qml b/FileSets/v3.20~45/OverviewSolarInverter.qml new file mode 120000 index 00000000..7b5882bd --- /dev/null +++ b/FileSets/v3.20~45/OverviewSolarInverter.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewTankDelegate.qml b/FileSets/v3.20~45/OverviewTankDelegate.qml new file mode 120000 index 00000000..d04fbe81 --- /dev/null +++ b/FileSets/v3.20~45/OverviewTankDelegate.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewTanks.qml b/FileSets/v3.20~45/OverviewTanks.qml new file mode 120000 index 00000000..fbfd8158 --- /dev/null +++ b/FileSets/v3.20~45/OverviewTanks.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~45/OverviewTanksTempsDigInputs.qml new file mode 120000 index 00000000..90d6f2b8 --- /dev/null +++ b/FileSets/v3.20~45/OverviewTanksTempsDigInputs.qml @@ -0,0 +1 @@ +../v3.30~1/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/PageDigitalInput.qml b/FileSets/v3.20~45/PageDigitalInput.qml new file mode 120000 index 00000000..e5dc5c51 --- /dev/null +++ b/FileSets/v3.20~45/PageDigitalInput.qml @@ -0,0 +1 @@ +../v3.30~1/PageDigitalInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/PageGenerator.qml b/FileSets/v3.20~45/PageGenerator.qml new file mode 120000 index 00000000..67c2caf8 --- /dev/null +++ b/FileSets/v3.20~45/PageGenerator.qml @@ -0,0 +1 @@ +../v3.30~1/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~42/PageMain.qml b/FileSets/v3.20~45/PageMain.qml similarity index 100% rename from FileSets/v3.20~42/PageMain.qml rename to FileSets/v3.20~45/PageMain.qml diff --git a/FileSets/v3.20~42/PageMain.qml.orig b/FileSets/v3.20~45/PageMain.qml.orig similarity index 100% rename from FileSets/v3.20~42/PageMain.qml.orig rename to FileSets/v3.20~45/PageMain.qml.orig diff --git a/FileSets/v3.20~45/PageSettingsDisplay.qml b/FileSets/v3.20~45/PageSettingsDisplay.qml new file mode 120000 index 00000000..a7f4a2c4 --- /dev/null +++ b/FileSets/v3.20~45/PageSettingsDisplay.qml @@ -0,0 +1 @@ +../v3.30~1/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/PageSettingsGenerator.qml b/FileSets/v3.20~45/PageSettingsGenerator.qml new file mode 120000 index 00000000..6d1da4a1 --- /dev/null +++ b/FileSets/v3.20~45/PageSettingsGenerator.qml @@ -0,0 +1 @@ +../v3.30~1/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/PageSettingsGuiMods.qml b/FileSets/v3.20~45/PageSettingsGuiMods.qml new file mode 120000 index 00000000..c3d81573 --- /dev/null +++ b/FileSets/v3.20~45/PageSettingsGuiMods.qml @@ -0,0 +1 @@ +../v3.30~1/PageSettingsGuiMods.qml \ No newline at end of file diff --git a/FileSets/v3.20~42/PageSettingsRelay.qml b/FileSets/v3.20~45/PageSettingsRelay.qml similarity index 100% rename from FileSets/v3.20~42/PageSettingsRelay.qml rename to FileSets/v3.20~45/PageSettingsRelay.qml diff --git a/FileSets/v3.20~42/PageSettingsRelay.qml.orig b/FileSets/v3.20~45/PageSettingsRelay.qml.orig similarity index 100% rename from FileSets/v3.20~42/PageSettingsRelay.qml.orig rename to FileSets/v3.20~45/PageSettingsRelay.qml.orig diff --git a/FileSets/v3.20~45/PowerGauge.qml b/FileSets/v3.20~45/PowerGauge.qml new file mode 120000 index 00000000..ca15d0b8 --- /dev/null +++ b/FileSets/v3.20~45/PowerGauge.qml @@ -0,0 +1 @@ +../v3.30~1/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/Tile.qml b/FileSets/v3.20~45/Tile.qml new file mode 120000 index 00000000..1fa513f1 --- /dev/null +++ b/FileSets/v3.20~45/Tile.qml @@ -0,0 +1 @@ +../v3.30~1/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/TileDigIn.qml b/FileSets/v3.20~45/TileDigIn.qml new file mode 120000 index 00000000..afe73e1a --- /dev/null +++ b/FileSets/v3.20~45/TileDigIn.qml @@ -0,0 +1 @@ +../v3.30~1/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/TileRelay.qml b/FileSets/v3.20~45/TileRelay.qml new file mode 120000 index 00000000..76c4f708 --- /dev/null +++ b/FileSets/v3.20~45/TileRelay.qml @@ -0,0 +1 @@ +../v3.30~1/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/TileText.qml b/FileSets/v3.20~45/TileText.qml new file mode 120000 index 00000000..0bdf2dfe --- /dev/null +++ b/FileSets/v3.20~45/TileText.qml @@ -0,0 +1 @@ +../v3.30~1/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~45/attributes.csv b/FileSets/v3.20~45/attributes.csv new file mode 120000 index 00000000..60c4d4d5 --- /dev/null +++ b/FileSets/v3.20~45/attributes.csv @@ -0,0 +1 @@ +../v3.30~1/attributes.csv \ No newline at end of file diff --git a/FileSets/v3.20~45/dbus_digitalinputs.py b/FileSets/v3.20~45/dbus_digitalinputs.py new file mode 120000 index 00000000..4d192a4b --- /dev/null +++ b/FileSets/v3.20~45/dbus_digitalinputs.py @@ -0,0 +1 @@ +../v3.30~1/dbus_digitalinputs.py \ No newline at end of file diff --git a/FileSets/v3.20~45/dbus_generator.py b/FileSets/v3.20~45/dbus_generator.py new file mode 120000 index 00000000..35a4d9de --- /dev/null +++ b/FileSets/v3.20~45/dbus_generator.py @@ -0,0 +1 @@ +../v3.30~1/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~45/dbus_systemcalc.py b/FileSets/v3.20~45/dbus_systemcalc.py new file mode 120000 index 00000000..920b1405 --- /dev/null +++ b/FileSets/v3.20~45/dbus_systemcalc.py @@ -0,0 +1 @@ +../v3.30~1/dbus_systemcalc.py \ No newline at end of file diff --git a/FileSets/v3.20~42/main.qml b/FileSets/v3.20~45/main.qml similarity index 100% rename from FileSets/v3.20~42/main.qml rename to FileSets/v3.20~45/main.qml diff --git a/FileSets/v3.20~42/main.qml.orig b/FileSets/v3.20~45/main.qml.orig similarity index 100% rename from FileSets/v3.20~42/main.qml.orig rename to FileSets/v3.20~45/main.qml.orig diff --git a/FileSets/v3.20~45/startstop.py b/FileSets/v3.20~45/startstop.py new file mode 120000 index 00000000..7dd17785 --- /dev/null +++ b/FileSets/v3.20~45/startstop.py @@ -0,0 +1 @@ +../v3.30~1/startstop.py \ No newline at end of file diff --git a/FileSets/v3.20~45/styles.css b/FileSets/v3.20~45/styles.css new file mode 120000 index 00000000..8f367634 --- /dev/null +++ b/FileSets/v3.20~45/styles.css @@ -0,0 +1 @@ +../v3.30~1/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~5/Battery.qml b/FileSets/v3.20~5/Battery.qml deleted file mode 120000 index 794e9dd0..00000000 --- a/FileSets/v3.20~5/Battery.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Battery.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/COMPLETE b/FileSets/v3.20~5/COMPLETE deleted file mode 100644 index e69de29b..00000000 diff --git a/FileSets/v3.20~5/DetailAcInput.qml b/FileSets/v3.20~5/DetailAcInput.qml deleted file mode 120000 index 8b226ba8..00000000 --- a/FileSets/v3.20~5/DetailAcInput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailAcInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/DetailInverter.qml b/FileSets/v3.20~5/DetailInverter.qml deleted file mode 120000 index 5ddd5ce8..00000000 --- a/FileSets/v3.20~5/DetailInverter.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/DetailLoadsCombined.qml b/FileSets/v3.20~5/DetailLoadsCombined.qml deleted file mode 120000 index b000afaa..00000000 --- a/FileSets/v3.20~5/DetailLoadsCombined.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsCombined.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/DetailLoadsOnInput.qml b/FileSets/v3.20~5/DetailLoadsOnInput.qml deleted file mode 120000 index 901e0820..00000000 --- a/FileSets/v3.20~5/DetailLoadsOnInput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsOnInput.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/DetailLoadsOnOutput.qml b/FileSets/v3.20~5/DetailLoadsOnOutput.qml deleted file mode 120000 index 142fee12..00000000 --- a/FileSets/v3.20~5/DetailLoadsOnOutput.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/DetailLoadsOnOutput.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/HubData.qml b/FileSets/v3.20~5/HubData.qml deleted file mode 120000 index df42560b..00000000 --- a/FileSets/v3.20~5/HubData.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/HubData.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/MbEditBox.qml b/FileSets/v3.20~5/MbEditBox.qml deleted file mode 120000 index a6185dba..00000000 --- a/FileSets/v3.20~5/MbEditBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbEditBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/MbEditBoxDateTime.qml b/FileSets/v3.20~5/MbEditBoxDateTime.qml deleted file mode 120000 index 158d88d0..00000000 --- a/FileSets/v3.20~5/MbEditBoxDateTime.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbEditBoxDateTime.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/MbItem.qml b/FileSets/v3.20~5/MbItem.qml deleted file mode 120000 index 8dfa4b06..00000000 --- a/FileSets/v3.20~5/MbItem.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbItem.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/MbSpinBox.qml b/FileSets/v3.20~5/MbSpinBox.qml deleted file mode 120000 index b0dffaae..00000000 --- a/FileSets/v3.20~5/MbSpinBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbSpinBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/MbStyle.qml b/FileSets/v3.20~5/MbStyle.qml deleted file mode 120000 index 4accbc46..00000000 --- a/FileSets/v3.20~5/MbStyle.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbStyle.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/MbSubMenu.qml b/FileSets/v3.20~5/MbSubMenu.qml deleted file mode 120000 index d1172169..00000000 --- a/FileSets/v3.20~5/MbSubMenu.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/MbSubMenu.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/Multi.qml b/FileSets/v3.20~5/Multi.qml deleted file mode 120000 index 9a2fa57b..00000000 --- a/FileSets/v3.20~5/Multi.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Multi.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/ObjectAcConnection.qml b/FileSets/v3.20~5/ObjectAcConnection.qml deleted file mode 120000 index 406d6613..00000000 --- a/FileSets/v3.20~5/ObjectAcConnection.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/ObjectAcConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewAcValuesEnhanced.qml b/FileSets/v3.20~5/OverviewAcValuesEnhanced.qml deleted file mode 120000 index 09322f1d..00000000 --- a/FileSets/v3.20~5/OverviewAcValuesEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewAcValuesEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewBox.qml b/FileSets/v3.20~5/OverviewBox.qml deleted file mode 120000 index 8c3baac0..00000000 --- a/FileSets/v3.20~5/OverviewBox.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewBox.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewConnection.qml b/FileSets/v3.20~5/OverviewConnection.qml deleted file mode 120000 index 52cb8f85..00000000 --- a/FileSets/v3.20~5/OverviewConnection.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewConnection.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewConnectionEnd.qml b/FileSets/v3.20~5/OverviewConnectionEnd.qml deleted file mode 120000 index 04bf981f..00000000 --- a/FileSets/v3.20~5/OverviewConnectionEnd.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewConnectionEnd.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewFlowComplex.qml b/FileSets/v3.20~5/OverviewFlowComplex.qml deleted file mode 120000 index 6089ae4c..00000000 --- a/FileSets/v3.20~5/OverviewFlowComplex.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewFlowComplex.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewGeneratorEnhanced.qml b/FileSets/v3.20~5/OverviewGeneratorEnhanced.qml deleted file mode 120000 index ebdde7dc..00000000 --- a/FileSets/v3.20~5/OverviewGeneratorEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGeneratorEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.20~5/OverviewGeneratorRelayEnhanced.qml deleted file mode 120000 index 54b24f30..00000000 --- a/FileSets/v3.20~5/OverviewGeneratorRelayEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGeneratorRelayEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewGridParallel.qml b/FileSets/v3.20~5/OverviewGridParallel.qml deleted file mode 120000 index c31a5a0f..00000000 --- a/FileSets/v3.20~5/OverviewGridParallel.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewGridParallel.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewHub.qml b/FileSets/v3.20~5/OverviewHub.qml deleted file mode 120000 index 9f251775..00000000 --- a/FileSets/v3.20~5/OverviewHub.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewHub.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewHubEnhanced.qml b/FileSets/v3.20~5/OverviewHubEnhanced.qml deleted file mode 120000 index 0c37301c..00000000 --- a/FileSets/v3.20~5/OverviewHubEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewHubEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewMobileEnhanced.qml b/FileSets/v3.20~5/OverviewMobileEnhanced.qml deleted file mode 120000 index 79cb1fcb..00000000 --- a/FileSets/v3.20~5/OverviewMobileEnhanced.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewMobileEnhanced.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewSolarCharger.qml b/FileSets/v3.20~5/OverviewSolarCharger.qml deleted file mode 120000 index 73220270..00000000 --- a/FileSets/v3.20~5/OverviewSolarCharger.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewSolarCharger.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewSolarInverter.qml b/FileSets/v3.20~5/OverviewSolarInverter.qml deleted file mode 120000 index dd6f7b40..00000000 --- a/FileSets/v3.20~5/OverviewSolarInverter.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewSolarInverter.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewTankDelegate.qml b/FileSets/v3.20~5/OverviewTankDelegate.qml deleted file mode 120000 index 9ac457b6..00000000 --- a/FileSets/v3.20~5/OverviewTankDelegate.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTankDelegate.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewTanks.qml b/FileSets/v3.20~5/OverviewTanks.qml deleted file mode 120000 index 975b464a..00000000 --- a/FileSets/v3.20~5/OverviewTanks.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTanks.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/OverviewTanksTempsDigInputs.qml b/FileSets/v3.20~5/OverviewTanksTempsDigInputs.qml deleted file mode 120000 index 6cd0cfc3..00000000 --- a/FileSets/v3.20~5/OverviewTanksTempsDigInputs.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/OverviewTanksTempsDigInputs.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/PageGenerator.qml b/FileSets/v3.20~5/PageGenerator.qml deleted file mode 120000 index 05b5cccb..00000000 --- a/FileSets/v3.20~5/PageGenerator.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/PageMain.qml b/FileSets/v3.20~5/PageMain.qml deleted file mode 120000 index 444dec5f..00000000 --- a/FileSets/v3.20~5/PageMain.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~33/PageMain.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/PageSettingsDisplay.qml b/FileSets/v3.20~5/PageSettingsDisplay.qml deleted file mode 120000 index 9860c031..00000000 --- a/FileSets/v3.20~5/PageSettingsDisplay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.14/PageSettingsDisplay.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/PageSettingsGenerator.qml b/FileSets/v3.20~5/PageSettingsGenerator.qml deleted file mode 120000 index 54543635..00000000 --- a/FileSets/v3.20~5/PageSettingsGenerator.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageSettingsGenerator.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/PageSettingsGuiMods.qml b/FileSets/v3.20~5/PageSettingsGuiMods.qml deleted file mode 120000 index c4dc4998..00000000 --- a/FileSets/v3.20~5/PageSettingsGuiMods.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~37/PageSettingsGuiMods.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/PageSettingsRelay.qml b/FileSets/v3.20~5/PageSettingsRelay.qml deleted file mode 120000 index e083e872..00000000 --- a/FileSets/v3.20~5/PageSettingsRelay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PageSettingsRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/PowerGauge.qml b/FileSets/v3.20~5/PowerGauge.qml deleted file mode 120000 index 2ed81452..00000000 --- a/FileSets/v3.20~5/PowerGauge.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/PowerGauge.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/Tile.qml b/FileSets/v3.20~5/Tile.qml deleted file mode 120000 index db98506f..00000000 --- a/FileSets/v3.20~5/Tile.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/Tile.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/TileDigIn.qml b/FileSets/v3.20~5/TileDigIn.qml deleted file mode 120000 index c6408a84..00000000 --- a/FileSets/v3.20~5/TileDigIn.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileDigIn.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/TileRelay.qml b/FileSets/v3.20~5/TileRelay.qml deleted file mode 120000 index 200caf92..00000000 --- a/FileSets/v3.20~5/TileRelay.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileRelay.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/TileText.qml b/FileSets/v3.20~5/TileText.qml deleted file mode 120000 index 8f17d6b3..00000000 --- a/FileSets/v3.20~5/TileText.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/TileText.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/UNUSED_FILE_SET b/FileSets/v3.20~5/UNUSED_FILE_SET deleted file mode 100644 index e69de29b..00000000 diff --git a/FileSets/v3.20~5/dbus_generator.py b/FileSets/v3.20~5/dbus_generator.py deleted file mode 120000 index f0d38f59..00000000 --- a/FileSets/v3.20~5/dbus_generator.py +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/dbus_generator.py \ No newline at end of file diff --git a/FileSets/v3.20~5/main.qml b/FileSets/v3.20~5/main.qml deleted file mode 120000 index aafeae08..00000000 --- a/FileSets/v3.20~5/main.qml +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/main.qml \ No newline at end of file diff --git a/FileSets/v3.20~5/startstop.py b/FileSets/v3.20~5/startstop.py deleted file mode 120000 index b962b8d5..00000000 --- a/FileSets/v3.20~5/startstop.py +++ /dev/null @@ -1 +0,0 @@ -../v3.20~37/startstop.py \ No newline at end of file diff --git a/FileSets/v3.20~5/styles.css b/FileSets/v3.20~5/styles.css deleted file mode 120000 index 4af38df2..00000000 --- a/FileSets/v3.20~5/styles.css +++ /dev/null @@ -1 +0,0 @@ -../v3.20~42/styles.css \ No newline at end of file diff --git a/FileSets/v3.20~42/Battery.qml b/FileSets/v3.30~1/Battery.qml similarity index 100% rename from FileSets/v3.20~42/Battery.qml rename to FileSets/v3.30~1/Battery.qml diff --git a/FileSets/v3.20~42/Battery.qml.orig b/FileSets/v3.30~1/Battery.qml.orig similarity index 100% rename from FileSets/v3.20~42/Battery.qml.orig rename to FileSets/v3.30~1/Battery.qml.orig diff --git a/FileSets/v3.20~2/COMPLETE b/FileSets/v3.30~1/COMPLETE similarity index 100% rename from FileSets/v3.20~2/COMPLETE rename to FileSets/v3.30~1/COMPLETE diff --git a/FileSets/v3.20~42/DetailAcInput.qml b/FileSets/v3.30~1/DetailAcInput.qml similarity index 100% rename from FileSets/v3.20~42/DetailAcInput.qml rename to FileSets/v3.30~1/DetailAcInput.qml diff --git a/FileSets/v3.20~42/DetailAcInput.qml.orig b/FileSets/v3.30~1/DetailAcInput.qml.orig similarity index 100% rename from FileSets/v3.20~42/DetailAcInput.qml.orig rename to FileSets/v3.30~1/DetailAcInput.qml.orig diff --git a/FileSets/v3.20~42/DetailInverter.qml b/FileSets/v3.30~1/DetailInverter.qml similarity index 100% rename from FileSets/v3.20~42/DetailInverter.qml rename to FileSets/v3.30~1/DetailInverter.qml diff --git a/FileSets/v3.20~42/DetailInverter.qml.orig b/FileSets/v3.30~1/DetailInverter.qml.orig similarity index 100% rename from FileSets/v3.20~42/DetailInverter.qml.orig rename to FileSets/v3.30~1/DetailInverter.qml.orig diff --git a/FileSets/v3.20~42/DetailLoadsCombined.qml b/FileSets/v3.30~1/DetailLoadsCombined.qml similarity index 100% rename from FileSets/v3.20~42/DetailLoadsCombined.qml rename to FileSets/v3.30~1/DetailLoadsCombined.qml diff --git a/FileSets/v3.20~42/DetailLoadsCombined.qml.orig b/FileSets/v3.30~1/DetailLoadsCombined.qml.orig similarity index 100% rename from FileSets/v3.20~42/DetailLoadsCombined.qml.orig rename to FileSets/v3.30~1/DetailLoadsCombined.qml.orig diff --git a/FileSets/v3.20~42/DetailLoadsOnInput.qml b/FileSets/v3.30~1/DetailLoadsOnInput.qml similarity index 100% rename from FileSets/v3.20~42/DetailLoadsOnInput.qml rename to FileSets/v3.30~1/DetailLoadsOnInput.qml diff --git a/FileSets/v3.20~42/DetailLoadsOnInput.qml.orig b/FileSets/v3.30~1/DetailLoadsOnInput.qml.orig similarity index 100% rename from FileSets/v3.20~42/DetailLoadsOnInput.qml.orig rename to FileSets/v3.30~1/DetailLoadsOnInput.qml.orig diff --git a/FileSets/v3.20~42/DetailLoadsOnOutput.qml b/FileSets/v3.30~1/DetailLoadsOnOutput.qml similarity index 100% rename from FileSets/v3.20~42/DetailLoadsOnOutput.qml rename to FileSets/v3.30~1/DetailLoadsOnOutput.qml diff --git a/FileSets/v3.20~42/DetailLoadsOnOutput.qml.orig b/FileSets/v3.30~1/DetailLoadsOnOutput.qml.orig similarity index 100% rename from FileSets/v3.20~42/DetailLoadsOnOutput.qml.orig rename to FileSets/v3.30~1/DetailLoadsOnOutput.qml.orig diff --git a/FileSets/v3.20~42/HubData.qml b/FileSets/v3.30~1/HubData.qml similarity index 100% rename from FileSets/v3.20~42/HubData.qml rename to FileSets/v3.30~1/HubData.qml diff --git a/FileSets/v3.20~42/HubData.qml.orig b/FileSets/v3.30~1/HubData.qml.orig similarity index 100% rename from FileSets/v3.20~42/HubData.qml.orig rename to FileSets/v3.30~1/HubData.qml.orig diff --git a/FileSets/v3.20~42/MbEditBox.qml b/FileSets/v3.30~1/MbEditBox.qml similarity index 100% rename from FileSets/v3.20~42/MbEditBox.qml rename to FileSets/v3.30~1/MbEditBox.qml diff --git a/FileSets/v3.20~42/MbEditBox.qml.orig b/FileSets/v3.30~1/MbEditBox.qml.orig similarity index 100% rename from FileSets/v3.20~42/MbEditBox.qml.orig rename to FileSets/v3.30~1/MbEditBox.qml.orig diff --git a/FileSets/v3.20~42/MbEditBoxDateTime.qml b/FileSets/v3.30~1/MbEditBoxDateTime.qml similarity index 100% rename from FileSets/v3.20~42/MbEditBoxDateTime.qml rename to FileSets/v3.30~1/MbEditBoxDateTime.qml diff --git a/FileSets/v3.20~42/MbEditBoxDateTime.qml.orig b/FileSets/v3.30~1/MbEditBoxDateTime.qml.orig similarity index 100% rename from FileSets/v3.20~42/MbEditBoxDateTime.qml.orig rename to FileSets/v3.30~1/MbEditBoxDateTime.qml.orig diff --git a/FileSets/v3.20~42/MbItem.qml b/FileSets/v3.30~1/MbItem.qml similarity index 100% rename from FileSets/v3.20~42/MbItem.qml rename to FileSets/v3.30~1/MbItem.qml diff --git a/FileSets/v3.20~42/MbItem.qml.orig b/FileSets/v3.30~1/MbItem.qml.orig similarity index 100% rename from FileSets/v3.20~42/MbItem.qml.orig rename to FileSets/v3.30~1/MbItem.qml.orig diff --git a/FileSets/v3.30~1/MbItemDigitalInput.qml b/FileSets/v3.30~1/MbItemDigitalInput.qml new file mode 100644 index 00000000..e4a1d7fc --- /dev/null +++ b/FileSets/v3.30~1/MbItemDigitalInput.qml @@ -0,0 +1,30 @@ +//// modified for ExtTransferSwitch package + +import QtQuick 1.1 + +MbItemOptions { + show: valid + signal disabled + property variant previousValue: undefined + possibleValues: [ + MbOption { description: qsTr("Disabled"); value: 0 }, + MbOption { description: qsTr("Pulse meter"); value: 1 }, + MbOption { description: qsTr("Door alarm"); value: 2 }, + MbOption { description: qsTr("Bilge pump"); value: 3 }, + MbOption { description: qsTr("Bilge alarm"); value: 4 }, + MbOption { description: qsTr("Burglar alarm"); value: 5 }, + MbOption { description: qsTr("Smoke alarm"); value: 6 }, + MbOption { description: qsTr("Fire alarm"); value: 7 }, + MbOption { description: qsTr("CO2 alarm"); value: 8 }, + MbOption { description: qsTr("Generator"); value: 9 }, + MbOption { description: qsTr("Touch input control"); value: 11 }, +//// added for ExtTransferSwitch package + MbOption { description: qsTr("External transfer switch"); value: 12 } + ] + onValueChanged: { + if (valid) { + if (previousValue != undefined && value == 0) disabled() + previousValue = value + } + } +} diff --git a/FileSets/v3.30~1/MbItemDigitalInput.qml.orig b/FileSets/v3.30~1/MbItemDigitalInput.qml.orig new file mode 100644 index 00000000..91c78131 --- /dev/null +++ b/FileSets/v3.30~1/MbItemDigitalInput.qml.orig @@ -0,0 +1,26 @@ +import QtQuick 1.1 + +MbItemOptions { + show: valid + signal disabled + property variant previousValue: undefined + possibleValues: [ + MbOption { description: qsTr("Disabled"); value: 0 }, + MbOption { description: qsTr("Pulse meter"); value: 1 }, + MbOption { description: qsTr("Door alarm"); value: 2 }, + MbOption { description: qsTr("Bilge pump"); value: 3 }, + MbOption { description: qsTr("Bilge alarm"); value: 4 }, + MbOption { description: qsTr("Burglar alarm"); value: 5 }, + MbOption { description: qsTr("Smoke alarm"); value: 6 }, + MbOption { description: qsTr("Fire alarm"); value: 7 }, + MbOption { description: qsTr("CO2 alarm"); value: 8 }, + MbOption { description: qsTr("Generator"); value: 9 }, + MbOption { description: qsTr("Touch input control"); value: 11 } + ] + onValueChanged: { + if (valid) { + if (previousValue != undefined && value == 0) disabled() + previousValue = value + } + } +} diff --git a/FileSets/v3.20~42/MbSpinBox.qml b/FileSets/v3.30~1/MbSpinBox.qml similarity index 100% rename from FileSets/v3.20~42/MbSpinBox.qml rename to FileSets/v3.30~1/MbSpinBox.qml diff --git a/FileSets/v3.20~42/MbSpinBox.qml.orig b/FileSets/v3.30~1/MbSpinBox.qml.orig similarity index 100% rename from FileSets/v3.20~42/MbSpinBox.qml.orig rename to FileSets/v3.30~1/MbSpinBox.qml.orig diff --git a/FileSets/v3.20~42/MbStyle.qml b/FileSets/v3.30~1/MbStyle.qml similarity index 100% rename from FileSets/v3.20~42/MbStyle.qml rename to FileSets/v3.30~1/MbStyle.qml diff --git a/FileSets/v3.20~42/MbStyle.qml.orig b/FileSets/v3.30~1/MbStyle.qml.orig similarity index 100% rename from FileSets/v3.20~42/MbStyle.qml.orig rename to FileSets/v3.30~1/MbStyle.qml.orig diff --git a/FileSets/v3.20~42/MbSubMenu.qml b/FileSets/v3.30~1/MbSubMenu.qml similarity index 100% rename from FileSets/v3.20~42/MbSubMenu.qml rename to FileSets/v3.30~1/MbSubMenu.qml diff --git a/FileSets/v3.20~42/MbSubMenu.qml.orig b/FileSets/v3.30~1/MbSubMenu.qml.orig similarity index 100% rename from FileSets/v3.20~42/MbSubMenu.qml.orig rename to FileSets/v3.30~1/MbSubMenu.qml.orig diff --git a/FileSets/v3.20~42/Multi.qml b/FileSets/v3.30~1/Multi.qml similarity index 100% rename from FileSets/v3.20~42/Multi.qml rename to FileSets/v3.30~1/Multi.qml diff --git a/FileSets/v3.20~42/Multi.qml.orig b/FileSets/v3.30~1/Multi.qml.orig similarity index 100% rename from FileSets/v3.20~42/Multi.qml.orig rename to FileSets/v3.30~1/Multi.qml.orig diff --git a/FileSets/v3.20~42/ObjectAcConnection.qml b/FileSets/v3.30~1/ObjectAcConnection.qml similarity index 100% rename from FileSets/v3.20~42/ObjectAcConnection.qml rename to FileSets/v3.30~1/ObjectAcConnection.qml diff --git a/FileSets/v3.20~42/ObjectAcConnection.qml.orig b/FileSets/v3.30~1/ObjectAcConnection.qml.orig similarity index 100% rename from FileSets/v3.20~42/ObjectAcConnection.qml.orig rename to FileSets/v3.30~1/ObjectAcConnection.qml.orig diff --git a/FileSets/v3.20~42/OverviewAcValuesEnhanced.qml b/FileSets/v3.30~1/OverviewAcValuesEnhanced.qml similarity index 100% rename from FileSets/v3.20~42/OverviewAcValuesEnhanced.qml rename to FileSets/v3.30~1/OverviewAcValuesEnhanced.qml diff --git a/FileSets/v3.20~42/OverviewAcValuesEnhanced.qml.orig b/FileSets/v3.30~1/OverviewAcValuesEnhanced.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewAcValuesEnhanced.qml.orig rename to FileSets/v3.30~1/OverviewAcValuesEnhanced.qml.orig diff --git a/FileSets/v3.20~42/OverviewBox.qml b/FileSets/v3.30~1/OverviewBox.qml similarity index 100% rename from FileSets/v3.20~42/OverviewBox.qml rename to FileSets/v3.30~1/OverviewBox.qml diff --git a/FileSets/v3.20~42/OverviewBox.qml.orig b/FileSets/v3.30~1/OverviewBox.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewBox.qml.orig rename to FileSets/v3.30~1/OverviewBox.qml.orig diff --git a/FileSets/v3.20~42/OverviewConnection.qml b/FileSets/v3.30~1/OverviewConnection.qml similarity index 100% rename from FileSets/v3.20~42/OverviewConnection.qml rename to FileSets/v3.30~1/OverviewConnection.qml diff --git a/FileSets/v3.20~42/OverviewConnection.qml.orig b/FileSets/v3.30~1/OverviewConnection.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewConnection.qml.orig rename to FileSets/v3.30~1/OverviewConnection.qml.orig diff --git a/FileSets/v3.20~42/OverviewConnectionEnd.qml b/FileSets/v3.30~1/OverviewConnectionEnd.qml similarity index 100% rename from FileSets/v3.20~42/OverviewConnectionEnd.qml rename to FileSets/v3.30~1/OverviewConnectionEnd.qml diff --git a/FileSets/v3.20~42/OverviewConnectionEnd.qml.orig b/FileSets/v3.30~1/OverviewConnectionEnd.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewConnectionEnd.qml.orig rename to FileSets/v3.30~1/OverviewConnectionEnd.qml.orig diff --git a/FileSets/v3.20~42/OverviewFlowComplex.qml b/FileSets/v3.30~1/OverviewFlowComplex.qml similarity index 100% rename from FileSets/v3.20~42/OverviewFlowComplex.qml rename to FileSets/v3.30~1/OverviewFlowComplex.qml diff --git a/FileSets/v3.20~42/OverviewFlowComplex.qml.orig b/FileSets/v3.30~1/OverviewFlowComplex.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewFlowComplex.qml.orig rename to FileSets/v3.30~1/OverviewFlowComplex.qml.orig diff --git a/FileSets/v3.20~42/OverviewGeneratorEnhanced.qml b/FileSets/v3.30~1/OverviewGeneratorEnhanced.qml similarity index 100% rename from FileSets/v3.20~42/OverviewGeneratorEnhanced.qml rename to FileSets/v3.30~1/OverviewGeneratorEnhanced.qml diff --git a/FileSets/v3.20~42/OverviewGeneratorEnhanced.qml.orig b/FileSets/v3.30~1/OverviewGeneratorEnhanced.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewGeneratorEnhanced.qml.orig rename to FileSets/v3.30~1/OverviewGeneratorEnhanced.qml.orig diff --git a/FileSets/v3.20~42/OverviewGeneratorRelayEnhanced.qml b/FileSets/v3.30~1/OverviewGeneratorRelayEnhanced.qml similarity index 100% rename from FileSets/v3.20~42/OverviewGeneratorRelayEnhanced.qml rename to FileSets/v3.30~1/OverviewGeneratorRelayEnhanced.qml diff --git a/FileSets/v3.20~42/OverviewGeneratorRelayEnhanced.qml.orig b/FileSets/v3.30~1/OverviewGeneratorRelayEnhanced.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewGeneratorRelayEnhanced.qml.orig rename to FileSets/v3.30~1/OverviewGeneratorRelayEnhanced.qml.orig diff --git a/FileSets/v3.20~42/OverviewGridParallel.qml b/FileSets/v3.30~1/OverviewGridParallel.qml similarity index 100% rename from FileSets/v3.20~42/OverviewGridParallel.qml rename to FileSets/v3.30~1/OverviewGridParallel.qml diff --git a/FileSets/v3.20~42/OverviewGridParallel.qml.orig b/FileSets/v3.30~1/OverviewGridParallel.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewGridParallel.qml.orig rename to FileSets/v3.30~1/OverviewGridParallel.qml.orig diff --git a/FileSets/v3.20~42/OverviewHub.qml b/FileSets/v3.30~1/OverviewHub.qml similarity index 100% rename from FileSets/v3.20~42/OverviewHub.qml rename to FileSets/v3.30~1/OverviewHub.qml diff --git a/FileSets/v3.20~42/OverviewHub.qml.orig b/FileSets/v3.30~1/OverviewHub.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewHub.qml.orig rename to FileSets/v3.30~1/OverviewHub.qml.orig diff --git a/FileSets/v3.20~42/OverviewHubEnhanced.qml b/FileSets/v3.30~1/OverviewHubEnhanced.qml similarity index 100% rename from FileSets/v3.20~42/OverviewHubEnhanced.qml rename to FileSets/v3.30~1/OverviewHubEnhanced.qml diff --git a/FileSets/v3.20~42/OverviewHubEnhanced.qml.orig b/FileSets/v3.30~1/OverviewHubEnhanced.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewHubEnhanced.qml.orig rename to FileSets/v3.30~1/OverviewHubEnhanced.qml.orig diff --git a/FileSets/v3.20~42/OverviewMobileEnhanced.qml b/FileSets/v3.30~1/OverviewMobileEnhanced.qml similarity index 100% rename from FileSets/v3.20~42/OverviewMobileEnhanced.qml rename to FileSets/v3.30~1/OverviewMobileEnhanced.qml diff --git a/FileSets/v3.20~42/OverviewMobileEnhanced.qml.orig b/FileSets/v3.30~1/OverviewMobileEnhanced.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewMobileEnhanced.qml.orig rename to FileSets/v3.30~1/OverviewMobileEnhanced.qml.orig diff --git a/FileSets/v3.20~42/OverviewSolarCharger.qml b/FileSets/v3.30~1/OverviewSolarCharger.qml similarity index 100% rename from FileSets/v3.20~42/OverviewSolarCharger.qml rename to FileSets/v3.30~1/OverviewSolarCharger.qml diff --git a/FileSets/v3.20~42/OverviewSolarCharger.qml.orig b/FileSets/v3.30~1/OverviewSolarCharger.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewSolarCharger.qml.orig rename to FileSets/v3.30~1/OverviewSolarCharger.qml.orig diff --git a/FileSets/v3.20~42/OverviewSolarInverter.qml b/FileSets/v3.30~1/OverviewSolarInverter.qml similarity index 100% rename from FileSets/v3.20~42/OverviewSolarInverter.qml rename to FileSets/v3.30~1/OverviewSolarInverter.qml diff --git a/FileSets/v3.20~42/OverviewSolarInverter.qml.orig b/FileSets/v3.30~1/OverviewSolarInverter.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewSolarInverter.qml.orig rename to FileSets/v3.30~1/OverviewSolarInverter.qml.orig diff --git a/FileSets/v3.20~42/OverviewTankDelegate.qml b/FileSets/v3.30~1/OverviewTankDelegate.qml similarity index 100% rename from FileSets/v3.20~42/OverviewTankDelegate.qml rename to FileSets/v3.30~1/OverviewTankDelegate.qml diff --git a/FileSets/v3.20~42/OverviewTankDelegate.qml.orig b/FileSets/v3.30~1/OverviewTankDelegate.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewTankDelegate.qml.orig rename to FileSets/v3.30~1/OverviewTankDelegate.qml.orig diff --git a/FileSets/v3.20~42/OverviewTanks.qml b/FileSets/v3.30~1/OverviewTanks.qml similarity index 100% rename from FileSets/v3.20~42/OverviewTanks.qml rename to FileSets/v3.30~1/OverviewTanks.qml diff --git a/FileSets/v3.20~42/OverviewTanks.qml.orig b/FileSets/v3.30~1/OverviewTanks.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewTanks.qml.orig rename to FileSets/v3.30~1/OverviewTanks.qml.orig diff --git a/FileSets/v3.20~42/OverviewTanksTempsDigInputs.qml b/FileSets/v3.30~1/OverviewTanksTempsDigInputs.qml similarity index 100% rename from FileSets/v3.20~42/OverviewTanksTempsDigInputs.qml rename to FileSets/v3.30~1/OverviewTanksTempsDigInputs.qml diff --git a/FileSets/v3.20~42/OverviewTanksTempsDigInputs.qml.orig b/FileSets/v3.30~1/OverviewTanksTempsDigInputs.qml.orig similarity index 100% rename from FileSets/v3.20~42/OverviewTanksTempsDigInputs.qml.orig rename to FileSets/v3.30~1/OverviewTanksTempsDigInputs.qml.orig diff --git a/FileSets/v3.30~1/PageDigitalInput.qml b/FileSets/v3.30~1/PageDigitalInput.qml new file mode 100644 index 00000000..3a9483ca --- /dev/null +++ b/FileSets/v3.30~1/PageDigitalInput.qml @@ -0,0 +1,147 @@ +//// modified for ExtTransferSwitch package + +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: root + + property variant service + property string bindPrefix + property string settingsBindPreffix: "com.victronenergy.settings/Settings/DigitalInput/" + inputNumber + property int inputNumber: instance.valid ? instance.value : 0 + + title: getType(service.description) + summary: getState(state.item.value) + + VBusItem { + id: instance + bind: service.path("/DeviceInstance") + } + +//// added for ExtTransferSwitch package + VBusItem + { + id: ac2connectedItem + bind: Utils.path ("com.victronenergy.system", "/Ac/In/1/Connected") + } + property bool showTransferSwitchConnection: ac2connectedItem.valid + VBusItem + { + id: typeItem + bind: service.path("/Type") + } + property bool isTransferSwitch: typeItem.valid && typeItem.value == 12 + + // Handle translations + function getType(type){ + switch (type) { + case "Disabled": + return qsTr("Disabled") + case "Pulse meter": + return qsTr("Pulse meter") + case "Door alarm": + return qsTr("Door alarm") + case "Bilge pump": + return qsTr("Bilge pump") + case "Bilge alarm": + return qsTr("Bilge alarm") + case "Burglar alarm": + return qsTr("Burglar alarm") + case "Smoke alarm": + return qsTr("Smoke alarm") + case "Fire alarm": + return qsTr("Fire alarm") + case "CO2 alarm": + return qsTr("CO2 alarm") + case "Generator": + return qsTr("Generator") +//// added for ExtTransferSwitch package + case "TransferSwitch": + return qsTr("External transfer switch") + } + return type; + } + + function getState(st) + { + switch (st) { + case 0: + return qsTr("Low") + case 1: + return qsTr("High") + case 2: + return qsTr("Off") + case 3: + return qsTr("On") + case 4: + return qsTr("No") + case 5: + return qsTr("Yes") + case 6: + return qsTr("Open") + case 7: + return qsTr("Closed") + case 8: + return qsTr("Ok") + case 9: + return qsTr("Alarm") + case 10: + return qsTr("Running") + case 11: + return qsTr("Stopped") +//// added for ExtTransferSwitch package + case 12: + return qsTr("On generator") + case 13: + return qsTr("On grid") + } + + return qsTr("Unknown") + } + + model: VisibleItemModel { + MbItemValue { + id: state + description: qsTr("State") + item.bind: service.path("/State") + item.text: getState(item.value) + } + + MbSubMenu { + id: setupMenu + description: qsTr("Setup") + subpage: Component { + PageDigitalInputSetup { + bindPrefix: root.settingsBindPreffix + } + } + } + + MbSubMenu { + id: deviceMenu + description: qsTr("Device") + subpage: Component { + PageDeviceInfo { + title: deviceMenu.description + bindPrefix: root.bindPrefix + } + } + } + +//// added for ExtTransferSwitch package + MbItemOptions + { + id: extTransferSwitch + description: qsTr("External transfer switch connection") + bind: Utils.path ("com.victronenergy.settings/Settings", "/TransferSwitch/TransferSwitchOnAc2") + possibleValues: + [ + MbOption {description: qsTr("AC 1 in"); value: 0}, + MbOption {description: qsTr("AC 2 in"); value: 1} + ] + visible: root.isTransferSwitch && root.showTransferSwitchConnection + } + } +} diff --git a/FileSets/v3.30~1/PageDigitalInput.qml.orig b/FileSets/v3.30~1/PageDigitalInput.qml.orig new file mode 100644 index 00000000..740c4223 --- /dev/null +++ b/FileSets/v3.30~1/PageDigitalInput.qml.orig @@ -0,0 +1,109 @@ +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: root + + property variant service + property string bindPrefix + property string settingsBindPreffix: "com.victronenergy.settings/Settings/DigitalInput/" + inputNumber + property int inputNumber: instance.valid ? instance.value : 0 + + title: getType(service.description) + summary: getState(state.item.value) + + VBusItem { + id: instance + bind: service.path("/DeviceInstance") + } + + // Handle translations + function getType(type){ + switch (type) { + case "Disabled": + return qsTr("Disabled") + case "Pulse meter": + return qsTr("Pulse meter") + case "Door alarm": + return qsTr("Door alarm") + case "Bilge pump": + return qsTr("Bilge pump") + case "Bilge alarm": + return qsTr("Bilge alarm") + case "Burglar alarm": + return qsTr("Burglar alarm") + case "Smoke alarm": + return qsTr("Smoke alarm") + case "Fire alarm": + return qsTr("Fire alarm") + case "CO2 alarm": + return qsTr("CO2 alarm") + case "Generator": + return qsTr("Generator") + } + return type; + } + + function getState(st) + { + switch (st) { + case 0: + return qsTr("Low") + case 1: + return qsTr("High") + case 2: + return qsTr("Off") + case 3: + return qsTr("On") + case 4: + return qsTr("No") + case 5: + return qsTr("Yes") + case 6: + return qsTr("Open") + case 7: + return qsTr("Closed") + case 8: + return qsTr("Ok") + case 9: + return qsTr("Alarm") + case 10: + return qsTr("Running") + case 11: + return qsTr("Stopped") + } + + return qsTr("Unknown") + } + + model: VisibleItemModel { + MbItemValue { + id: state + description: qsTr("State") + item.bind: service.path("/State") + item.text: getState(item.value) + } + + MbSubMenu { + id: setupMenu + description: qsTr("Setup") + subpage: Component { + PageDigitalInputSetup { + bindPrefix: root.settingsBindPreffix + } + } + } + + MbSubMenu { + id: deviceMenu + description: qsTr("Device") + subpage: Component { + PageDeviceInfo { + title: deviceMenu.description + bindPrefix: root.bindPrefix + } + } + } + } +} diff --git a/FileSets/v3.20~42/PageGenerator.qml b/FileSets/v3.30~1/PageGenerator.qml similarity index 100% rename from FileSets/v3.20~42/PageGenerator.qml rename to FileSets/v3.30~1/PageGenerator.qml diff --git a/FileSets/v3.20~42/PageGenerator.qml.orig b/FileSets/v3.30~1/PageGenerator.qml.orig similarity index 100% rename from FileSets/v3.20~42/PageGenerator.qml.orig rename to FileSets/v3.30~1/PageGenerator.qml.orig diff --git a/FileSets/v3.30~1/PageMain.qml b/FileSets/v3.30~1/PageMain.qml new file mode 100644 index 00000000..31ec72ff --- /dev/null +++ b/FileSets/v3.30~1/PageMain.qml @@ -0,0 +1,285 @@ +//////// GuiMods modified order to put Settings, then Notifications at top of list + +import QtQuick 1.1 +import "utils.js" as Utils +import com.victron.velib 1.0 + +MbPage { + id: root + title: qsTr("Device List") + +//////// GuiMods put Settings, Notifications, Remove disconnected... at top of list + property VBusItem moveSettings: VBusItem { id: moveSettings; bind: Utils.path("com.victronenergy.settings", "/Settings/GuiMods/MoveSettings")} + property bool settingsAtTop: moveSettings.valid && moveSettings.value === 1 + + model: VisualModels { +//////// GuiMods put Settings, Notifications, Remove disconnected... at top of list + VisibleItemModel { + MbSubMenu { + description: qsTr("Settings") + subpage: Component { PageSettings {} } + show: settingsAtTop + } + + MbSubMenu { + id: menuNotificationsTop + description: qsTr("Notifications") + item: VBusItem { value: menuNotifications.subpage.summary } + subpage: PageNotifications { } + show: settingsAtTop + } + + MbOK { + description: qsTr("Remove disconnected devices") + value: qsTr("Press to remove") + show: settingsAtTop && deviceList.disconnectedDevices != 0 + editable: true + + function clicked() { + listview.decrementCurrentIndex() + deviceList.removeDisconnected() + } + } + } +//////// end GuiMods put Settings, Notifications, Remove disconnected... at top of list + + VisualDataModel { + model: VeSortFilterProxyModel { + model: DeviceList { + id: deviceList + onRowsAboutToBeRemoved: { + for (var i = first; i <= last; i++) + deviceList.page(i).destroy() + } + } + sortRole: DeviceList.DescriptionRole + dynamicSortFilter: true + naturalSort: true + sortCaseSensitivity: Qt.CaseInsensitive + } + + delegate: MbDevice { + iconId: "icon-toolbar-enter" + service: model.page.service + subpage: model.page + } + } + VisibleItemModel { + MbSubMenu { + id: menuNotifications + description: qsTr("Notifications") + item: VBusItem { value: menuNotifications.subpage.summary } + subpage: PageNotifications { } +//////// GuiMods hide this if added at top + show: !settingsAtTop + } + + MbSubMenu { + description: qsTr("Settings") + subpage: Component { PageSettings {} } +//////// GuiMods hide this if added at top + show: !settingsAtTop + } + + MbOK { + description: qsTr("Remove disconnected devices") + value: qsTr("Press to remove") +//////// GuiMods hide this if added at top + show: !settingsAtTop && deviceList.disconnectedDevices != 0 + editable: true + + function clicked() { + listview.decrementCurrentIndex() + deviceList.removeDisconnected() + } + } + } + } + + Component { + id: vebusPage + PageVebus {} + } + + Component { + id: multiRsPage + PageMultiRs {} + } + + Component { + id: batteryPage + PageBattery {} + } + + Component { + id: solarChargerPage + PageSolarCharger {} + } + + Component { + id: acInPage + PageAcIn {} + } + + Component { + id: acChargerPage + PageAcCharger {} + } + + Component { + id: tankPage + PageTankSensor {} + } + + Component { + id: motorDrivePage + PageMotorDrive {} + } + + Component { + id: inverterPage + PageInverter {} + } + + Component { + id: pulseCounterPage + PagePulseCounter {} + } + + Component { + id: digitalInputPage + PageDigitalInput {} + } + + Component { + id: temperatureSensorPage + PageTemperatureSensor {} + } + + Component { + id: unsupportedDevicePage + PageUnsupportedDevice {} + } + + Component { + id: meteoDevicePage + PageMeteo {} + } + + Component { + id: evChargerPage + PageEvCharger {} + } + + Component { + id: dcMeterPage + PageDcMeter {} + } + + Component { + id: alternatorPage + PageAlternator {} + } + + Component { + id: dcDcConverterPage + PageDcDcConverter {} + } + + function addService(service) + { + var name = service.name + + var page + switch(service.type) + { + case DBusService.DBUS_SERVICE_MULTI: + page = vebusPage + break; + case DBusService.DBUS_SERVICE_MULTI_RS: + page = multiRsPage + break; + case DBusService.DBUS_SERVICE_BATTERY: + page = batteryPage + break; + case DBusService.DBUS_SERVICE_SOLAR_CHARGER: + page = solarChargerPage + break; + case DBusService.DBUS_SERVICE_PV_INVERTER: + page = acInPage + break; + case DBusService.DBUS_SERVICE_AC_CHARGER: + page = acChargerPage + break; + case DBusService.DBUS_SERVICE_TANK: + page = tankPage + break; + case DBusService.DBUS_SERVICE_GRIDMETER: + page = acInPage + break + case DBusService.DBUS_SERVICE_GENSET: + page = acInPage + break + case DBusService.DBUS_SERVICE_MOTOR_DRIVE: + page = motorDrivePage + break + case DBusService.DBUS_SERVICE_INVERTER: + page = inverterPage + break; + case DBusService.DBUS_SERVICE_TEMPERATURE_SENSOR: + page = temperatureSensorPage + break; + case DBusService.DBUS_SERVICE_SYSTEM_CALC: + return; + case DBusService.DBUS_SERVICE_DIGITAL_INPUT: + page = digitalInputPage + break; + case DBusService.DBUS_SERVICE_PULSE_COUNTER: + page = pulseCounterPage + break; + case DBusService.DBUS_SERVICE_UNSUPPORTED: + page = unsupportedDevicePage + break; + case DBusService.DBUS_SERVICE_METEO: + page = meteoDevicePage + break; + case DBusService.DBUS_SERVICE_VECAN: + return; + case DBusService.DBUS_SERVICE_EVCHARGER: + page = evChargerPage + break + case DBusService.DBUS_SERVICE_ACLOAD: + page = acInPage + break + case DBusService.DBUS_SERVICE_HUB4: + return; + case DBusService.DBUS_SERVICE_FUELCELL: + case DBusService.DBUS_SERVICE_DCSOURCE: + case DBusService.DBUS_SERVICE_DCLOAD: + case DBusService.DBUS_SERVICE_DCSYSTEM: + page = dcMeterPage + break + case DBusService.DBUS_SERVICE_ALTERNATOR: + page = alternatorPage + break + case DBusService.DBUS_SERVICE_DCDC: + page = dcDcConverterPage + break + default: + console.log("unknown service " + name) + return; + } + + deviceList.append(service, page.createObject(root, {service: service, bindPrefix: service.name})) + } + + Component.onCompleted: { + for (var i = 0; i < DBusServices.count; i++) + addService(DBusServices.at(i)) + } + + Connections { + target: DBusServices + onDbusServiceFound: addService(service) + } +} diff --git a/FileSets/v3.30~1/PageMain.qml.orig b/FileSets/v3.30~1/PageMain.qml.orig new file mode 100644 index 00000000..9a2348e5 --- /dev/null +++ b/FileSets/v3.30~1/PageMain.qml.orig @@ -0,0 +1,243 @@ +import QtQuick 1.1 +import com.victron.velib 1.0 + +MbPage { + id: root + title: qsTr("Device List") + + model: VisualModels { + VisualDataModel { + model: VeSortFilterProxyModel { + model: DeviceList { + id: deviceList + onRowsAboutToBeRemoved: { + for (var i = first; i <= last; i++) + deviceList.page(i).destroy() + } + } + sortRole: DeviceList.DescriptionRole + dynamicSortFilter: true + naturalSort: true + sortCaseSensitivity: Qt.CaseInsensitive + } + + delegate: MbDevice { + iconId: "icon-toolbar-enter" + service: model.page.service + subpage: model.page + } + } + VisibleItemModel { + MbSubMenu { + id: menuNotifications + description: qsTr("Notifications") + item: VBusItem { value: menuNotifications.subpage.summary } + subpage: PageNotifications { } + } + + MbSubMenu { + description: qsTr("Settings") + subpage: Component { PageSettings {} } + } + + MbOK { + description: qsTr("Remove disconnected devices") + value: qsTr("Press to remove") + show: deviceList.disconnectedDevices != 0 + editable: true + + function clicked() { + listview.decrementCurrentIndex() + deviceList.removeDisconnected() + } + } + } + } + + Component { + id: vebusPage + PageVebus {} + } + + Component { + id: multiRsPage + PageMultiRs {} + } + + Component { + id: batteryPage + PageBattery {} + } + + Component { + id: solarChargerPage + PageSolarCharger {} + } + + Component { + id: acInPage + PageAcIn {} + } + + Component { + id: acChargerPage + PageAcCharger {} + } + + Component { + id: tankPage + PageTankSensor {} + } + + Component { + id: motorDrivePage + PageMotorDrive {} + } + + Component { + id: inverterPage + PageInverter {} + } + + Component { + id: pulseCounterPage + PagePulseCounter {} + } + + Component { + id: digitalInputPage + PageDigitalInput {} + } + + Component { + id: temperatureSensorPage + PageTemperatureSensor {} + } + + Component { + id: unsupportedDevicePage + PageUnsupportedDevice {} + } + + Component { + id: meteoDevicePage + PageMeteo {} + } + + Component { + id: evChargerPage + PageEvCharger {} + } + + Component { + id: dcMeterPage + PageDcMeter {} + } + + Component { + id: alternatorPage + PageAlternator {} + } + + Component { + id: dcDcConverterPage + PageDcDcConverter {} + } + + function addService(service) + { + var name = service.name + + var page + switch(service.type) + { + case DBusService.DBUS_SERVICE_MULTI: + page = vebusPage + break; + case DBusService.DBUS_SERVICE_MULTI_RS: + page = multiRsPage + break; + case DBusService.DBUS_SERVICE_BATTERY: + page = batteryPage + break; + case DBusService.DBUS_SERVICE_SOLAR_CHARGER: + page = solarChargerPage + break; + case DBusService.DBUS_SERVICE_PV_INVERTER: + page = acInPage + break; + case DBusService.DBUS_SERVICE_AC_CHARGER: + page = acChargerPage + break; + case DBusService.DBUS_SERVICE_TANK: + page = tankPage + break; + case DBusService.DBUS_SERVICE_GRIDMETER: + page = acInPage + break + case DBusService.DBUS_SERVICE_GENSET: + page = acInPage + break + case DBusService.DBUS_SERVICE_MOTOR_DRIVE: + page = motorDrivePage + break + case DBusService.DBUS_SERVICE_INVERTER: + page = inverterPage + break; + case DBusService.DBUS_SERVICE_TEMPERATURE_SENSOR: + page = temperatureSensorPage + break; + case DBusService.DBUS_SERVICE_SYSTEM_CALC: + return; + case DBusService.DBUS_SERVICE_DIGITAL_INPUT: + page = digitalInputPage + break; + case DBusService.DBUS_SERVICE_PULSE_COUNTER: + page = pulseCounterPage + break; + case DBusService.DBUS_SERVICE_UNSUPPORTED: + page = unsupportedDevicePage + break; + case DBusService.DBUS_SERVICE_METEO: + page = meteoDevicePage + break; + case DBusService.DBUS_SERVICE_VECAN: + return; + case DBusService.DBUS_SERVICE_EVCHARGER: + page = evChargerPage + break + case DBusService.DBUS_SERVICE_ACLOAD: + page = acInPage + break + case DBusService.DBUS_SERVICE_HUB4: + return; + case DBusService.DBUS_SERVICE_FUELCELL: + case DBusService.DBUS_SERVICE_DCSOURCE: + case DBusService.DBUS_SERVICE_DCLOAD: + case DBusService.DBUS_SERVICE_DCSYSTEM: + page = dcMeterPage + break + case DBusService.DBUS_SERVICE_ALTERNATOR: + page = alternatorPage + break + case DBusService.DBUS_SERVICE_DCDC: + page = dcDcConverterPage + break + default: + console.log("unknown service " + name) + return; + } + + deviceList.append(service, page.createObject(root, {service: service, bindPrefix: service.name})) + } + + Component.onCompleted: { + for (var i = 0; i < DBusServices.count; i++) + addService(DBusServices.at(i)) + } + + Connections { + target: DBusServices + onDbusServiceFound: addService(service) + } +} diff --git a/FileSets/v3.20~42/PageSettingsDisplay.qml b/FileSets/v3.30~1/PageSettingsDisplay.qml similarity index 100% rename from FileSets/v3.20~42/PageSettingsDisplay.qml rename to FileSets/v3.30~1/PageSettingsDisplay.qml diff --git a/FileSets/v3.20~42/PageSettingsDisplay.qml.orig b/FileSets/v3.30~1/PageSettingsDisplay.qml.orig similarity index 100% rename from FileSets/v3.20~42/PageSettingsDisplay.qml.orig rename to FileSets/v3.30~1/PageSettingsDisplay.qml.orig diff --git a/FileSets/v3.30~1/PageSettingsGenerator.qml b/FileSets/v3.30~1/PageSettingsGenerator.qml new file mode 100644 index 00000000..79afbd25 --- /dev/null +++ b/FileSets/v3.30~1/PageSettingsGenerator.qml @@ -0,0 +1,129 @@ +//// GuiMods +//// added link to external state enable + +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: root + title: qsTr("Generator start/stop settings") + property string settingsBindPrefix + property string startStopBindPrefix + property VBusItem acIn1Source: VBusItem { bind: "com.victronenergy.settings/Settings/SystemSetup/AcInput1" } + property VBusItem acIn2Source: VBusItem { bind: "com.victronenergy.settings/Settings/SystemSetup/AcInput2" } + property VBusItem capabilities: VBusItem { bind: Utils.path(startStopBindPrefix, "/Capabilities") } + property int warmupCapability: 1 + + model: VisibleItemModel { + + MbSubMenu { + id: conditions + description: qsTr("Conditions") + subpage: + Component { + PageGeneratorConditions { + title: qsTr("Conditions") + bindPrefix: root.settingsBindPrefix + startStopBindPrefix: root.startStopBindPrefix + } + } + } + + MbSpinBox { + description: qsTr("Minimum run time") + item { + bind: Utils.path(settingsBindPrefix, "/MinimumRuntime") + unit: "m" + decimals: 0 + step: 1 + } + } + + MbSubMenu { + show: capabilities.value & warmupCapability + description: qsTr("Warm-up & cool-down") + subpage: + Component { + PageSettingsGeneratorWarmup { + title: qsTr("Warm-up & cool-down") + } + } + } + + MbSwitch { + id: detectGeneratorAtAcIn + + property bool generatorIsSet: acIn1Source.value === 2 || acIn2Source.value === 2 + name: qsTr("Detect generator at AC input") + bind: Utils.path(settingsBindPrefix, "/Alarms/NoGeneratorAtAcIn") + enabled: valid && (generatorIsSet || checked) + onClicked: { + if (!checked) { + if (!generatorIsSet) { + toast.createToast(qsTr("None of the AC inputs is set to generator. Go to the system setup page and set the correct " + + "AC input to generator in order to enable this functionality."), 10000, "icon-info-active") + } else { + toast.createToast(qsTr("An alarm will be triggered when no power from the generator is detected at the inverter AC input. " + + "Make sure that the correct AC input is set to generator on the system setup page."), 12000, "icon-info-active") + } + } + } + } +//// GuiMods + MbSwitch { + name: qsTr("Link to external running state") + bind: Utils.path(settingsBindPrefix, "/LinkToExternalStatus") + onClicked: + { + if (!checked) + toast.createToast(qsTr("Manual run will be synchronized with the generaror 'is running digital input' or AC input"), 10000, "icon-info-active") + } + } + + MbSwitch { + name: qsTr("Alarm when generator is not in auto start mode") + bind: Utils.path(settingsBindPrefix, "/Alarms/AutoStartDisabled") + onClicked: { + if (!checked) { + toast.createToast(qsTr("An alarm will be triggered when auto start function is left disabled for more than 10 minutes."), 12000, "icon-info-active") + } + } + } + + MbSwitch { + id: timeZones + name: qsTr("Quiet hours") + bind: Utils.path(settingsBindPrefix, "/QuietHours/Enabled") + enabled: valid + writeAccessLevel: User.AccessUser + } + + MbEditBoxTime { + description: qsTr("Quiet hours start time") + item.bind: Utils.path(settingsBindPrefix, "/QuietHours/StartTime") + show: timeZones.checked + writeAccessLevel: User.AccessUser + } + + MbEditBoxTime { + description: qsTr("Quiet hours end time") + item.bind: Utils.path(settingsBindPrefix, "/QuietHours/EndTime") + show: timeZones.checked + writeAccessLevel: User.AccessUser + } + + MbSubMenu { + id: runtimePage + description: qsTr("Run time and service") + subpage: + Component { + PageGeneratorRuntimeService { + title: qsTr("Run time and service") + startStopBindPrefix: root.startStopBindPrefix + settingsBindPrefix: root.settingsBindPrefix + } + } + } + } +} diff --git a/FileSets/v3.30~1/PageSettingsGenerator.qml.orig b/FileSets/v3.30~1/PageSettingsGenerator.qml.orig new file mode 100644 index 00000000..8cd1cf85 --- /dev/null +++ b/FileSets/v3.30~1/PageSettingsGenerator.qml.orig @@ -0,0 +1,114 @@ +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: root + title: qsTr("Generator start/stop settings") + property string settingsBindPrefix + property string startStopBindPrefix + property VBusItem acIn1Source: VBusItem { bind: "com.victronenergy.settings/Settings/SystemSetup/AcInput1" } + property VBusItem acIn2Source: VBusItem { bind: "com.victronenergy.settings/Settings/SystemSetup/AcInput2" } + property VBusItem capabilities: VBusItem { bind: Utils.path(startStopBindPrefix, "/Capabilities") } + property int warmupCapability: 1 + + model: VisibleItemModel { + + MbSubMenu { + id: conditions + description: qsTr("Conditions") + subpage: + Component { + PageGeneratorConditions { + title: qsTr("Conditions") + bindPrefix: root.settingsBindPrefix + startStopBindPrefix: root.startStopBindPrefix + } + } + } + + MbSpinBox { + description: qsTr("Minimum run time") + item { + bind: Utils.path(settingsBindPrefix, "/MinimumRuntime") + unit: "m" + decimals: 0 + step: 1 + } + } + + MbSubMenu { + show: capabilities.value & warmupCapability + description: qsTr("Warm-up & cool-down") + subpage: + Component { + PageSettingsGeneratorWarmup { + title: qsTr("Warm-up & cool-down") + } + } + } + + MbSwitch { + property bool generatorIsSet: acIn1Source.value === 2 || acIn2Source.value === 2 + name: qsTr("Detect generator at AC input") + bind: Utils.path(settingsBindPrefix, "/Alarms/NoGeneratorAtAcIn") + enabled: valid && (generatorIsSet || checked) + onClicked: { + if (!checked) { + if (!generatorIsSet) { + toast.createToast(qsTr("None of the AC inputs is set to generator. Go to the system setup page and set the correct " + + "AC input to generator in order to enable this functionality."), 10000, "icon-info-active") + } else { + toast.createToast(qsTr("An alarm will be triggered when no power from the generator is detected at the inverter AC input. " + + "Make sure that the correct AC input is set to generator on the system setup page."), 12000, "icon-info-active") + } + } + } + } + + MbSwitch { + name: qsTr("Alarm when generator is not in auto start mode") + bind: Utils.path(settingsBindPrefix, "/Alarms/AutoStartDisabled") + onClicked: { + if (!checked) { + toast.createToast(qsTr("An alarm will be triggered when auto start function is left disabled for more than 10 minutes."), 12000, "icon-info-active") + } + } + } + + MbSwitch { + id: timeZones + name: qsTr("Quiet hours") + bind: Utils.path(settingsBindPrefix, "/QuietHours/Enabled") + enabled: valid + writeAccessLevel: User.AccessUser + } + + MbEditBoxTime { + description: qsTr("Quiet hours start time") + item.bind: Utils.path(settingsBindPrefix, "/QuietHours/StartTime") + show: timeZones.checked + writeAccessLevel: User.AccessUser + } + + MbEditBoxTime { + description: qsTr("Quiet hours end time") + item.bind: Utils.path(settingsBindPrefix, "/QuietHours/EndTime") + show: timeZones.checked + writeAccessLevel: User.AccessUser + } + + MbSubMenu { + id: runtimePage + description: qsTr("Run time and service") + subpage: + Component { + PageGeneratorRuntimeService { + title: qsTr("Run time and service") + startStopBindPrefix: root.startStopBindPrefix + settingsBindPrefix: root.settingsBindPrefix + } + } + } + } +} diff --git a/FileSets/v3.20~42/PageSettingsGuiMods.qml b/FileSets/v3.30~1/PageSettingsGuiMods.qml similarity index 100% rename from FileSets/v3.20~42/PageSettingsGuiMods.qml rename to FileSets/v3.30~1/PageSettingsGuiMods.qml diff --git a/FileSets/v3.20~42/PageSettingsGuiMods.qml.orig b/FileSets/v3.30~1/PageSettingsGuiMods.qml.orig similarity index 100% rename from FileSets/v3.20~42/PageSettingsGuiMods.qml.orig rename to FileSets/v3.30~1/PageSettingsGuiMods.qml.orig diff --git a/FileSets/v3.30~1/PageSettingsRelay.qml b/FileSets/v3.30~1/PageSettingsRelay.qml new file mode 100644 index 00000000..1abc8a07 --- /dev/null +++ b/FileSets/v3.30~1/PageSettingsRelay.qml @@ -0,0 +1,243 @@ +//////// modified to +//////// add 6 relays for Raspberry PI +//////// custom relay name for Relay Overview +//////// show/hide relay in Relay Overview + +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: pageRelaySettings + title: qsTr("Relay") + property string bindPrefix: "com.victronenergy.settings" + property VBusItem relay1Item: VBusItem { bind: "com.victronenergy.system/Relay/1/State" } + property bool hasRelay1: relay1Item.valid + + property VBusItem relay2Item: VBusItem { bind: "com.victronenergy.system/Relay/2/State" } + property bool hasRelay2: relay2Item.valid + property VBusItem relay3Item: VBusItem { bind: "com.victronenergy.system/Relay/3/State" } + property bool hasRelay3: relay3Item.valid + property VBusItem relay4Item: VBusItem { bind: "com.victronenergy.system/Relay/4/State" } + property bool hasRelay4: relay4Item.valid + property VBusItem relay5Item: VBusItem { bind: "com.victronenergy.system/Relay/5/State" } + property bool hasRelay5: relay5Item.valid + + property VBusItem relay0NameItem: VBusItem { bind: Utils.path(bindPrefix, "/Settings/Relay/0/CustomName") } + property VBusItem relay1NameItem: VBusItem { bind: Utils.path(bindPrefix, "/Settings/Relay/1/CustomName") } + property VBusItem relay2NameItem: VBusItem { bind: Utils.path(bindPrefix, "/Settings/Relay/2/CustomName") } + property VBusItem relay3NameItem: VBusItem { bind: Utils.path(bindPrefix, "/Settings/Relay/3/CustomName") } + property VBusItem relay4NameItem: VBusItem { bind: Utils.path(bindPrefix, "/Settings/Relay/4/CustomName") } + property VBusItem relay5NameItem: VBusItem { bind: Utils.path(bindPrefix, "/Settings/Relay/5/CustomName") } + + function relayName (nameItem, relayNumber) + { + var prefix, suffix + if (nameItem.valid && nameItem.value != "") + { + prefix = nameItem.value + " (" + suffix = ")" + } + else + { + prefix = "" + suffix = "" + } + if (relayNumber == 1) + return prefix + (hasRelay1 ? qsTr("Relay 1") : qsTr("Relay")) + suffix + " " + qsTr("On") + else + return prefix + qsTr("Relay") + " " + relayNumber + suffix + " " + qsTr("On") + } + + model: VisibleItemModel { + MbItemOptions { + id: relayFunction + description: hasRelay1 ? qsTr("Function (Relay 1)") : qsTr("Function") + bind: Utils.path(bindPrefix, "/Settings/Relay/Function") + possibleValues:[ + MbOption { description: qsTr("Alarm relay"); value: 0 }, + MbOption { description: qsTr("Generator start/stop"); value: 1 }, + MbOption { description: qsTr("Tank pump"); value: 3 }, + MbOption { description: qsTr("Manual"); value: 2 }, + MbOption { description: qsTr("Temperature"); value: 4 } + ] + } + + MbItemOptions { + description: qsTr("Alarm relay polarity") + bind: Utils.path(bindPrefix, "/Settings/Relay/Polarity") + show: relayFunction.value === 0 + possibleValues: [ + MbOption { description: qsTr("Normally open"); value: 0 }, + MbOption { description: qsTr("Normally closed"); value: 1 } + ] + } + + MbSwitch { + id: relaySwitch + // Use a one-way binding, because the usual binding: + // checked: Relay.relayOn + // will be broken when the switched toggled, and changes in the relayOn property made + // elsewhere will not change the state of the switch any more. + Binding { + target: relaySwitch + property: "checked" + value: relay1Item.getValue() + when: true + } + enabled: userHasWriteAccess + name: qsTr("Alarm relay On") + onCheckedChanged: relay1Item.setValue(checked); + show: relayFunction.value === 0 + } + + MbSwitch { + id: manualSwitch + name: relayName (relay0NameItem, 1) + bind: "com.victronenergy.system/Relay/0/State" + show: relayFunction.value === 2 // manual mode + } + + MbItemOptions { + id: relay1Function + description: hasRelay1 ? qsTr("Function (Relay 2)") : qsTr("Function") + bind: Utils.path(bindPrefix, "/Settings/Relay/1/Function") + show: hasRelay1 + possibleValues:[ + MbOption { description: qsTr("Manual"); value: 2 }, + MbOption { description: qsTr("Temperature"); value: 4 } + ] + } + MbSwitch { + id: manualSwitch1 + name: relayName (relay1NameItem, 2) + bind: "com.victronenergy.system/Relay/1/State" + show: hasRelay1 && relay1Function.value === 2 + } + MbSwitch { + id: manualSwitch2 + name: relayName (relay2NameItem, 3) + bind: "com.victronenergy.system/Relay/2/State" + show: hasRelay2 + } + MbSwitch { + id: manualSwitch3 + name: relayName (relay3NameItem, 4) + bind: "com.victronenergy.system/Relay/3/State" + show: hasRelay3 + } + MbSwitch { + id: manualSwitch4 + name: relayName (relay4NameItem, 5) + bind: "com.victronenergy.system/Relay/4/State" + show: hasRelay4 + } + MbSwitch { + id: manualSwitch5 + name: relayName (relay5NameItem, 6) + bind: "com.victronenergy.system/Relay/5/State" + show: hasRelay5 + } + + MbSubMenu { + id: conditions + description: qsTr("Temperature control rules") + show: relayFunction.value === 4 || relay1Function.value === 4 + subpage: Component { + PageSettingsRelayTempSensors { + id: relayPage + title: qsTr("Temperature control rules") + } + } + } + + MbEditBox { + id: relay0name + description: qsTr("Relay 1 Name") + item.bind: "com.victronenergy.settings/Settings/Relay/0/CustomName" + show: item.valid && relayFunction.value === 2 // manual mode + maximumLength: 32 + enableSpaceBar: true + } + MbSwitch { + id: showRelay0 + name: qsTr("Show Relay 1 in overview") + bind: "com.victronenergy.settings/Settings/Relay/0/Show" + } + + MbEditBox { + id: relay1name + description: qsTr("Relay 2 Name") + item.bind: "com.victronenergy.settings/Settings/Relay/1/CustomName" + show: item.valid + maximumLength: 32 + enableSpaceBar: true + } + MbSwitch { + id: showRelay1 + name: qsTr("Show Relay 2 in overview") + bind: "com.victronenergy.settings/Settings/Relay/1/Show" + show: hasRelay1 + } + + MbEditBox { + id: relay2name + description: qsTr("Relay 3 Name") + item.bind: "com.victronenergy.settings/Settings/Relay/2/CustomName" + show: item.valid + maximumLength: 32 + enableSpaceBar: true + } + MbSwitch { + id: showRelay2 + name: qsTr("Show Relay 3 in overview") + bind: "com.victronenergy.settings/Settings/Relay/2/Show" + show: hasRelay2 + } + + MbEditBox { + id: relay3name + description: qsTr("Relay 4 Name") + item.bind: "com.victronenergy.settings/Settings/Relay/3/CustomName" + show: item.valid + maximumLength: 32 + enableSpaceBar: true + } + MbSwitch { + id: showRelay3 + name: qsTr("Show Relay 4 in overview") + bind: "com.victronenergy.settings/Settings/Relay/3/Show" + show: hasRelay3 + } + + MbEditBox { + id: relay4name + description: qsTr("Relay 5 Name") + item.bind: "com.victronenergy.settings/Settings/Relay/4/CustomName" + show: item.valid + maximumLength: 32 + enableSpaceBar: true + } + MbSwitch { + id: showRelay4 + name: qsTr("Show Relay 5 in overview") + bind: "com.victronenergy.settings/Settings/Relay/4/Show" + show: hasRelay4 + } + + MbEditBox { + id: relay5name + description: qsTr("Relay 6 Name") + item.bind: "com.victronenergy.settings/Settings/Relay/5/CustomName" + show: item.valid + maximumLength: 32 + enableSpaceBar: true + } + MbSwitch { + id: showRelay5 + name: qsTr("Show Relay 6 in overview") + bind: "com.victronenergy.settings/Settings/Relay/5/Show" + show: hasRelay5 + } + } +} diff --git a/FileSets/v3.30~1/PageSettingsRelay.qml.orig b/FileSets/v3.30~1/PageSettingsRelay.qml.orig new file mode 100644 index 00000000..d74dfa17 --- /dev/null +++ b/FileSets/v3.30~1/PageSettingsRelay.qml.orig @@ -0,0 +1,91 @@ +import QtQuick 1.1 +import com.victron.velib 1.0 +import "utils.js" as Utils + +MbPage { + id: pageRelaySettings + title: qsTr("Relay") + property string bindPrefix: "com.victronenergy.settings" + property VBusItem relay1Item: VBusItem { bind: "com.victronenergy.system/Relay/1/State" } + property bool hasRelay1: relay1Item.valid + + model: VisibleItemModel { + MbItemOptions { + id: relayFunction + description: hasRelay1 ? qsTr("Function (Relay 1)") : qsTr("Function") + bind: Utils.path(bindPrefix, "/Settings/Relay/Function") + possibleValues:[ + MbOption { description: qsTr("Alarm relay"); value: 0 }, + MbOption { description: qsTr("Generator start/stop"); value: 1 }, + MbOption { description: qsTr("Tank pump"); value: 3 }, + MbOption { description: qsTr("Manual"); value: 2 }, + MbOption { description: qsTr("Temperature"); value: 4 } + ] + } + + MbItemOptions { + description: qsTr("Alarm relay polarity") + bind: Utils.path(bindPrefix, "/Settings/Relay/Polarity") + show: relayFunction.value === 0 + possibleValues: [ + MbOption { description: qsTr("Normally open"); value: 0 }, + MbOption { description: qsTr("Normally closed"); value: 1 } + ] + } + + MbSwitch { + id: relaySwitch + // Use a one-way binding, because the usual binding: + // checked: Relay.relayOn + // will be broken when the switched toggled, and changes in the relayOn property made + // elsewhere will not change the state of the switch any more. + Binding { + target: relaySwitch + property: "checked" + value: relay1Item.getValue() + when: true + } + enabled: userHasWriteAccess + name: qsTr("Alarm relay On") + onCheckedChanged: relay1Item.setValue(checked); + show: relayFunction.value === 0 + } + + MbSwitch { + id: manualSwitch + name: hasRelay1 ? qsTr("Relay 1 On") : qsTr("Relay On") + bind: "com.victronenergy.system/Relay/0/State" + show: relayFunction.value === 2 // manual mode + } + + MbItemOptions { + id: relay1Function + description: hasRelay1 ? qsTr("Function (Relay 2)") : qsTr("Function") + bind: Utils.path(bindPrefix, "/Settings/Relay/1/Function") + show: hasRelay1 + possibleValues:[ + MbOption { description: qsTr("Manual"); value: 2 }, + MbOption { description: qsTr("Temperature"); value: 4 } + ] + } + + MbSwitch { + id: manualSwitch1 + name: qsTr("Relay 2 On") + bind: "com.victronenergy.system/Relay/1/State" + show: hasRelay1 && relay1Function.value === 2 // manual + } + + MbSubMenu { + id: conditions + description: qsTr("Temperature control rules") + show: relayFunction.value === 4 || relay1Function.value === 4 + subpage: Component { + PageSettingsRelayTempSensors { + id: relayPage + title: qsTr("Temperature control rules") + } + } + } + } +} diff --git a/FileSets/v3.20~42/PowerGauge.qml b/FileSets/v3.30~1/PowerGauge.qml similarity index 100% rename from FileSets/v3.20~42/PowerGauge.qml rename to FileSets/v3.30~1/PowerGauge.qml diff --git a/FileSets/v3.20~42/PowerGauge.qml.orig b/FileSets/v3.30~1/PowerGauge.qml.orig similarity index 100% rename from FileSets/v3.20~42/PowerGauge.qml.orig rename to FileSets/v3.30~1/PowerGauge.qml.orig diff --git a/FileSets/v3.20~42/Tile.qml b/FileSets/v3.30~1/Tile.qml similarity index 100% rename from FileSets/v3.20~42/Tile.qml rename to FileSets/v3.30~1/Tile.qml diff --git a/FileSets/v3.20~42/Tile.qml.orig b/FileSets/v3.30~1/Tile.qml.orig similarity index 100% rename from FileSets/v3.20~42/Tile.qml.orig rename to FileSets/v3.30~1/Tile.qml.orig diff --git a/FileSets/v3.20~42/TileDigIn.qml b/FileSets/v3.30~1/TileDigIn.qml similarity index 100% rename from FileSets/v3.20~42/TileDigIn.qml rename to FileSets/v3.30~1/TileDigIn.qml diff --git a/FileSets/v3.20~42/TileDigIn.qml.orig b/FileSets/v3.30~1/TileDigIn.qml.orig similarity index 100% rename from FileSets/v3.20~42/TileDigIn.qml.orig rename to FileSets/v3.30~1/TileDigIn.qml.orig diff --git a/FileSets/v3.20~42/TileRelay.qml b/FileSets/v3.30~1/TileRelay.qml similarity index 100% rename from FileSets/v3.20~42/TileRelay.qml rename to FileSets/v3.30~1/TileRelay.qml diff --git a/FileSets/v3.20~42/TileRelay.qml.orig b/FileSets/v3.30~1/TileRelay.qml.orig similarity index 100% rename from FileSets/v3.20~42/TileRelay.qml.orig rename to FileSets/v3.30~1/TileRelay.qml.orig diff --git a/FileSets/v3.20~42/TileText.qml b/FileSets/v3.30~1/TileText.qml similarity index 100% rename from FileSets/v3.20~42/TileText.qml rename to FileSets/v3.30~1/TileText.qml diff --git a/FileSets/v3.20~42/TileText.qml.orig b/FileSets/v3.30~1/TileText.qml.orig similarity index 100% rename from FileSets/v3.20~42/TileText.qml.orig rename to FileSets/v3.30~1/TileText.qml.orig diff --git a/FileSets/v3.30~1/attributes.csv b/FileSets/v3.30~1/attributes.csv new file mode 100644 index 00000000..7c9318b2 --- /dev/null +++ b/FileSets/v3.30~1/attributes.csv @@ -0,0 +1,720 @@ +com.victronenergy.gps,/Position/Latitude,d,Decimal degrees,2800,int32,10000000,R +com.victronenergy.gps,/Position/Longitude,d,Decimal degrees,2802,int32,10000000,R +com.victronenergy.gps,/Course,d,Degrees,2804,uint16,100,R +com.victronenergy.gps,/Speed,d,m/s,2805,uint16,100,R +com.victronenergy.gps,/Fix,y,,2806,uint16,1,R +com.victronenergy.gps,/NrOfSatellites,y,,2807,uint16,1,R +com.victronenergy.gps,/Altitude,d,m,2808,int32,10,R +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/State,i,0=BL disabled;1=Restarting;2=Self-consumption;3=Self-consumption;4=Self-consumption;5=Discharge disabled;6=Force charge;7=Sustain;9=Keep batteries charged;10=BL Disabled;11=BL Disabled (Low SoC),2900,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/MinimumSocLimit,d,%,2901,uint16,10,W +com.victronenergy.settings,/Settings/CGwacs/Hub4Mode,i,1=ESS with Phase Compensation;2=ESS without phase compensation;3=Disabled/External Control,2902,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/SocLimit,d,%,2903,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/V,d,V AC,3,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/V,d,V AC,4,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/V,d,V AC,5,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/I,d,A AC,6,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/I,d,A AC,7,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/I,d,A AC,8,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/F,d,Hz,9,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/F,d,Hz,10,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/F,d,Hz,11,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/P,i,VA or Watts,12,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/P,i,VA or Watts,13,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/P,i,VA or Watts,14,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L1/V,d,V AC,15,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L2/V,d,V AC,16,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L3/V,d,V AC,17,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L1/I,d,A AC,18,int16,10,R +com.victronenergy.vebus,/Ac/Out/L2/I,d,A AC,19,int16,10,R +com.victronenergy.vebus,/Ac/Out/L3/I,d,A AC,20,int16,10,R +com.victronenergy.vebus,/Ac/Out/L1/F,d,Hz,21,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/CurrentLimit,d,A,22,int16,10,W +com.victronenergy.vebus,/Ac/Out/L1/P,i,VA or Watts,23,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L2/P,i,VA or Watts,24,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L3/P,i,VA or Watts,25,int16,0.1,R +com.victronenergy.vebus,/Dc/0/Voltage,d,V DC,26,uint16,100,R +com.victronenergy.vebus,/Dc/0/Current,d,A DC,27,int16,10,R +com.victronenergy.vebus,/Ac/NumberOfPhases,u,count,28,uint16,1,R +com.victronenergy.vebus,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,29,uint16,1,R +com.victronenergy.vebus,/Soc,d,%,30,uint16,10,W +com.victronenergy.vebus,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=External control,31,uint16,1,R +com.victronenergy.vebus,/VebusError,u,0=No error;1=VE.Bus Error 1: Device is switched off because one of the other phases in the system has switched off;2=VE.Bus Error 2: New and old types MK2 are mixed in the system;3=VE.Bus Error 3: Not all- or more than- the expected devices were found in the system;4=VE.Bus Error 4: No other device whatsoever detected;5=VE.Bus Error 5: Overvoltage on AC-out;6=VE.Bus Error 6: Error in DDC Program;7=VE.Bus BMS connected- which requires an Assistant- but no assistant found;10=VE.Bus Error 10: System time synchronisation problem occurred;14=VE.Bus Error 14: Device cannot transmit data;16=VE.Bus Error 16: Dongle missing;17=VE.Bus Error 17: One of the devices assumed master status because the original master failed;18=VE.Bus Error 18: AC Overvoltage on the output of a slave has occurred while already switched off;22=VE.Bus Error 22: This device cannot function as slave;24=VE.Bus Error 24: Switch-over system protection initiated;25=VE.Bus Error 25: Firmware incompatibility. The firmware of one of the connected device is not sufficiently up to date to operate in conjunction with this device;26=VE.Bus Error 26: Internal error,32,uint16,1,R +com.victronenergy.vebus,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,33,uint16,1,W +com.victronenergy.vebus,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,34,uint16,1,R +com.victronenergy.vebus,/Alarms/LowBattery,u,0=Ok;1=Warning;2=Alarm,35,uint16,1,R +com.victronenergy.vebus,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,36,uint16,1,R +com.victronenergy.vebus,/Alarms/TemperatureSensor,u,0=Ok;1=Warning;2=Alarm,42,uint16,1,R +com.victronenergy.vebus,/Alarms/VoltageSensor,u,0=Ok;1=Warning;2=Alarm,43,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/HighTemperature,u,0=Ok;1=Warning;2=Alarm,44,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/LowBattery,u,0=Ok;1=Warning;2=Alarm,45,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Overload,u,0=Ok;1=Warning;2=Alarm,46,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Ripple,u,0=Ok;1=Warning;2=Alarm,47,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/HighTemperature,u,0=Ok;1=Warning;2=Alarm,48,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/LowBattery,u,0=Ok;1=Warning;2=Alarm,49,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Overload,u,0=Ok;1=Warning;2=Alarm,50,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Ripple,u,0=Ok;1=Warning;2=Alarm,51,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/HighTemperature,u,0=Ok;1=Warning;2=Alarm,52,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/LowBattery,u,0=Ok;1=Warning;2=Alarm,53,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Overload,u,0=Ok;1=Warning;2=Alarm,54,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Ripple,u,0=Ok;1=Warning;2=Alarm,55,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,37,int16,1,W +com.victronenergy.vebus,/Hub4/DisableCharge,u,0=Charge allowed;1=Charge disabled,38,uint16,1,W +com.victronenergy.vebus,/Hub4/DisableFeedIn,u,0=Feed in allowed;1=Feed in disabled,39,uint16,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,40,int16,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,41,int16,1,W +com.victronenergy.vebus,/PvInverter/Disable,u,0=PV enabled;1=PV disabled,56,uint16,1,W +com.victronenergy.vebus,/Bms/AllowToCharge,u,0=No;1=Yes,57,uint16,1,R +com.victronenergy.vebus,/Bms/AllowToDischarge,u,0=No;1=Yes,58,uint16,1,R +com.victronenergy.vebus,/Bms/BmsExpected,u,0=No;1=Yes,59,uint16,1,R +com.victronenergy.vebus,/Bms/Error,u,0=No;1=Yes,60,uint16,1,R +com.victronenergy.vebus,/Dc/0/Temperature,d,Degrees celsius,61,int16,10,R +com.victronenergy.vebus,/SystemReset,y,0=No action;1=VE.Bus Reset,62,uint16,1,W +com.victronenergy.vebus,/Alarms/PhaseRotation,u,0=Ok;1=Warning,63,uint16,1,R +com.victronenergy.vebus,/Alarms/GridLost,i,0=No alarm;2=Alarm,64,uint16,1,R +com.victronenergy.vebus,/Alarms/BmsPreAlarm,u,0=OK;1=Pre-Alarm,94,uint16,1,R +com.victronenergy.vebus,/Hub4/DoNotFeedInOvervoltage,i,0=Feed in overvoltage;1=Don't feed in overvoltage,65,uint16,1,W +com.victronenergy.vebus,/Hub4/L1/MaxFeedInPower,d,W,66,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L2/MaxFeedInPower,d,W,67,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L3/MaxFeedInPower,d,W,68,uint16,0.01,W +com.victronenergy.vebus,/Ac/State/IgnoreAcIn1,i,0=AC input not ignored; 1=AC input ignored,69,uint16,1,R +com.victronenergy.vebus,/Ac/State/IgnoreAcIn2,i,0=AC input not ignored; 1=AC input ignored,70,uint16,1,R +com.victronenergy.vebus,/Hub4/TargetPowerIsMaxFeedIn,i,0=AcPowerSetpoint interpreted normally; 1=AcPowerSetpoint as OvervoltageFeedIn limit,71,uint16,,W +com.victronenergy.vebus,/Hub4/FixSolarOffsetTo100mV,i,0=OvervoltageFeedIn uses 1V offset; 1=OvervoltageFeedIn uses 0.1V offset,72,uint16,,W +com.victronenergy.vebus,/Hub4/Sustain,i,0=Sustain inactive; 1=Sustain active,73,uint16,1,R +com.victronenergy.vebus,/Energy/AcIn1ToAcOut,d,kWh,74,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn1ToInverter,d,kWh,76,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToAcOut,d,kWh,78,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToInverter,d,kWh,80,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn1,d,kWh,82,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn2,d,kWh,84,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn1,d,kWh,86,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn2,d,kWh,88,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcOut,d,kWh,90,uint32,100,R +com.victronenergy.vebus,/Energy/OutToInverter,d,kWh,92,uint32,100,R +com.victronenergy.vebus,/VebusChargeState,u,0=Initialising;1=Bulk;2=Absorption;3=Float;4=Storage;5=Absorb repeat;6=Forced absorb;7=Equalise;8=Bulk stopped;9=Unknown,95,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,96,int32,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,98,int32,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,100,int32,1,W +com.victronenergy.vebus,/Dc/0/PreferRenewableEnergy,i,0=Not preferred;1=Preferred,102,uint16,1,W +com.victronenergy.vebus,/Ac/Control/RemoteGeneratorSelected,i,0=Generator not selected;1=Generator selected,103,uint16,1,W +com.victronenergy.vebus,/Ac/State/RemoteGeneratorSelected,i,0=Generator not selected;1=Generator selected,104,uint16,1,R +com.victronenergy.vebus,RESERVED,d,,105,reserved[1],1,R +com.victronenergy.vebus,/Devices/0/Settings/AssistCurrentBoostFactor,d,,106,uint16,100,W +com.victronenergy.vebus,/Devices/1/Settings/AssistCurrentBoostFactor,d,,107,uint16,100,W +com.victronenergy.vebus,/Devices/2/Settings/AssistCurrentBoostFactor,d,,108,uint16,100,W +com.victronenergy.vebus,/Devices/3/Settings/AssistCurrentBoostFactor,d,,109,uint16,100,W +com.victronenergy.vebus,/Devices/4/Settings/AssistCurrentBoostFactor,d,,110,uint16,100,W +com.victronenergy.vebus,/Devices/5/Settings/AssistCurrentBoostFactor,d,,111,uint16,100,W +com.victronenergy.vebus,/Devices/6/Settings/AssistCurrentBoostFactor,d,,112,uint16,100,W +com.victronenergy.vebus,/Devices/7/Settings/AssistCurrentBoostFactor,d,,113,uint16,100,W +com.victronenergy.vebus,/Devices/8/Settings/AssistCurrentBoostFactor,d,,114,uint16,100,W +com.victronenergy.vebus,/Devices/9/Settings/AssistCurrentBoostFactor,d,,115,uint16,100,W +com.victronenergy.vebus,/Devices/10/Settings/AssistCurrentBoostFactor,d,,116,uint16,100,W +com.victronenergy.vebus,/Devices/11/Settings/AssistCurrentBoostFactor,d,,117,uint16,100,W +com.victronenergy.vebus,/Devices/0/Settings/InverterOutputVoltage,d,V AC,118,uint16,100,W +com.victronenergy.vebus,/Devices/1/Settings/InverterOutputVoltage,d,V AC,119,uint16,100,W +com.victronenergy.vebus,/Devices/2/Settings/InverterOutputVoltage,d,V AC,120,uint16,100,W +com.victronenergy.vebus,/Devices/3/Settings/InverterOutputVoltage,d,V AC,121,uint16,100,W +com.victronenergy.vebus,/Devices/4/Settings/InverterOutputVoltage,d,V AC,122,uint16,100,W +com.victronenergy.vebus,/Devices/5/Settings/InverterOutputVoltage,d,V AC,123,uint16,100,W +com.victronenergy.vebus,/Devices/6/Settings/InverterOutputVoltage,d,V AC,124,uint16,100,W +com.victronenergy.vebus,/Devices/7/Settings/InverterOutputVoltage,d,V AC,125,uint16,100,W +com.victronenergy.vebus,/Devices/8/Settings/InverterOutputVoltage,d,V AC,126,uint16,100,W +com.victronenergy.vebus,/Devices/9/Settings/InverterOutputVoltage,d,V AC,127,uint16,100,W +com.victronenergy.vebus,/Devices/10/Settings/InverterOutputVoltage,d,V AC,128,uint16,100,W +com.victronenergy.vebus,/Devices/11/Settings/InverterOutputVoltage,d,V AC,129,uint16,100,W +com.victronenergy.vebus,/Devices/0/Settings/PowerAssistEnabled,d,,130,uint16,1,R +com.victronenergy.vebus,/Devices/1/Settings/PowerAssistEnabled,d,,131,uint16,1,R +com.victronenergy.vebus,/Devices/2/Settings/PowerAssistEnabled,d,,132,uint16,1,R +com.victronenergy.vebus,/Devices/3/Settings/PowerAssistEnabled,d,,133,uint16,1,R +com.victronenergy.vebus,/Devices/4/Settings/PowerAssistEnabled,d,,134,uint16,1,R +com.victronenergy.vebus,/Devices/5/Settings/PowerAssistEnabled,d,,135,uint16,1,R +com.victronenergy.vebus,/Devices/6/Settings/PowerAssistEnabled,d,,136,uint16,1,R +com.victronenergy.vebus,/Devices/7/Settings/PowerAssistEnabled,d,,137,uint16,1,R +com.victronenergy.vebus,/Devices/8/Settings/PowerAssistEnabled,d,,138,uint16,1,R +com.victronenergy.vebus,/Devices/9/Settings/PowerAssistEnabled,d,,139,uint16,1,R +com.victronenergy.vebus,/Devices/10/Settings/PowerAssistEnabled,d,,140,uint16,1,R +com.victronenergy.vebus,/Devices/11/Settings/PowerAssistEnabled,d,,141,uint16,1,R +com.victronenergy.battery,/Dc/0/Power,i,W,258,int16,1,R +com.victronenergy.battery,/Dc/0/Voltage,d,V DC,259,uint16,100,R +com.victronenergy.battery,/Dc/1/Voltage,d,V DC,260,uint16,100,R +com.victronenergy.battery,/Dc/0/Current,d,A DC,261,int16,10,R +com.victronenergy.battery,/Dc/0/Temperature,d,Degrees celsius,262,int16,10,R +com.victronenergy.battery,/Dc/0/MidVoltage,d,V DC,263,uint16,100,R +com.victronenergy.battery,/Dc/0/MidVoltageDeviation,d,%,264,uint16,100,R +com.victronenergy.battery,/ConsumedAmphours,d,Ah,265,uint16,-10,R +com.victronenergy.battery,/Soc,y,%,266,uint16,10,R +com.victronenergy.battery,/Soh,y,%,304,uint16,10,R +com.victronenergy.battery,/TimeToGo,q,seconds,303,uint16,0.01,R +com.victronenergy.battery,/Info/MaxChargeVoltage,u,V DC,305,uint16,10,R +com.victronenergy.battery,/Info/BatteryLowVoltage,u,V DC,306,uint16,10,R +com.victronenergy.battery,/Info/MaxChargeCurrent,u,A DC,307,uint16,10,R +com.victronenergy.battery,/Info/MaxDischargeCurrent,u,A DC,308,uint16,10,R +com.victronenergy.battery,/Alarms/Alarm,y,0=No alarm;2=Alarm,267,uint16,1,R +com.victronenergy.battery,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,268,uint16,1,R +com.victronenergy.battery,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,269,uint16,1,R +com.victronenergy.battery,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,270,uint16,1,R +com.victronenergy.battery,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,271,uint16,1,R +com.victronenergy.battery,/Alarms/LowSoc,u,0=No alarm;2=Alarm,272,uint16,1,R +com.victronenergy.battery,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,273,uint16,1,R +com.victronenergy.battery,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,274,uint16,1,R +com.victronenergy.battery,/Alarms/MidVoltage,u,0=No alarm;2=Alarm,275,uint16,1,R +com.victronenergy.battery,/Alarms/LowFusedVoltage,u,0=No alarm;2=Alarm,276,uint16,1,R +com.victronenergy.battery,/Alarms/HighFusedVoltage,u,0=No alarm;2=Alarm,277,uint16,1,R +com.victronenergy.battery,/Alarms/FuseBlown,u,0=No alarm;2=Alarm,278,uint16,1,R +com.victronenergy.battery,/Alarms/HighInternalTemperature,u,0=No alarm;2=Alarm,279,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeCurrent,u,0=No alarm;2=Alarm,320,uint16,1,R +com.victronenergy.battery,/Alarms/HighDischargeCurrent,u,0=No alarm;2=Alarm,321,uint16,1,R +com.victronenergy.battery,/Alarms/CellImbalance,u,0=No alarm;2=Alarm,322,uint16,1,R +com.victronenergy.battery,/Alarms/InternalFailure,u,0=No alarm;2=Alarm,323,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeTemperature,u,0=No alarm;2=Alarm,324,uint16,1,R +com.victronenergy.battery,/Alarms/LowChargeTemperature,u,0=No alarm;2=Alarm,325,uint16,1,R +com.victronenergy.battery,/Alarms/LowCellVoltage,u,0=No alarm;1=Almost discharged;2=Alarm,326,uint16,1,R +com.victronenergy.battery,/Relay/0/State,y,0=Open;1=Closed,280,uint16,1,W +com.victronenergy.battery,/History/DeepestDischarge,d,Ah,281,uint16,-10,R +com.victronenergy.battery,/History/LastDischarge,d,Ah,282,uint16,-10,R +com.victronenergy.battery,/History/AverageDischarge,d,Ah,283,uint16,-10,R +com.victronenergy.battery,/History/ChargeCycles,i,count,284,uint16,1,R +com.victronenergy.battery,/History/FullDischarges,i,count,285,uint16,1,R +com.victronenergy.battery,/History/TotalAhDrawn,d,Ah,286,uint16,-10,R +com.victronenergy.battery,/History/MinimumVoltage,d,V DC,287,uint16,100,R +com.victronenergy.battery,/History/MaximumVoltage,d,V DC,288,uint16,100,R +com.victronenergy.battery,/History/TimeSinceLastFullCharge,i,seconds,289,uint16,0.01,R +com.victronenergy.battery,/History/AutomaticSyncs,i,count,290,uint16,1,R +com.victronenergy.battery,/History/LowVoltageAlarms,i,count,291,uint16,1,R +com.victronenergy.battery,/History/HighVoltageAlarms,i,count,292,uint16,1,R +com.victronenergy.battery,/History/LowStarterVoltageAlarms,i,count,293,uint16,1,R +com.victronenergy.battery,/History/HighStarterVoltageAlarms,i,count,294,uint16,1,R +com.victronenergy.battery,/History/MinimumStarterVoltage,d,V DC,295,uint16,100,R +com.victronenergy.battery,/History/MaximumStarterVoltage,d,V DC,296,uint16,100,R +com.victronenergy.battery,/History/LowFusedVoltageAlarms,i,count,297,uint16,1,R +com.victronenergy.battery,/History/HighFusedVoltageAlarms,i,count,298,uint16,1,R +com.victronenergy.battery,/History/MinimumFusedVoltage,d,V DC,299,uint16,100,R +com.victronenergy.battery,/History/MaximumFusedVoltage,d,V DC,300,uint16,100,R +com.victronenergy.battery,/History/DischargedEnergy,d,kWh,301,uint16,10,R +com.victronenergy.battery,/History/ChargedEnergy,d,kWh,302,uint16,10,R +com.victronenergy.battery,/Capacity,d,Ah,309,uint16,10,R +com.victronenergy.battery,/State,y,0=Initializing (Wait start);1=Initializing (before boot);2=Initializing (Before boot delay);3=Initializing (Wait boot);4=Initializing;5=Initializing (Measure battery voltage);6=Initializing (Calculate battery voltage);7=Initializing (Wait bus voltage);8=Initializing (Wait for lynx shunt);9=Running;10=Error;11=Unused;12=Shutdown;13=Slave updating;14=Standby;15=Going to run;16=Per-charging;17=Contactor check,1282,uint16,1,R +com.victronenergy.battery,/ErrorCode,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1283,uint16,1,R +com.victronenergy.battery,/SystemSwitch,y,0=Disabled;1=Enabled,1284,uint16,1,R +com.victronenergy.battery,/Balancing,y,0=Inactive;1=Active,1285,uint16,1,R +com.victronenergy.battery,/System/NrOfBatteries,y,count,1286,uint16,1,R +com.victronenergy.battery,/System/BatteriesParallel,y,count,1287,uint16,1,R +com.victronenergy.battery,/System/BatteriesSeries,y,count,1288,uint16,1,R +com.victronenergy.battery,/System/NrOfCellsPerBattery,y,count,1289,uint16,1,R +com.victronenergy.battery,/System/MinCellVoltage,d,V DC,1290,uint16,100,R +com.victronenergy.battery,/System/MaxCellVoltage,d,V DC,1291,uint16,100,R +com.victronenergy.battery,/Diagnostics/ShutDownsDueError,q,count,1292,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1293,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1294,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1295,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1296,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Time,u,,310,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Time,u,,312,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Time,u,,314,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Time,u,,316,int32,1,R +com.victronenergy.battery,/System/MinCellTemperature,d,Degrees celsius,318,int16,10,R +com.victronenergy.battery,/System/MaxCellTemperature,d,Degrees celsius,319,int16,10,R +com.victronenergy.battery,/Io/AllowToCharge,y,0=No;1=Yes,1297,uint16,1,R +com.victronenergy.battery,/Io/AllowToDischarge,y,0=No;1=Yes,1298,uint16,1,R +com.victronenergy.battery,/Io/ExternalRelay,y,0=Inactive;1=Active,1299,uint16,1,R +com.victronenergy.battery,/History/MinimumCellVoltage,d,V DC,1300,uint16,100,R +com.victronenergy.battery,/History/MaximumCellVoltage,d,V DC,1301,uint16,100,R +com.victronenergy.battery,/System/NrOfModulesOffline,u,,1302,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesOnline,u,,1303,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingCharge,u,,1304,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingDischarge,u,,1305,uint16,1,R +com.victronenergy.battery,/System/MinVoltageCellId,s,,1306,string[4],1,R +com.victronenergy.battery,/System/MaxVoltageCellId,s,,1310,string[4],1,R +com.victronenergy.battery,/System/MinTemperatureCellId,s,,1314,string[4],1,R +com.victronenergy.battery,/System/MaxTemperatureCellId,s,,1318,string[4],1,R +com.victronenergy.battery,/Mode,i,3=On;252=Standby,1319,uint16,1,W +com.victronenergy.solarcharger,/Dc/0/Voltage,d,V DC,771,uint16,100,R +com.victronenergy.solarcharger,/Dc/0/Current,d,A DC,772,int16,10,R +com.victronenergy.solarcharger,/Dc/0/Temperature,d,Degrees celsius,773,int16,10,R +com.victronenergy.solarcharger,/Mode,i,1=On;4=Off,774,uint16,1,W +com.victronenergy.solarcharger,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;11=Other (Hub-1);252=Hub-1,775,uint16,1,R +com.victronenergy.solarcharger,/Pv/V,d,V DC,776,uint16,100,R +com.victronenergy.solarcharger,/Pv/I,d,A DC,777,INTERNAL,10,R +com.victronenergy.solarcharger,/Yield/Power,d,W,789,uint16,10,R +com.victronenergy.solarcharger,/Equalization/Pending,i,0=No;1=Yes;2=Error;3=Unavailable- Unknown,778,uint16,1,R +com.victronenergy.solarcharger,/Equalization/TimeRemaining,d,seconds,779,uint16,10,R +com.victronenergy.solarcharger,/Relay/0/State,i,0=Open;1=Closed,780,uint16,1,R +com.victronenergy.solarcharger,/Alarms/Alarm,i,0=No alarm;2=Alarm,781,uint16,1,R +com.victronenergy.solarcharger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,782,uint16,1,R +com.victronenergy.solarcharger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,783,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Yield,d,kWh,784,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/MaxPower,d,W,785,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Yield,d,kWh,786,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/MaxPower,d,W,787,uint16,1,R +com.victronenergy.solarcharger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,788,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,790,uint16,10,R +com.victronenergy.solarcharger,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,791,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/V,d,V DC,3700,uint16,100,R +com.victronenergy.solarcharger,/Pv/1/V,d,V DC,3701,uint16,100,R +com.victronenergy.solarcharger,/Pv/2/V,d,V DC,3702,uint16,100,R +com.victronenergy.solarcharger,/Pv/3/V,d,V DC,3703,uint16,100,R +com.victronenergy.solarcharger,RESERVED,d,,3704,reserved[4],1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/Yield,d,kWh,3708,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/Yield,d,kWh,3709,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/Yield,d,kWh,3710,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/Yield,d,kWh,3711,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/Yield,d,kWh,3712,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/Yield,d,kWh,3713,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/Yield,d,kWh,3714,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/Yield,d,kWh,3715,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/MaxPower,d,W,3716,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/MaxPower,d,W,3717,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/MaxPower,d,W,3718,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/MaxPower,d,W,3719,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/MaxPower,d,W,3720,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/MaxPower,d,W,3721,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/MaxPower,d,W,3722,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/MaxPower,d,W,3723,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/P,d,W,3724,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/P,d,W,3725,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/P,d,W,3726,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/P,d,W,3727,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,3728,uint32,1,R +com.victronenergy.solarcharger,/Yield/Power,d,W,3730,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3731,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3732,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3733,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3734,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L1/Power,d,W,808,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L2/Power,d,W,809,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L3/Power,d,W,810,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L1/Power,d,W,811,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L2/Power,d,W,812,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L3/Power,d,W,813,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L1/Power,d,W,814,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L2/Power,d,W,815,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L3/Power,d,W,816,uint16,1,R +com.victronenergy.system,/Dc/Pv/Power,d,W,850,uint16,1,R +com.victronenergy.system,/Dc/Pv/Current,d,A DC,851,int16,10,R +com.victronenergy.system,/Dc/Charger/Power,d,W,855,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L1/Power,d,W,817,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L2/Power,d,W,818,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L3/Power,d,W,819,uint16,1,R +com.victronenergy.system,/Ac/Grid/L1/Power,d,W,820,int16,1,R +com.victronenergy.system,/Ac/Grid/L2/Power,d,W,821,int16,1,R +com.victronenergy.system,/Ac/Grid/L3/Power,d,W,822,int16,1,R +com.victronenergy.system,/Ac/Genset/L1/Power,d,W,823,int16,1,R +com.victronenergy.system,/Ac/Genset/L2/Power,d,W,824,int16,1,R +com.victronenergy.system,/Ac/Genset/L3/Power,d,W,825,int16,1,R +com.victronenergy.system,/Ac/ActiveIn/Source,u,0=Not available;1=Grid;2=Generator;3=Shore power;240=Not connected,826,int16,1,R +com.victronenergy.system,RESERVED,d,,827,reserved[3],1,R +com.victronenergy.system,/DateAndTime,d,A DC,830,INTERNAL,1,R +com.victronenergy.system,RESERVED,d,,834,reserved[6],1,R +com.victronenergy.system,/Dc/System/Power,d,W,860,int16,1,R +com.victronenergy.system,/Dc/Battery/Voltage,d,V DC,840,uint16,10,R +com.victronenergy.system,/Dc/Battery/Current,d,A DC,841,int16,10,R +com.victronenergy.system,/Dc/Battery/Power,d,W,842,int16,1,R +com.victronenergy.system,/Dc/Vebus/Current,d,A DC,865,int16,10,R +com.victronenergy.system,/Dc/Vebus/Power,d,W,866,int16,1,R +com.victronenergy.system,/Dc/Battery/Soc,d,%,843,uint16,1,R +com.victronenergy.system,/Dc/Battery/State,i,0=idle;1=charging;2=discharging,844,uint16,1,R +com.victronenergy.system,/Dc/Battery/ConsumedAmphours,d,Ah,845,uint16,-10,R +com.victronenergy.system,/Dc/Battery/TimeToGo,d,s,846,uint16,0.01,R +com.victronenergy.system,/Relay/0/State,i,0=Open;1=Closed,806,uint16,1,W +com.victronenergy.system,/Relay/1/State,i,0=Open;1=Closed,807,uint16,1,W +com.victronenergy.system,/Serial,s,,800,string[6],1,R +com.victronenergy.pvinverter,/Position,i,0=AC input 1;1=AC output;2=AC input 2,1026,uint16,1,R +com.victronenergy.pvinverter,/Serial,s,,1039,string[7],1,R +com.victronenergy.pvinverter,/Ac/L1/Voltage,d,V AC,1027,uint16,10,R +com.victronenergy.pvinverter,/Ac/L1/Current,d,A AC,1028,int16,10,R +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1029,uint16,1,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1030,uint16,100,R +com.victronenergy.pvinverter,/Ac/L2/Voltage,d,V AC,1031,uint16,10,R +com.victronenergy.pvinverter,/Ac/L2/Current,d,A AC,1032,int16,10,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1033,uint16,1,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1034,uint16,100,R +com.victronenergy.pvinverter,/Ac/L3/Voltage,d,V AC,1035,uint16,10,R +com.victronenergy.pvinverter,/Ac/L3/Current,d,A AC,1036,int16,10,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1037,uint16,1,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1038,uint16,100,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1046,uint32,100,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1048,uint32,100,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1050,uint32,100,R +com.victronenergy.pvinverter,/Ac/Power,i,kW,1052,int32,1,W +com.victronenergy.pvinverter,/Ac/MaxPower,u,kW,1054,uint32,1,W +com.victronenergy.pvinverter,/Ac/PowerLimit,u,kW,1056,uint32,1,W +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1058,uint32,1,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1060,uint32,1,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1062,uint32,1,R +com.victronenergy.motordrive,/Motor/RPM,d,RPM,2048,int16,1,R +com.victronenergy.motordrive,/Motor/Temperature,d,Degrees celsius,2049,int16,10,R +com.victronenergy.motordrive,/Dc/0/Voltage,d,V DC,2050,uint16,100,R +com.victronenergy.motordrive,/Dc/0/Current,d,A DC,2051,int16,10,R +com.victronenergy.motordrive,/Dc/0/Power,d,W,2052,int16,10,R +com.victronenergy.motordrive,/Controller/Temperature,d,Degrees celsius,2053,int16,10,R +com.victronenergy.charger,/Dc/0/Voltage,d,V DC,2307,uint16,100,R +com.victronenergy.charger,/Dc/0/Current,d,A DC,2308,int16,10,R +com.victronenergy.charger,/Dc/0/Temperature,d,Degrees celsius,2309,int16,10,R +com.victronenergy.charger,/Dc/1/Voltage,d,V DC,2310,uint16,100,R +com.victronenergy.charger,/Dc/1/Current,d,A DC,2311,int16,10,R +com.victronenergy.charger,/Dc/2/Voltage,d,V DC,2312,uint16,100,R +com.victronenergy.charger,/Dc/2/Current,d,A DC,2313,int16,10,R +com.victronenergy.charger,/Ac/In/L1/I,d,A AC,2314,int16,10,R +com.victronenergy.charger,/Ac/In/L1/P,d,W DC,2315,uint16,1,R +com.victronenergy.charger,/Ac/In/CurrentLimit,d,A AC,2316,int16,10,W +com.victronenergy.charger,/Mode,i,0=Off;1=On;2=Error;3=Unavailable- Unknown,2317,uint16,1,W +com.victronenergy.charger,/State,i,0=Off;1=Low Power Mode;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply mode;252=External control,2318,uint16,1,R +com.victronenergy.charger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,2319,uint16,1,R +com.victronenergy.charger,/Relay/0/State,i,0=Open;1=Closed,2320,uint16,1,R +com.victronenergy.charger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,2321,uint16,1,R +com.victronenergy.charger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,2322,uint16,1,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2600,int16,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2601,int16,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2602,int16,1,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2603,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2604,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2605,uint16,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2606,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2607,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2608,uint16,100,R +com.victronenergy.grid,/Serial,s,,2609,string[7],,R +com.victronenergy.grid,/Ac/L1/Voltage,d,V AC,2616,uint16,10,R +com.victronenergy.grid,/Ac/L1/Current,d,A AC,2617,int16,10,R +com.victronenergy.grid,/Ac/L2/Voltage,d,V AC,2618,uint16,10,R +com.victronenergy.grid,/Ac/L2/Current,d,A AC,2619,int16,10,R +com.victronenergy.grid,/Ac/L3/Voltage,d,V AC,2620,uint16,10,R +com.victronenergy.grid,/Ac/L3/Current,d,A AC,2621,int16,10,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2622,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2624,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2626,uint32,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2628,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2630,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2632,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Forward,d,kWh,2634,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Reverse,d,kWh,2636,uint32,100,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2638,int32,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2640,int32,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2642,int32,1,R +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2700,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2703,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/MaxChargePercentage,d,%,2701,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePercentage,d,%,2702,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePower,d,W,2704,int16,0.1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeCurrent,d,A,2705,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxFeedInPower,d,W,2706,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/OvervoltageFeedIn,i,0=Don't feed excess DC-coupled PV into grid;1=Feed excess DC-coupled PV into the grid,2707,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/PreventFeedback,i,0=Feed excess AC-coupled PV into grid;1=Don't feed excess AC-coupled PV into the grid,2708,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeVoltage,d,V,2710,uint16,10,W +com.victronenergy.settings,/Settings/SystemSetup/AcInput1,u,0=Unused;1=Grid;2=Genset;3=Shore,2711,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/AcInput2,u,0=Unused;1=Grid;2=Genset;3=Shore,2712,uint16,1,W +com.victronenergy.hub4,/PvPowerLimiterActive,i,0=Feed-in limiting inactive;1=Feed-in limiting active,2709,uint16,1,R +com.victronenergy.tank,/ProductId,u,,3000,uint16,1,R +com.victronenergy.tank,/Capacity,d,m3,3001,uint32,10000,R +com.victronenergy.tank,/FluidType,u,0=Fuel;1=Fresh water;2=Waste water;3=Live well;4=Oil;5=Black water (sewage);6=Gasoline;7=Diesel;8=LPG;9=LNG;10=Hydraulic oil;11=Raw water,3003,uint16,1,R +com.victronenergy.tank,/Level,d,%,3004,uint16,10,R +com.victronenergy.tank,/Remaining,d,m3,3005,uint32,10000,R +com.victronenergy.tank,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3007,uint16,1,R +com.victronenergy.inverter,/ProductId,u,,3127,uint16,1,R +com.victronenergy.inverter,/FirmwareVersion,u,,3125,uint16,1,R +com.victronenergy.inverter,/Ac/Out/L1/I,d,A AC,3100,int16,10,R +com.victronenergy.inverter,/Ac/Out/L1/V,d,V AC,3101,uint16,10,R +com.victronenergy.inverter,/Ac/Out/L1/P,d,W AC,3102,int16,0.1,R +com.victronenergy.inverter,/Alarms/HighTemperature,u,0=No alarm;1=Warning;2=Alarm,3110,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltage,u,0=No alarm;1=Warning;2=Alarm,3111,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3112,uint16,1,R +com.victronenergy.inverter,/Alarms/LowTemperature,u,0=No alarm;1=Warning;2=Alarm,3113,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltage,u,0=No alarm;1=Warning;2=Alarm,3114,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3115,uint16,1,R +com.victronenergy.inverter,/Alarms/Overload,u,0=No alarm;1=Warning;2=Alarm,3116,uint16,1,R +com.victronenergy.inverter,/Alarms/Ripple,u,0=No alarm;1=Warning;2=Alarm,3117,uint16,1,R +com.victronenergy.inverter,/Dc/0/Voltage,d,V DC,3105,uint16,100,R +com.victronenergy.inverter,/Dc/0/Current,d,A DC,3106,int16,10,R +com.victronenergy.inverter,/Mode,u,2=On;4=Off;5=Eco,3126,uint16,1,W +com.victronenergy.inverter,/State,u,0=Off;1=Low power mode (search mode);2=Fault;9=Inverting (on),3128,uint16,1,R +com.victronenergy.inverter,/Energy/InverterToAcOut,d,kWh,3130,uint32,100,R +com.victronenergy.inverter,/Energy/OutToInverter,d,kWh,3132,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToAcOut,d,kWh,3134,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToBattery,d,kWh,3136,uint32,100,R +com.victronenergy.inverter,/Pv/V,d,V DC,3138,uint16,10,R +com.victronenergy.inverter,/Pv/0/V,d,V DC,3140,uint16,10,R +com.victronenergy.inverter,/Pv/1/V,d,V DC,3141,uint16,10,R +com.victronenergy.inverter,/Pv/2/V,d,V DC,3142,uint16,10,R +com.victronenergy.inverter,/Pv/3/V,d,V DC,3143,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/Yield,d,kWh,3148,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/Yield,d,kWh,3149,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/Yield,d,kWh,3150,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/Yield,d,kWh,3151,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/Yield,d,kWh,3152,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/Yield,d,kWh,3153,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/Yield,d,kWh,3154,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/Yield,d,kWh,3155,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/MaxPower,d,W,3156,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/MaxPower,d,W,3157,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/MaxPower,d,W,3158,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/MaxPower,d,W,3159,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/MaxPower,d,W,3160,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/MaxPower,d,W,3161,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/MaxPower,d,W,3162,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/MaxPower,d,W,3163,uint16,1,R +com.victronenergy.inverter,/Pv/0/P,d,W,3164,uint16,1,R +com.victronenergy.inverter,/Pv/1/P,d,W,3165,uint16,1,R +com.victronenergy.inverter,/Pv/2/P,d,W,3166,uint16,1,R +com.victronenergy.inverter,/Pv/3/P,d,W,3167,uint16,1,R +com.victronenergy.inverter,/Alarms/LowSoc,u,,3168,uint16,1,R +com.victronenergy.inverter,/Pv/0/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3169,uint16,1,R +com.victronenergy.inverter,/Pv/1/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3170,uint16,1,R +com.victronenergy.inverter,/Pv/2/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3171,uint16,1,R +com.victronenergy.inverter,/Pv/3/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3172,uint16,1,R +com.victronenergy.genset,/ProductId,u,,3212,uint16,1,R +com.victronenergy.genset,/StatusCode,u,0=Standby;1=Startup 1;2=Startup 2;3=Startup 3;4=Startup 4;5=Startup 5;6=Startup 6;7=Startup 7;8=Running;9=Stopping;10=Error,3213,uint16,1,R +com.victronenergy.genset,/ErrorCode,u,0=No error;1=AC voltage L1 too low;2=AC frequency L1 too low;3=AC current too low;4=AC power too low;5=Emergency stop;6=Servo current too low;7=Oil pressure too low;8=Engine temperature too low;9=Winding temperature too low;10=Exhaust temperature too low;13=Starter current too low;14=Glow current too low;15=Glow current too low;16=Fuel holding magnet current too low;17=Stop solenoid hold coil current too low;18=Stop solenoid pull coil current too low;19=Optional DC out current too low;20=5V output voltage too low;21=Boost output current too low;22=Panel supply current too high;25=Starter battery voltage too low;26=Startup aborted (rotation too low);28=Rotation too low;29=Power contactor current too low;30=AC voltage L2 too low;31=AC frequency L2 too low;32=AC current L2 too low;33=AC power L2 too low;34=AC voltage L3 too low;35=AC frequency L3 too low;36=AC current L3 too low;37=AC power L3 too low;62=Fuel temperature too low;63=Fuel level too low;65=AC voltage L1 too high;66=AC frequency too high;67=AC current too high;68=AC power too high;70=Servo current too high;71=Oil pressure too high;72=Engine temperature too high;73=Winding temperature too high;74=Exhaust temperature too low;77=Starter current too low;78=Glow current too high;79=Glow current too high;80=Fuel holding magnet current too high;81=Stop solenoid hold coil current too high;82=Stop solenoid pull coil current too high;83=Optional DC out current too high;84=5V output voltage too high;85=Boost output current too high;89=Starter battery voltage too high;90=Startup aborted (rotation too high);92=Rotation too high;93=Power contactor current too high;94=AC voltage L2 too high;95=AC frequency L2 too high;96=AC current L2 too high;97=AC power L2 too high;98=AC voltage L3 too high;99=AC frequency L3 too high;100=AC current L3 too high;101=AC power L3 too high;126=Fuel temperature too high;127=Fuel level too high;130=Lost control unit;131=Lost panel;132=Service needed;133=Lost 3-phase module;134=Lost AGT module;135=Synchronization failure;137=Intake airfilter;139=Lost sync. module;140=Load-balance failed;141=Sync-mode deactivated;142=Engine controller;148=Rotating field wrong;149=Fuel level sensor lost;150=Init failed;151=Watchdog;152=Out: winding;153=Out: exhaust;154=Out: Cyl. head;155=Inverter over temperature;156=Inverter overload;157=Inverter communication lost;158=Inverter sync failed;159=CAN communication lost;160=L1 overload;161=L2 overload;162=L3 overload;163=DC overload;164=DC overvoltage;165=Emergency stop;166=No connection,3214,uint16,1,R +com.victronenergy.genset,/AutoStart,u,0=Disabled;1=Enabled,3215,uint16,1,R +com.victronenergy.genset,/Start,u,0=Stop;1=Start,3223,uint16,1,W +com.victronenergy.genset,/Engine/Load,d,%,3216,uint16,1,R +com.victronenergy.genset,/Engine/Speed,d,RPM,3217,uint16,1,R +com.victronenergy.genset,/Engine/OperatingHours,d,s,3218,uint16,0.01,R +com.victronenergy.genset,/Engine/CoolantTemperature,d,Degrees celsius,3219,int16,10,R +com.victronenergy.genset,/Engine/WindingTemperature,d,Degrees celsius,3220,int16,10,R +com.victronenergy.genset,/Engine/ExaustTemperature,d,Degrees celsius,3221,int16,10,R +com.victronenergy.genset,/StarterVoltage,d,V DC,3222,uint16,100,R +com.victronenergy.genset,/Engine/OilPressure,d,kPa,3224,int16,1,R +com.victronenergy.genset,/Ac/L1/Voltage,d,V AC,3200,uint16,10,R +com.victronenergy.genset,/Ac/L1/Current,d,A AC,3203,int16,10,R +com.victronenergy.genset,/Ac/L1/Power,d,W,3206,int16,1,R +com.victronenergy.genset,/Ac/L1/Frequency,d,Hz,3209,uint16,100,R +com.victronenergy.genset,/Ac/L2/Voltage,d,V AC,3201,uint16,10,R +com.victronenergy.genset,/Ac/L2/Current,d,A AC,3204,int16,10,R +com.victronenergy.genset,/Ac/L2/Power,d,W,3207,int16,1,R +com.victronenergy.genset,/Ac/L2/Frequency,d,Hz,3210,uint16,100,R +com.victronenergy.genset,/Ac/L3/Voltage,d,V AC,3202,uint16,10,R +com.victronenergy.genset,/Ac/L3/Current,d,A AC,3205,int16,10,R +com.victronenergy.genset,/Ac/L3/Power,d,W,3208,int16,1,R +com.victronenergy.genset,/Ac/L3/Frequency,d,Hz,3211,uint16,100,R +com.victronenergy.temperature,/ProductId,u,,3300,uint16,1,R +com.victronenergy.temperature,/Scale,d,,3301,uint16,100,R +com.victronenergy.temperature,/Offset,d,,3302,int16,100,R +com.victronenergy.temperature,/TemperatureType,u,0=Battery;1=Fridge;2=Generic,3303,uint16,1,R +com.victronenergy.temperature,/Temperature,d,Degrees celsius,3304,int16,100,R +com.victronenergy.temperature,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3305,uint16,1,R +com.victronenergy.temperature,/Humidity,u,%,3306,uint16,10,R +com.victronenergy.temperature,/BatteryVoltage,d,V,3307,uint16,100,R +com.victronenergy.temperature,/Pressure,u,hPa,3308,uint16,1,R +com.victronenergy.pulsemeter,/Aggregate,i,,3400,uint32,1,R +com.victronenergy.pulsemeter,/Count,i,,3402,uint32,1,R +com.victronenergy.digitalinput,/Count,i,,3420,uint32,1,R +com.victronenergy.digitalinput,/State,i,,3422,uint16,1,R +com.victronenergy.digitalinput,/Alarm,i,0=No alarm;2=Alarm,3423,uint16,1,R +com.victronenergy.digitalinput,/Type,i,2=Door;3=Bilge pump;4=Bilge alarm;5=Burglar alarm;6=Smoke alarm;7=Fire alarm;8=CO2 alarm;9=Generator,3424,uint16,1,R;11=ExtTransferSwitch,3424,uint16,1,R +com.victronenergy.generator,/ManualStart,i,0=Stop generator;1=Start generator,3500,uint16,1,W +com.victronenergy.generator,/RunningByConditionCode,i,0=Stopped;1=Manual;2=TestRun;3=LossOfComms;4=Soc;5=AcLoad;6=BatteryCurrent;7=BatteryVoltage;8=InverterTemperatur;9=InverterOverload;10=StopOnAc1,3501,uint16,1,R +com.victronenergy.generator,/Runtime,i,seconds,3502,uint16,1,R +com.victronenergy.generator,/QuietHours,i,0=Quiet hours inactive; 1=Quiet hours active,3503,uint16,1,R +com.victronenergy.generator,/Runtime,u,seconds,3504,uint32,1,R +com.victronenergy.generator,/State,i,0=Stopped;1=Running;10=Error,3506,uint16,1,R +com.victronenergy.generator,/Error,i,0=No Error;1=Remote disabled;2=Remote fault,3507,uint16,1,R +com.victronenergy.generator,/Alarms/NoGeneratorAtAcIn,i,0=No Alarm;2=Alarm,3508,uint16,1,R +com.victronenergy.generator,/AutoStartEnabled,i,0=Autostart disabled;1=Autostart enabled,3509,uint16,1,W +com.victronenergy.generator,/ServiceCounter,u,seconds,3510,uint32,1,R +com.victronenergy.generator,/ServiceCounterReset,u,1=Reset,3512,uint16,1,W +com.victronenergy.meteo,/Irradiance,d,W/m^2,3600,uint16,10,R +com.victronenergy.meteo,/WindSpeed,d,m/s,3601,uint16,10,R +com.victronenergy.meteo,/CellTemperature,d,Degrees celsius,3602,int16,10,R +com.victronenergy.meteo,/ExternalTemperature,d,Degrees celsius,3603,int16,10,R +com.victronenergy.meteo,/ExternalTemperature2,d,Degrees celsius,3604,int16,10,R +com.victronenergy.evcharger,/ProductId,u,,3800,uint16,1,R +com.victronenergy.evcharger,/FirmwareVersion,u,,3802,uint32,1,R +com.victronenergy.evcharger,/Serial,s,,3804,string[6],,R +com.victronenergy.evcharger,/Model,s,,3810,string[4],,R +com.victronenergy.evcharger,/MaxCurrent,d,A,3814,uint16,1,W +com.victronenergy.evcharger,/Mode,u,0=Manual;1=Auto,3815,uint16,1,W +com.victronenergy.evcharger,/Ac/Energy/Forward,d,kWh,3816,uint32,100,R +com.victronenergy.evcharger,/Ac/L1/Power,d,W,3818,uint16,1,R +com.victronenergy.evcharger,/Ac/L2/Power,d,W,3819,uint16,1,R +com.victronenergy.evcharger,/Ac/L3/Power,d,W,3820,uint16,1,R +com.victronenergy.evcharger,/Ac/Power,d,W,3821,uint16,1,R +com.victronenergy.evcharger,/ChargingTime,d,s,3822,uint16,0.01,R +com.victronenergy.evcharger,/Current,d,A,3823,uint16,1,W +com.victronenergy.evcharger,/Status,u,0=Disconnected;1=Connected;2=Charging;3=Charged;4=Waiting for sun;5=Waiting for RFID;6=Waiting for start;7=Low SOC;8=Ground fault;9=Welded contacts;10=CP Input shorted;11=Residual current detected;12=Under voltage detected;13=Overvoltage detected;14=Overheating detected,3824,uint16,1,R +com.victronenergy.evcharger,/SetCurrent,d,A,3825,uint16,1,W +com.victronenergy.evcharger,/StartStop,u,0=Stop;1=Start,3826,uint16,1,W +com.victronenergy.evcharger,/Position,i,0=AC input 1;1=AC output;2=AC input 2,3827,uint16,1,W +com.victronenergy.acload,/Ac/L1/Power,d,W,3900,int16,1,R +com.victronenergy.acload,/Ac/L2/Power,d,W,3901,int16,1,R +com.victronenergy.acload,/Ac/L3/Power,d,W,3902,int16,1,R +com.victronenergy.acload,/Serial,s,,3903,string[7],,R +com.victronenergy.acload,/Ac/L1/Voltage,d,V AC,3910,uint16,10,R +com.victronenergy.acload,/Ac/L1/Current,d,A AC,3911,int16,10,R +com.victronenergy.acload,/Ac/L2/Voltage,d,V AC,3912,uint16,10,R +com.victronenergy.acload,/Ac/L2/Current,d,A AC,3913,int16,10,R +com.victronenergy.acload,/Ac/L3/Voltage,d,V AC,3914,uint16,10,R +com.victronenergy.acload,/Ac/L3/Current,d,A AC,3915,int16,10,R +com.victronenergy.acload,/Ac/L1/Energy/Forward,d,kWh,3916,uint32,100,R +com.victronenergy.acload,/Ac/L2/Energy/Forward,d,kWh,3918,uint32,100,R +com.victronenergy.acload,/Ac/L3/Energy/Forward,d,kWh,3920,uint32,100,R +com.victronenergy.fuelcell,/Dc/0/Voltage,d,V DC,4000,uint16,100,R +com.victronenergy.fuelcell,/Dc/0/Current,d,A DC,4001,int16,10,R +com.victronenergy.fuelcell,/Dc/1/Voltage,d,V DC,4002,int16,10,R +com.victronenergy.fuelcell,/Dc/0/Temperature,d,Degrees celsius,4003,int16,10,R +com.victronenergy.fuelcell,/History/EnergyOut,d,kWh,4004,uint32,100,R +com.victronenergy.fuelcell,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4006,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4007,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4008,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4009,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4010,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4011,uint16,1,R +com.victronenergy.alternator,/Dc/0/Voltage,d,V DC,4100,uint16,100,R +com.victronenergy.alternator,/Dc/0/Current,d,A DC,4101,int16,10,R +com.victronenergy.alternator,/Dc/1/Voltage,d,V DC,4102,int16,10,R +com.victronenergy.alternator,/Dc/0/Temperature,d,Degrees celsius,4103,int16,10,R +com.victronenergy.alternator,/History/EnergyOut,d,kWh,4104,uint32,100,R +com.victronenergy.alternator,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4106,uint16,1,R +com.victronenergy.alternator,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4107,uint16,1,R +com.victronenergy.alternator,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4108,uint16,1,R +com.victronenergy.alternator,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4109,uint16,1,R +com.victronenergy.alternator,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4110,uint16,1,R +com.victronenergy.alternator,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4111,uint16,1,R +com.victronenergy.alternator,/State,u,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;252=External control,4112,uint16,1,R +com.victronenergy.alternator,/ErrorCode,u,12=High battery temperature;13=High battery voltage;14=Low battery voltage;15=VBat exceeds $CPB;21=High alternator temperature;22=Alternator overspeed;24=Internal error;41=High field FET temperature;42=Sensor missing;43=Low VAlt;44=High Voltage offset;45=VAlt exceeds $CPB;51-52=Battery disconnect request;53=Battery instance out of range;54=Too many BMSes;55=AEBus fault;56=Too many Victron devices;58-61=Battery requested disconnection;91=BMS lost;92=Forced idle;201=DCDC converter fail;201-207=DCDC error,4113,uint16,1,R +com.victronenergy.alternator,/Engine/Speed,d,RPM,4114,uint16,1,R +com.victronenergy.alternator,/Speed,d,RPM,4115,uint16,1,R +com.victronenergy.alternator,/FieldDrive,q,%,4116,uint16,1,R +com.victronenergy.dcsource,/Dc/0/Voltage,d,V DC,4200,uint16,100,R +com.victronenergy.dcsource,/Dc/0/Current,d,A DC,4201,int16,10,R +com.victronenergy.dcsource,/Dc/1/Voltage,d,V DC,4202,int16,10,R +com.victronenergy.dcsource,/Dc/0/Temperature,d,Degrees centigrade,4203,int16,10,R +com.victronenergy.dcsource,/History/EnergyOut,d,kWh,4204,uint32,100,R +com.victronenergy.dcsource,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4206,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4207,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4208,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4209,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4210,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4211,uint16,1,R +com.victronenergy.dcload,/Dc/0/Voltage,d,V DC,4300,uint16,100,R +com.victronenergy.dcload,/Dc/0/Current,d,A DC,4301,int16,10,R +com.victronenergy.dcload,/Dc/1/Voltage,d,V DC,4302,int16,10,R +com.victronenergy.dcload,/Dc/0/Temperature,d,Degrees centigrade,4303,int16,10,R +com.victronenergy.dcload,/History/EnergyIn,d,kWh,4304,uint32,100,R +com.victronenergy.dcload,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4306,uint16,1,R +com.victronenergy.dcload,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4307,uint16,1,R +com.victronenergy.dcload,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4308,uint16,1,R +com.victronenergy.dcload,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4309,uint16,1,R +com.victronenergy.dcload,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4310,uint16,1,R +com.victronenergy.dcload,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4311,uint16,1,R +com.victronenergy.dcsystem,/Dc/0/Voltage,d,V DC,4400,uint16,100,R +com.victronenergy.dcsystem,/Dc/0/Current,d,A DC,4401,int16,10,R +com.victronenergy.dcsystem,/Dc/1/Voltage,d,V DC,4402,int16,10,R +com.victronenergy.dcsystem,/Dc/0/Temperature,d,Degrees centigrade,4403,int16,10,R +com.victronenergy.dcsystem,/History/EnergyOut,d,kWh,4404,uint32,100,R +com.victronenergy.dcsystem,/History/EnergyIn,d,kWh,4406,uint32,100,R +com.victronenergy.dcsystem,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4408,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4409,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4410,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4411,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4412,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4413,uint16,1,R +com.victronenergy.multi,/Ac/In/1/L1/V,d,V AC,4500,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/V,d,V AC,4501,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/V,d,V AC,4502,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/I,d,A AC,4503,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/I,d,A AC,4504,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/I,d,A AC,4505,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/P,d,W,4506,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L2/P,d,W,4507,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L3/P,d,W,4508,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L1/F,d,Hz,4509,uint16,100,R +com.victronenergy.multi,/Ac/Out/L1/V,d,V AC,4510,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/V,d,V AC,4511,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/V,d,V AC,4512,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/I,d,A AC,4513,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/I,d,A AC,4514,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/I,d,A AC,4515,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/P,d,W,4516,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L2/P,d,W,4517,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L3/P,d,W,4518,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L1/F,d,Hz,4519,uint16,100,R +com.victronenergy.multi,/Ac/In/1/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4520,uint16,1,R +com.victronenergy.multi,/Ac/In/2/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4521,uint16,1,R +com.victronenergy.multi,/Ac/In/1/CurrentLimit,d,A,4522,uint16,10,W +com.victronenergy.multi,/Ac/In/2/CurrentLimit,d,A,4523,uint16,10,W +com.victronenergy.multi,/Ac/NumberOfPhases,u,count,4524,uint16,1,R +com.victronenergy.multi,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,4525,uint16,1,R +com.victronenergy.multi,/Dc/0/Voltage,d,V DC,4526,uint16,100,R +com.victronenergy.multi,/Dc/0/Current,d,A DC,4527,int16,10,R +com.victronenergy.multi,/Dc/0/Temperature,d,Degrees celsius,4528,int16,10,R +com.victronenergy.multi,/Soc,d,%,4529,uint16,10,R +com.victronenergy.multi,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=External control,4530,uint16,1,R +com.victronenergy.multi,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,4531,uint16,1,W +com.victronenergy.multi,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,4532,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltage,u,0=Ok;1=Warning;2=Alarm,4533,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4534,uint16,1,R +com.victronenergy.multi,/Alarms/LowTemperature,u,0=Ok;1=Warning;2=Alarm,4535,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltage,u,0=Ok;1=Warning;2=Alarm,4536,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4537,uint16,1,R +com.victronenergy.multi,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,4538,uint16,1,R +com.victronenergy.multi,/Alarms/Ripple,u,0=Ok;1=Warning;2=Alarm,4539,uint16,1,R +com.victronenergy.multi,/Yield/Power,d,W,4540,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4541,uint16,10,R +com.victronenergy.multi,/Relay/0/State,i,0=Open;1=Closed,4542,uint16,1,R +com.victronenergy.multi,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4543,uint16,1,R +com.victronenergy.multi,/Pv/V,d,V DC,4544,uint16,10,R +com.victronenergy.multi,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,4545,uint16,1,R +com.victronenergy.multi,/Energy/AcIn1ToAcOut,d,kWh,4546,uint32,100,R +com.victronenergy.multi,/Energy/AcIn1ToInverter,d,kWh,4548,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToAcOut,d,kWh,4550,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToInverter,d,kWh,4552,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn1,d,kWh,4554,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn2,d,kWh,4556,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn1,d,kWh,4558,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn2,d,kWh,4560,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcOut,d,kWh,4562,uint32,100,R +com.victronenergy.multi,/Energy/OutToInverter,d,kWh,4564,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn1,d,kWh,4566,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn2,d,kWh,4568,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcOut,d,kWh,4570,uint32,100,R +com.victronenergy.multi,/Energy/SolarToBattery,d,kWh,4572,uint32,100,R +com.victronenergy.multi,/History/Daily/0/Yield,d,kWh,4574,uint16,10,R +com.victronenergy.multi,/History/Daily/0/MaxPower,d,W,4575,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Yield,d,kWh,4576,uint16,10,R +com.victronenergy.multi,/History/Daily/1/MaxPower,d,W,4577,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/0/Yield,d,kWh,4578,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/1/Yield,d,kWh,4579,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/2/Yield,d,kWh,4580,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/3/Yield,d,kWh,4581,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/0/Yield,d,kWh,4582,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/1/Yield,d,kWh,4583,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/2/Yield,d,kWh,4584,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/3/Yield,d,kWh,4585,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/0/MaxPower,d,W,4586,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/1/MaxPower,d,W,4587,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/2/MaxPower,d,W,4588,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/3/MaxPower,d,W,4589,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/0/MaxPower,d,W,4590,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/1/MaxPower,d,W,4591,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/2/MaxPower,d,W,4592,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/3/MaxPower,d,W,4593,uint16,1,R +com.victronenergy.multi,/Pv/0/V,d,V DC,4594,uint16,10,R +com.victronenergy.multi,/Pv/1/V,d,V DC,4595,uint16,10,R +com.victronenergy.multi,/Pv/2/V,d,V DC,4596,uint16,10,R +com.victronenergy.multi,/Pv/3/V,d,V DC,4597,uint16,10,R +com.victronenergy.multi,/Pv/0/P,d,W,4598,uint16,1,R +com.victronenergy.multi,/Pv/1/P,d,W,4599,uint16,1,R +com.victronenergy.multi,/Pv/2/P,d,W,4600,uint16,1,R +com.victronenergy.multi,/Pv/3/P,d,W,4601,uint16,1,R +com.victronenergy.multi,/Alarms/LowSoc,u,,4602,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4603,uint32,1,R +com.victronenergy.multi,/Pv/0/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4605,uint16,1,R +com.victronenergy.multi,/Pv/1/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4606,uint16,1,R +com.victronenergy.multi,/Pv/2/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4607,uint16,1,R +com.victronenergy.multi,/Pv/3/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4608,uint16,1,R +com.victronenergy.pump,/State,d,0=Stopped;1=Running,4700,uint16,1,R +com.victronenergy.settings,/Settings/Pump0/AutoStartEnabled,d,0=Disabled;1=Enabled,4701,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/Mode,d,0=Auto;1=On;2=Off,4702,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/StartValue,d,%,4703,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/StopValue,d,%,4704,uint16,1,W +com.victronenergy.dcdc,/ProductId,u,,4800,uint16,1,R +com.victronenergy.dcdc,/FirmwareVersion,u,,4801,uint32,1,R +com.victronenergy.dcdc,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,4803,uint16,1,R +com.victronenergy.dcdc,/Dc/0/Voltage,d,V DC,4804,uint16,100,R +com.victronenergy.dcdc,/Dc/0/Current,d,A DC,4805,int16,10,R +com.victronenergy.dcdc,/Dc/0/Temperature,d,Degrees celsius,4806,int16,10,R +com.victronenergy.dcdc,/Mode,u,1=On;4=Off,4807,uint16,1,W +com.victronenergy.dcdc,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize,4808,uint16,1,R +com.victronenergy.dcdc,/Dc/In/V,d,V DC,4809,uint16,100,R +com.victronenergy.dcdc,/Dc/In/P,d,W,4810,uint16,1,R +com.victronenergy.dcdc,/History/Cumulative/User/ChargedAh,d,Ah,4811,uint16,10,R diff --git a/FileSets/v3.30~1/attributes.csv.orig b/FileSets/v3.30~1/attributes.csv.orig new file mode 100644 index 00000000..0e3da82b --- /dev/null +++ b/FileSets/v3.30~1/attributes.csv.orig @@ -0,0 +1,720 @@ +com.victronenergy.gps,/Position/Latitude,d,Decimal degrees,2800,int32,10000000,R +com.victronenergy.gps,/Position/Longitude,d,Decimal degrees,2802,int32,10000000,R +com.victronenergy.gps,/Course,d,Degrees,2804,uint16,100,R +com.victronenergy.gps,/Speed,d,m/s,2805,uint16,100,R +com.victronenergy.gps,/Fix,y,,2806,uint16,1,R +com.victronenergy.gps,/NrOfSatellites,y,,2807,uint16,1,R +com.victronenergy.gps,/Altitude,d,m,2808,int32,10,R +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/State,i,0=BL disabled;1=Restarting;2=Self-consumption;3=Self-consumption;4=Self-consumption;5=Discharge disabled;6=Force charge;7=Sustain;9=Keep batteries charged;10=BL Disabled;11=BL Disabled (Low SoC),2900,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/MinimumSocLimit,d,%,2901,uint16,10,W +com.victronenergy.settings,/Settings/CGwacs/Hub4Mode,i,1=ESS with Phase Compensation;2=ESS without phase compensation;3=Disabled/External Control,2902,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/BatteryLife/SocLimit,d,%,2903,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/V,d,V AC,3,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/V,d,V AC,4,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/V,d,V AC,5,uint16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/I,d,A AC,6,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/I,d,A AC,7,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/I,d,A AC,8,int16,10,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/F,d,Hz,9,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/F,d,Hz,10,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/F,d,Hz,11,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/L1/P,i,VA or Watts,12,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L2/P,i,VA or Watts,13,int16,0.1,R +com.victronenergy.vebus,/Ac/ActiveIn/L3/P,i,VA or Watts,14,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L1/V,d,V AC,15,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L2/V,d,V AC,16,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L3/V,d,V AC,17,uint16,10,R +com.victronenergy.vebus,/Ac/Out/L1/I,d,A AC,18,int16,10,R +com.victronenergy.vebus,/Ac/Out/L2/I,d,A AC,19,int16,10,R +com.victronenergy.vebus,/Ac/Out/L3/I,d,A AC,20,int16,10,R +com.victronenergy.vebus,/Ac/Out/L1/F,d,Hz,21,int16,100,R +com.victronenergy.vebus,/Ac/ActiveIn/CurrentLimit,d,A,22,int16,10,W +com.victronenergy.vebus,/Ac/Out/L1/P,i,VA or Watts,23,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L2/P,i,VA or Watts,24,int16,0.1,R +com.victronenergy.vebus,/Ac/Out/L3/P,i,VA or Watts,25,int16,0.1,R +com.victronenergy.vebus,/Dc/0/Voltage,d,V DC,26,uint16,100,R +com.victronenergy.vebus,/Dc/0/Current,d,A DC,27,int16,10,R +com.victronenergy.vebus,/Ac/NumberOfPhases,u,count,28,uint16,1,R +com.victronenergy.vebus,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,29,uint16,1,R +com.victronenergy.vebus,/Soc,d,%,30,uint16,10,W +com.victronenergy.vebus,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=External control,31,uint16,1,R +com.victronenergy.vebus,/VebusError,u,0=No error;1=VE.Bus Error 1: Device is switched off because one of the other phases in the system has switched off;2=VE.Bus Error 2: New and old types MK2 are mixed in the system;3=VE.Bus Error 3: Not all- or more than- the expected devices were found in the system;4=VE.Bus Error 4: No other device whatsoever detected;5=VE.Bus Error 5: Overvoltage on AC-out;6=VE.Bus Error 6: Error in DDC Program;7=VE.Bus BMS connected- which requires an Assistant- but no assistant found;10=VE.Bus Error 10: System time synchronisation problem occurred;14=VE.Bus Error 14: Device cannot transmit data;16=VE.Bus Error 16: Dongle missing;17=VE.Bus Error 17: One of the devices assumed master status because the original master failed;18=VE.Bus Error 18: AC Overvoltage on the output of a slave has occurred while already switched off;22=VE.Bus Error 22: This device cannot function as slave;24=VE.Bus Error 24: Switch-over system protection initiated;25=VE.Bus Error 25: Firmware incompatibility. The firmware of one of the connected device is not sufficiently up to date to operate in conjunction with this device;26=VE.Bus Error 26: Internal error,32,uint16,1,R +com.victronenergy.vebus,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,33,uint16,1,W +com.victronenergy.vebus,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,34,uint16,1,R +com.victronenergy.vebus,/Alarms/LowBattery,u,0=Ok;1=Warning;2=Alarm,35,uint16,1,R +com.victronenergy.vebus,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,36,uint16,1,R +com.victronenergy.vebus,/Alarms/TemperatureSensor,u,0=Ok;1=Warning;2=Alarm,42,uint16,1,R +com.victronenergy.vebus,/Alarms/VoltageSensor,u,0=Ok;1=Warning;2=Alarm,43,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/HighTemperature,u,0=Ok;1=Warning;2=Alarm,44,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/LowBattery,u,0=Ok;1=Warning;2=Alarm,45,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Overload,u,0=Ok;1=Warning;2=Alarm,46,uint16,1,R +com.victronenergy.vebus,/Alarms/L1/Ripple,u,0=Ok;1=Warning;2=Alarm,47,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/HighTemperature,u,0=Ok;1=Warning;2=Alarm,48,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/LowBattery,u,0=Ok;1=Warning;2=Alarm,49,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Overload,u,0=Ok;1=Warning;2=Alarm,50,uint16,1,R +com.victronenergy.vebus,/Alarms/L2/Ripple,u,0=Ok;1=Warning;2=Alarm,51,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/HighTemperature,u,0=Ok;1=Warning;2=Alarm,52,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/LowBattery,u,0=Ok;1=Warning;2=Alarm,53,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Overload,u,0=Ok;1=Warning;2=Alarm,54,uint16,1,R +com.victronenergy.vebus,/Alarms/L3/Ripple,u,0=Ok;1=Warning;2=Alarm,55,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,37,int16,1,W +com.victronenergy.vebus,/Hub4/DisableCharge,u,0=Charge allowed;1=Charge disabled,38,uint16,1,W +com.victronenergy.vebus,/Hub4/DisableFeedIn,u,0=Feed in allowed;1=Feed in disabled,39,uint16,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,40,int16,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,41,int16,1,W +com.victronenergy.vebus,/PvInverter/Disable,u,0=PV enabled;1=PV disabled,56,uint16,1,W +com.victronenergy.vebus,/Bms/AllowToCharge,u,0=No;1=Yes,57,uint16,1,R +com.victronenergy.vebus,/Bms/AllowToDischarge,u,0=No;1=Yes,58,uint16,1,R +com.victronenergy.vebus,/Bms/BmsExpected,u,0=No;1=Yes,59,uint16,1,R +com.victronenergy.vebus,/Bms/Error,u,0=No;1=Yes,60,uint16,1,R +com.victronenergy.vebus,/Dc/0/Temperature,d,Degrees celsius,61,int16,10,R +com.victronenergy.vebus,/SystemReset,y,0=No action;1=VE.Bus Reset,62,uint16,1,W +com.victronenergy.vebus,/Alarms/PhaseRotation,u,0=Ok;1=Warning,63,uint16,1,R +com.victronenergy.vebus,/Alarms/GridLost,i,0=No alarm;2=Alarm,64,uint16,1,R +com.victronenergy.vebus,/Alarms/BmsPreAlarm,u,0=OK;1=Pre-Alarm,94,uint16,1,R +com.victronenergy.vebus,/Hub4/DoNotFeedInOvervoltage,i,0=Feed in overvoltage;1=Don't feed in overvoltage,65,uint16,1,W +com.victronenergy.vebus,/Hub4/L1/MaxFeedInPower,d,W,66,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L2/MaxFeedInPower,d,W,67,uint16,0.01,W +com.victronenergy.vebus,/Hub4/L3/MaxFeedInPower,d,W,68,uint16,0.01,W +com.victronenergy.vebus,/Ac/State/IgnoreAcIn1,i,0=AC input not ignored; 1=AC input ignored,69,uint16,1,R +com.victronenergy.vebus,/Ac/State/IgnoreAcIn2,i,0=AC input not ignored; 1=AC input ignored,70,uint16,1,R +com.victronenergy.vebus,/Hub4/TargetPowerIsMaxFeedIn,i,0=AcPowerSetpoint interpreted normally; 1=AcPowerSetpoint as OvervoltageFeedIn limit,71,uint16,,W +com.victronenergy.vebus,/Hub4/FixSolarOffsetTo100mV,i,0=OvervoltageFeedIn uses 1V offset; 1=OvervoltageFeedIn uses 0.1V offset,72,uint16,,W +com.victronenergy.vebus,/Hub4/Sustain,i,0=Sustain inactive; 1=Sustain active,73,uint16,1,R +com.victronenergy.vebus,/Energy/AcIn1ToAcOut,d,kWh,74,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn1ToInverter,d,kWh,76,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToAcOut,d,kWh,78,uint32,100,R +com.victronenergy.vebus,/Energy/AcIn2ToInverter,d,kWh,80,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn1,d,kWh,82,uint32,100,R +com.victronenergy.vebus,/Energy/AcOutToAcIn2,d,kWh,84,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn1,d,kWh,86,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcIn2,d,kWh,88,uint32,100,R +com.victronenergy.vebus,/Energy/InverterToAcOut,d,kWh,90,uint32,100,R +com.victronenergy.vebus,/Energy/OutToInverter,d,kWh,92,uint32,100,R +com.victronenergy.vebus,/VebusChargeState,u,0=Initialising;1=Bulk;2=Absorption;3=Float;4=Storage;5=Absorb repeat;6=Forced absorb;7=Equalise;8=Bulk stopped;9=Unknown,95,uint16,1,R +com.victronenergy.vebus,/Hub4/L1/AcPowerSetpoint,d,W,96,int32,1,W +com.victronenergy.vebus,/Hub4/L2/AcPowerSetpoint,d,W,98,int32,1,W +com.victronenergy.vebus,/Hub4/L3/AcPowerSetpoint,d,W,100,int32,1,W +com.victronenergy.vebus,/Dc/0/PreferRenewableEnergy,i,0=Not preferred;1=Preferred,102,uint16,1,W +com.victronenergy.vebus,/Ac/Control/RemoteGeneratorSelected,i,0=Generator not selected;1=Generator selected,103,uint16,1,W +com.victronenergy.vebus,/Ac/State/RemoteGeneratorSelected,i,0=Generator not selected;1=Generator selected,104,uint16,1,R +com.victronenergy.vebus,RESERVED,d,,105,reserved[1],1,R +com.victronenergy.vebus,/Devices/0/Settings/AssistCurrentBoostFactor,d,,106,uint16,100,W +com.victronenergy.vebus,/Devices/1/Settings/AssistCurrentBoostFactor,d,,107,uint16,100,W +com.victronenergy.vebus,/Devices/2/Settings/AssistCurrentBoostFactor,d,,108,uint16,100,W +com.victronenergy.vebus,/Devices/3/Settings/AssistCurrentBoostFactor,d,,109,uint16,100,W +com.victronenergy.vebus,/Devices/4/Settings/AssistCurrentBoostFactor,d,,110,uint16,100,W +com.victronenergy.vebus,/Devices/5/Settings/AssistCurrentBoostFactor,d,,111,uint16,100,W +com.victronenergy.vebus,/Devices/6/Settings/AssistCurrentBoostFactor,d,,112,uint16,100,W +com.victronenergy.vebus,/Devices/7/Settings/AssistCurrentBoostFactor,d,,113,uint16,100,W +com.victronenergy.vebus,/Devices/8/Settings/AssistCurrentBoostFactor,d,,114,uint16,100,W +com.victronenergy.vebus,/Devices/9/Settings/AssistCurrentBoostFactor,d,,115,uint16,100,W +com.victronenergy.vebus,/Devices/10/Settings/AssistCurrentBoostFactor,d,,116,uint16,100,W +com.victronenergy.vebus,/Devices/11/Settings/AssistCurrentBoostFactor,d,,117,uint16,100,W +com.victronenergy.vebus,/Devices/0/Settings/InverterOutputVoltage,d,V AC,118,uint16,100,W +com.victronenergy.vebus,/Devices/1/Settings/InverterOutputVoltage,d,V AC,119,uint16,100,W +com.victronenergy.vebus,/Devices/2/Settings/InverterOutputVoltage,d,V AC,120,uint16,100,W +com.victronenergy.vebus,/Devices/3/Settings/InverterOutputVoltage,d,V AC,121,uint16,100,W +com.victronenergy.vebus,/Devices/4/Settings/InverterOutputVoltage,d,V AC,122,uint16,100,W +com.victronenergy.vebus,/Devices/5/Settings/InverterOutputVoltage,d,V AC,123,uint16,100,W +com.victronenergy.vebus,/Devices/6/Settings/InverterOutputVoltage,d,V AC,124,uint16,100,W +com.victronenergy.vebus,/Devices/7/Settings/InverterOutputVoltage,d,V AC,125,uint16,100,W +com.victronenergy.vebus,/Devices/8/Settings/InverterOutputVoltage,d,V AC,126,uint16,100,W +com.victronenergy.vebus,/Devices/9/Settings/InverterOutputVoltage,d,V AC,127,uint16,100,W +com.victronenergy.vebus,/Devices/10/Settings/InverterOutputVoltage,d,V AC,128,uint16,100,W +com.victronenergy.vebus,/Devices/11/Settings/InverterOutputVoltage,d,V AC,129,uint16,100,W +com.victronenergy.vebus,/Devices/0/Settings/PowerAssistEnabled,d,,130,uint16,1,R +com.victronenergy.vebus,/Devices/1/Settings/PowerAssistEnabled,d,,131,uint16,1,R +com.victronenergy.vebus,/Devices/2/Settings/PowerAssistEnabled,d,,132,uint16,1,R +com.victronenergy.vebus,/Devices/3/Settings/PowerAssistEnabled,d,,133,uint16,1,R +com.victronenergy.vebus,/Devices/4/Settings/PowerAssistEnabled,d,,134,uint16,1,R +com.victronenergy.vebus,/Devices/5/Settings/PowerAssistEnabled,d,,135,uint16,1,R +com.victronenergy.vebus,/Devices/6/Settings/PowerAssistEnabled,d,,136,uint16,1,R +com.victronenergy.vebus,/Devices/7/Settings/PowerAssistEnabled,d,,137,uint16,1,R +com.victronenergy.vebus,/Devices/8/Settings/PowerAssistEnabled,d,,138,uint16,1,R +com.victronenergy.vebus,/Devices/9/Settings/PowerAssistEnabled,d,,139,uint16,1,R +com.victronenergy.vebus,/Devices/10/Settings/PowerAssistEnabled,d,,140,uint16,1,R +com.victronenergy.vebus,/Devices/11/Settings/PowerAssistEnabled,d,,141,uint16,1,R +com.victronenergy.battery,/Dc/0/Power,i,W,258,int16,1,R +com.victronenergy.battery,/Dc/0/Voltage,d,V DC,259,uint16,100,R +com.victronenergy.battery,/Dc/1/Voltage,d,V DC,260,uint16,100,R +com.victronenergy.battery,/Dc/0/Current,d,A DC,261,int16,10,R +com.victronenergy.battery,/Dc/0/Temperature,d,Degrees celsius,262,int16,10,R +com.victronenergy.battery,/Dc/0/MidVoltage,d,V DC,263,uint16,100,R +com.victronenergy.battery,/Dc/0/MidVoltageDeviation,d,%,264,uint16,100,R +com.victronenergy.battery,/ConsumedAmphours,d,Ah,265,uint16,-10,R +com.victronenergy.battery,/Soc,y,%,266,uint16,10,R +com.victronenergy.battery,/Soh,y,%,304,uint16,10,R +com.victronenergy.battery,/TimeToGo,q,seconds,303,uint16,0.01,R +com.victronenergy.battery,/Info/MaxChargeVoltage,u,V DC,305,uint16,10,R +com.victronenergy.battery,/Info/BatteryLowVoltage,u,V DC,306,uint16,10,R +com.victronenergy.battery,/Info/MaxChargeCurrent,u,A DC,307,uint16,10,R +com.victronenergy.battery,/Info/MaxDischargeCurrent,u,A DC,308,uint16,10,R +com.victronenergy.battery,/Alarms/Alarm,y,0=No alarm;2=Alarm,267,uint16,1,R +com.victronenergy.battery,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,268,uint16,1,R +com.victronenergy.battery,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,269,uint16,1,R +com.victronenergy.battery,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,270,uint16,1,R +com.victronenergy.battery,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,271,uint16,1,R +com.victronenergy.battery,/Alarms/LowSoc,u,0=No alarm;2=Alarm,272,uint16,1,R +com.victronenergy.battery,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,273,uint16,1,R +com.victronenergy.battery,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,274,uint16,1,R +com.victronenergy.battery,/Alarms/MidVoltage,u,0=No alarm;2=Alarm,275,uint16,1,R +com.victronenergy.battery,/Alarms/LowFusedVoltage,u,0=No alarm;2=Alarm,276,uint16,1,R +com.victronenergy.battery,/Alarms/HighFusedVoltage,u,0=No alarm;2=Alarm,277,uint16,1,R +com.victronenergy.battery,/Alarms/FuseBlown,u,0=No alarm;2=Alarm,278,uint16,1,R +com.victronenergy.battery,/Alarms/HighInternalTemperature,u,0=No alarm;2=Alarm,279,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeCurrent,u,0=No alarm;2=Alarm,320,uint16,1,R +com.victronenergy.battery,/Alarms/HighDischargeCurrent,u,0=No alarm;2=Alarm,321,uint16,1,R +com.victronenergy.battery,/Alarms/CellImbalance,u,0=No alarm;2=Alarm,322,uint16,1,R +com.victronenergy.battery,/Alarms/InternalFailure,u,0=No alarm;2=Alarm,323,uint16,1,R +com.victronenergy.battery,/Alarms/HighChargeTemperature,u,0=No alarm;2=Alarm,324,uint16,1,R +com.victronenergy.battery,/Alarms/LowChargeTemperature,u,0=No alarm;2=Alarm,325,uint16,1,R +com.victronenergy.battery,/Alarms/LowCellVoltage,u,0=No alarm;1=Almost discharged;2=Alarm,326,uint16,1,R +com.victronenergy.battery,/Relay/0/State,y,0=Open;1=Closed,280,uint16,1,W +com.victronenergy.battery,/History/DeepestDischarge,d,Ah,281,uint16,-10,R +com.victronenergy.battery,/History/LastDischarge,d,Ah,282,uint16,-10,R +com.victronenergy.battery,/History/AverageDischarge,d,Ah,283,uint16,-10,R +com.victronenergy.battery,/History/ChargeCycles,i,count,284,uint16,1,R +com.victronenergy.battery,/History/FullDischarges,i,count,285,uint16,1,R +com.victronenergy.battery,/History/TotalAhDrawn,d,Ah,286,uint16,-10,R +com.victronenergy.battery,/History/MinimumVoltage,d,V DC,287,uint16,100,R +com.victronenergy.battery,/History/MaximumVoltage,d,V DC,288,uint16,100,R +com.victronenergy.battery,/History/TimeSinceLastFullCharge,i,seconds,289,uint16,0.01,R +com.victronenergy.battery,/History/AutomaticSyncs,i,count,290,uint16,1,R +com.victronenergy.battery,/History/LowVoltageAlarms,i,count,291,uint16,1,R +com.victronenergy.battery,/History/HighVoltageAlarms,i,count,292,uint16,1,R +com.victronenergy.battery,/History/LowStarterVoltageAlarms,i,count,293,uint16,1,R +com.victronenergy.battery,/History/HighStarterVoltageAlarms,i,count,294,uint16,1,R +com.victronenergy.battery,/History/MinimumStarterVoltage,d,V DC,295,uint16,100,R +com.victronenergy.battery,/History/MaximumStarterVoltage,d,V DC,296,uint16,100,R +com.victronenergy.battery,/History/LowFusedVoltageAlarms,i,count,297,uint16,1,R +com.victronenergy.battery,/History/HighFusedVoltageAlarms,i,count,298,uint16,1,R +com.victronenergy.battery,/History/MinimumFusedVoltage,d,V DC,299,uint16,100,R +com.victronenergy.battery,/History/MaximumFusedVoltage,d,V DC,300,uint16,100,R +com.victronenergy.battery,/History/DischargedEnergy,d,kWh,301,uint16,10,R +com.victronenergy.battery,/History/ChargedEnergy,d,kWh,302,uint16,10,R +com.victronenergy.battery,/Capacity,d,Ah,309,uint16,10,R +com.victronenergy.battery,/State,y,0=Initializing (Wait start);1=Initializing (before boot);2=Initializing (Before boot delay);3=Initializing (Wait boot);4=Initializing;5=Initializing (Measure battery voltage);6=Initializing (Calculate battery voltage);7=Initializing (Wait bus voltage);8=Initializing (Wait for lynx shunt);9=Running;10=Error;11=Unused;12=Shutdown;13=Slave updating;14=Standby;15=Going to run;16=Per-charging;17=Contactor check,1282,uint16,1,R +com.victronenergy.battery,/ErrorCode,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1283,uint16,1,R +com.victronenergy.battery,/SystemSwitch,y,0=Disabled;1=Enabled,1284,uint16,1,R +com.victronenergy.battery,/Balancing,y,0=Inactive;1=Active,1285,uint16,1,R +com.victronenergy.battery,/System/NrOfBatteries,y,count,1286,uint16,1,R +com.victronenergy.battery,/System/BatteriesParallel,y,count,1287,uint16,1,R +com.victronenergy.battery,/System/BatteriesSeries,y,count,1288,uint16,1,R +com.victronenergy.battery,/System/NrOfCellsPerBattery,y,count,1289,uint16,1,R +com.victronenergy.battery,/System/MinCellVoltage,d,V DC,1290,uint16,100,R +com.victronenergy.battery,/System/MaxCellVoltage,d,V DC,1291,uint16,100,R +com.victronenergy.battery,/Diagnostics/ShutDownsDueError,q,count,1292,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1293,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1294,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1295,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Error,y,0=No error;1=Battery initialization error;2=No batteries connected;3=Unknown battery connected;4=Different battery type;5=Number of batteries incorrect;6=Lynx Shunt not found;7=Battery measure error;8=Internal calculation error;9=Batteries in series not ok;10=Number of batteries incorrect;11=Hardware error;12=Watchdog error;13=Over voltage;14=Under voltage;15=Over temperature;16=Under temperature;17=Hardware fault;18=Standby shutdown;19=Pre-charge charge error;20=Safety contactor check error;21=Pre-charge discharge error;22=ADC error;23=Slave error;24=Slave warning;25=Pre-charge error;26=Safety contactor error;27=Over current;28=Slave update failed;29=Slave update unavailable,1296,uint16,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/1/Time,u,,310,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/2/Time,u,,312,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/3/Time,u,,314,int32,1,R +com.victronenergy.battery,/Diagnostics/LastErrors/4/Time,u,,316,int32,1,R +com.victronenergy.battery,/System/MinCellTemperature,d,Degrees celsius,318,int16,10,R +com.victronenergy.battery,/System/MaxCellTemperature,d,Degrees celsius,319,int16,10,R +com.victronenergy.battery,/Io/AllowToCharge,y,0=No;1=Yes,1297,uint16,1,R +com.victronenergy.battery,/Io/AllowToDischarge,y,0=No;1=Yes,1298,uint16,1,R +com.victronenergy.battery,/Io/ExternalRelay,y,0=Inactive;1=Active,1299,uint16,1,R +com.victronenergy.battery,/History/MinimumCellVoltage,d,V DC,1300,uint16,100,R +com.victronenergy.battery,/History/MaximumCellVoltage,d,V DC,1301,uint16,100,R +com.victronenergy.battery,/System/NrOfModulesOffline,u,,1302,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesOnline,u,,1303,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingCharge,u,,1304,uint16,1,R +com.victronenergy.battery,/System/NrOfModulesBlockingDischarge,u,,1305,uint16,1,R +com.victronenergy.battery,/System/MinVoltageCellId,s,,1306,string[4],1,R +com.victronenergy.battery,/System/MaxVoltageCellId,s,,1310,string[4],1,R +com.victronenergy.battery,/System/MinTemperatureCellId,s,,1314,string[4],1,R +com.victronenergy.battery,/System/MaxTemperatureCellId,s,,1318,string[4],1,R +com.victronenergy.battery,/Mode,i,3=On;252=Standby,1319,uint16,1,W +com.victronenergy.solarcharger,/Dc/0/Voltage,d,V DC,771,uint16,100,R +com.victronenergy.solarcharger,/Dc/0/Current,d,A DC,772,int16,10,R +com.victronenergy.solarcharger,/Dc/0/Temperature,d,Degrees celsius,773,int16,10,R +com.victronenergy.solarcharger,/Mode,i,1=On;4=Off,774,uint16,1,W +com.victronenergy.solarcharger,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;11=Other (Hub-1);252=Hub-1,775,uint16,1,R +com.victronenergy.solarcharger,/Pv/V,d,V DC,776,uint16,100,R +com.victronenergy.solarcharger,/Pv/I,d,A DC,777,INTERNAL,10,R +com.victronenergy.solarcharger,/Yield/Power,d,W,789,uint16,10,R +com.victronenergy.solarcharger,/Equalization/Pending,i,0=No;1=Yes;2=Error;3=Unavailable- Unknown,778,uint16,1,R +com.victronenergy.solarcharger,/Equalization/TimeRemaining,d,seconds,779,uint16,10,R +com.victronenergy.solarcharger,/Relay/0/State,i,0=Open;1=Closed,780,uint16,1,R +com.victronenergy.solarcharger,/Alarms/Alarm,i,0=No alarm;2=Alarm,781,uint16,1,R +com.victronenergy.solarcharger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,782,uint16,1,R +com.victronenergy.solarcharger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,783,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Yield,d,kWh,784,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/MaxPower,d,W,785,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Yield,d,kWh,786,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/MaxPower,d,W,787,uint16,1,R +com.victronenergy.solarcharger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,788,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,790,uint16,10,R +com.victronenergy.solarcharger,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,791,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/V,d,V DC,3700,uint16,100,R +com.victronenergy.solarcharger,/Pv/1/V,d,V DC,3701,uint16,100,R +com.victronenergy.solarcharger,/Pv/2/V,d,V DC,3702,uint16,100,R +com.victronenergy.solarcharger,/Pv/3/V,d,V DC,3703,uint16,100,R +com.victronenergy.solarcharger,RESERVED,d,,3704,reserved[4],1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/Yield,d,kWh,3708,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/Yield,d,kWh,3709,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/Yield,d,kWh,3710,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/Yield,d,kWh,3711,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/Yield,d,kWh,3712,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/Yield,d,kWh,3713,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/Yield,d,kWh,3714,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/Yield,d,kWh,3715,uint16,10,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/0/MaxPower,d,W,3716,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/1/MaxPower,d,W,3717,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/2/MaxPower,d,W,3718,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/0/Pv/3/MaxPower,d,W,3719,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/0/MaxPower,d,W,3720,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/1/MaxPower,d,W,3721,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/2/MaxPower,d,W,3722,uint16,1,R +com.victronenergy.solarcharger,/History/Daily/1/Pv/3/MaxPower,d,W,3723,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/P,d,W,3724,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/P,d,W,3725,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/P,d,W,3726,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/P,d,W,3727,uint16,1,R +com.victronenergy.solarcharger,/Yield/User,d,kWh,3728,uint32,1,R +com.victronenergy.solarcharger,/Yield/Power,d,W,3730,uint16,1,R +com.victronenergy.solarcharger,/Pv/0/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3731,uint16,1,R +com.victronenergy.solarcharger,/Pv/1/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3732,uint16,1,R +com.victronenergy.solarcharger,/Pv/2/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3733,uint16,1,R +com.victronenergy.solarcharger,/Pv/3/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3734,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L1/Power,d,W,808,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L2/Power,d,W,809,uint16,1,R +com.victronenergy.system,/Ac/PvOnOutput/L3/Power,d,W,810,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L1/Power,d,W,811,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L2/Power,d,W,812,uint16,1,R +com.victronenergy.system,/Ac/PvOnGrid/L3/Power,d,W,813,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L1/Power,d,W,814,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L2/Power,d,W,815,uint16,1,R +com.victronenergy.system,/Ac/PvOnGenset/L3/Power,d,W,816,uint16,1,R +com.victronenergy.system,/Dc/Pv/Power,d,W,850,uint16,1,R +com.victronenergy.system,/Dc/Pv/Current,d,A DC,851,int16,10,R +com.victronenergy.system,/Dc/Charger/Power,d,W,855,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L1/Power,d,W,817,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L2/Power,d,W,818,uint16,1,R +com.victronenergy.system,/Ac/Consumption/L3/Power,d,W,819,uint16,1,R +com.victronenergy.system,/Ac/Grid/L1/Power,d,W,820,int16,1,R +com.victronenergy.system,/Ac/Grid/L2/Power,d,W,821,int16,1,R +com.victronenergy.system,/Ac/Grid/L3/Power,d,W,822,int16,1,R +com.victronenergy.system,/Ac/Genset/L1/Power,d,W,823,int16,1,R +com.victronenergy.system,/Ac/Genset/L2/Power,d,W,824,int16,1,R +com.victronenergy.system,/Ac/Genset/L3/Power,d,W,825,int16,1,R +com.victronenergy.system,/Ac/ActiveIn/Source,u,0=Not available;1=Grid;2=Generator;3=Shore power;240=Not connected,826,int16,1,R +com.victronenergy.system,RESERVED,d,,827,reserved[3],1,R +com.victronenergy.system,/DateAndTime,d,A DC,830,INTERNAL,1,R +com.victronenergy.system,RESERVED,d,,834,reserved[6],1,R +com.victronenergy.system,/Dc/System/Power,d,W,860,int16,1,R +com.victronenergy.system,/Dc/Battery/Voltage,d,V DC,840,uint16,10,R +com.victronenergy.system,/Dc/Battery/Current,d,A DC,841,int16,10,R +com.victronenergy.system,/Dc/Battery/Power,d,W,842,int16,1,R +com.victronenergy.system,/Dc/Vebus/Current,d,A DC,865,int16,10,R +com.victronenergy.system,/Dc/Vebus/Power,d,W,866,int16,1,R +com.victronenergy.system,/Dc/Battery/Soc,d,%,843,uint16,1,R +com.victronenergy.system,/Dc/Battery/State,i,0=idle;1=charging;2=discharging,844,uint16,1,R +com.victronenergy.system,/Dc/Battery/ConsumedAmphours,d,Ah,845,uint16,-10,R +com.victronenergy.system,/Dc/Battery/TimeToGo,d,s,846,uint16,0.01,R +com.victronenergy.system,/Relay/0/State,i,0=Open;1=Closed,806,uint16,1,W +com.victronenergy.system,/Relay/1/State,i,0=Open;1=Closed,807,uint16,1,W +com.victronenergy.system,/Serial,s,,800,string[6],1,R +com.victronenergy.pvinverter,/Position,i,0=AC input 1;1=AC output;2=AC input 2,1026,uint16,1,R +com.victronenergy.pvinverter,/Serial,s,,1039,string[7],1,R +com.victronenergy.pvinverter,/Ac/L1/Voltage,d,V AC,1027,uint16,10,R +com.victronenergy.pvinverter,/Ac/L1/Current,d,A AC,1028,int16,10,R +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1029,uint16,1,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1030,uint16,100,R +com.victronenergy.pvinverter,/Ac/L2/Voltage,d,V AC,1031,uint16,10,R +com.victronenergy.pvinverter,/Ac/L2/Current,d,A AC,1032,int16,10,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1033,uint16,1,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1034,uint16,100,R +com.victronenergy.pvinverter,/Ac/L3/Voltage,d,V AC,1035,uint16,10,R +com.victronenergy.pvinverter,/Ac/L3/Current,d,A AC,1036,int16,10,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1037,uint16,1,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1038,uint16,100,R +com.victronenergy.pvinverter,/Ac/L1/Energy/Forward,u,kWh,1046,uint32,100,R +com.victronenergy.pvinverter,/Ac/L2/Energy/Forward,u,kWh,1048,uint32,100,R +com.victronenergy.pvinverter,/Ac/L3/Energy/Forward,u,kWh,1050,uint32,100,R +com.victronenergy.pvinverter,/Ac/Power,i,kW,1052,int32,1,W +com.victronenergy.pvinverter,/Ac/MaxPower,u,kW,1054,uint32,1,W +com.victronenergy.pvinverter,/Ac/PowerLimit,u,kW,1056,uint32,1,W +com.victronenergy.pvinverter,/Ac/L1/Power,i,W,1058,uint32,1,R +com.victronenergy.pvinverter,/Ac/L2/Power,i,W,1060,uint32,1,R +com.victronenergy.pvinverter,/Ac/L3/Power,i,W,1062,uint32,1,R +com.victronenergy.motordrive,/Motor/RPM,d,RPM,2048,int16,1,R +com.victronenergy.motordrive,/Motor/Temperature,d,Degrees celsius,2049,int16,10,R +com.victronenergy.motordrive,/Dc/0/Voltage,d,V DC,2050,uint16,100,R +com.victronenergy.motordrive,/Dc/0/Current,d,A DC,2051,int16,10,R +com.victronenergy.motordrive,/Dc/0/Power,d,W,2052,int16,10,R +com.victronenergy.motordrive,/Controller/Temperature,d,Degrees celsius,2053,int16,10,R +com.victronenergy.charger,/Dc/0/Voltage,d,V DC,2307,uint16,100,R +com.victronenergy.charger,/Dc/0/Current,d,A DC,2308,int16,10,R +com.victronenergy.charger,/Dc/0/Temperature,d,Degrees celsius,2309,int16,10,R +com.victronenergy.charger,/Dc/1/Voltage,d,V DC,2310,uint16,100,R +com.victronenergy.charger,/Dc/1/Current,d,A DC,2311,int16,10,R +com.victronenergy.charger,/Dc/2/Voltage,d,V DC,2312,uint16,100,R +com.victronenergy.charger,/Dc/2/Current,d,A DC,2313,int16,10,R +com.victronenergy.charger,/Ac/In/L1/I,d,A AC,2314,int16,10,R +com.victronenergy.charger,/Ac/In/L1/P,d,W DC,2315,uint16,1,R +com.victronenergy.charger,/Ac/In/CurrentLimit,d,A AC,2316,int16,10,W +com.victronenergy.charger,/Mode,i,0=Off;1=On;2=Error;3=Unavailable- Unknown,2317,uint16,1,W +com.victronenergy.charger,/State,i,0=Off;1=Low Power Mode;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply mode;252=External control,2318,uint16,1,R +com.victronenergy.charger,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,2319,uint16,1,R +com.victronenergy.charger,/Relay/0/State,i,0=Open;1=Closed,2320,uint16,1,R +com.victronenergy.charger,/Alarms/LowVoltage,i,0=No alarm;2=Alarm,2321,uint16,1,R +com.victronenergy.charger,/Alarms/HighVoltage,i,0=No alarm;2=Alarm,2322,uint16,1,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2600,int16,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2601,int16,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2602,int16,1,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2603,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2604,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2605,uint16,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2606,uint16,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2607,uint16,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2608,uint16,100,R +com.victronenergy.grid,/Serial,s,,2609,string[7],,R +com.victronenergy.grid,/Ac/L1/Voltage,d,V AC,2616,uint16,10,R +com.victronenergy.grid,/Ac/L1/Current,d,A AC,2617,int16,10,R +com.victronenergy.grid,/Ac/L2/Voltage,d,V AC,2618,uint16,10,R +com.victronenergy.grid,/Ac/L2/Current,d,A AC,2619,int16,10,R +com.victronenergy.grid,/Ac/L3/Voltage,d,V AC,2620,uint16,10,R +com.victronenergy.grid,/Ac/L3/Current,d,A AC,2621,int16,10,R +com.victronenergy.grid,/Ac/L1/Energy/Forward,d,kWh,2622,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Forward,d,kWh,2624,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Forward,d,kWh,2626,uint32,100,R +com.victronenergy.grid,/Ac/L1/Energy/Reverse,d,kWh,2628,uint32,100,R +com.victronenergy.grid,/Ac/L2/Energy/Reverse,d,kWh,2630,uint32,100,R +com.victronenergy.grid,/Ac/L3/Energy/Reverse,d,kWh,2632,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Forward,d,kWh,2634,uint32,100,R +com.victronenergy.grid,/Ac/Energy/Reverse,d,kWh,2636,uint32,100,R +com.victronenergy.grid,/Ac/L1/Power,d,W,2638,int32,1,R +com.victronenergy.grid,/Ac/L2/Power,d,W,2640,int32,1,R +com.victronenergy.grid,/Ac/L3/Power,d,W,2642,int32,1,R +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2700,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/AcPowerSetPoint,d,W,2703,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/MaxChargePercentage,d,%,2701,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePercentage,d,%,2702,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxDischargePower,d,W,2704,int16,0.1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeCurrent,d,A,2705,int16,1,W +com.victronenergy.settings,/Settings/CGwacs/MaxFeedInPower,d,W,2706,int16,0.01,W +com.victronenergy.settings,/Settings/CGwacs/OvervoltageFeedIn,i,0=Don't feed excess DC-coupled PV into grid;1=Feed excess DC-coupled PV into the grid,2707,uint16,1,W +com.victronenergy.settings,/Settings/CGwacs/PreventFeedback,i,0=Feed excess AC-coupled PV into grid;1=Don't feed excess AC-coupled PV into the grid,2708,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/MaxChargeVoltage,d,V,2710,uint16,10,W +com.victronenergy.settings,/Settings/SystemSetup/AcInput1,u,0=Unused;1=Grid;2=Genset;3=Shore,2711,uint16,1,W +com.victronenergy.settings,/Settings/SystemSetup/AcInput2,u,0=Unused;1=Grid;2=Genset;3=Shore,2712,uint16,1,W +com.victronenergy.hub4,/PvPowerLimiterActive,i,0=Feed-in limiting inactive;1=Feed-in limiting active,2709,uint16,1,R +com.victronenergy.tank,/ProductId,u,,3000,uint16,1,R +com.victronenergy.tank,/Capacity,d,m3,3001,uint32,10000,R +com.victronenergy.tank,/FluidType,u,0=Fuel;1=Fresh water;2=Waste water;3=Live well;4=Oil;5=Black water (sewage);6=Gasoline;7=Diesel;8=LPG;9=LNG;10=Hydraulic oil;11=Raw water,3003,uint16,1,R +com.victronenergy.tank,/Level,d,%,3004,uint16,10,R +com.victronenergy.tank,/Remaining,d,m3,3005,uint32,10000,R +com.victronenergy.tank,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3007,uint16,1,R +com.victronenergy.inverter,/ProductId,u,,3127,uint16,1,R +com.victronenergy.inverter,/FirmwareVersion,u,,3125,uint16,1,R +com.victronenergy.inverter,/Ac/Out/L1/I,d,A AC,3100,int16,10,R +com.victronenergy.inverter,/Ac/Out/L1/V,d,V AC,3101,uint16,10,R +com.victronenergy.inverter,/Ac/Out/L1/P,d,W AC,3102,int16,0.1,R +com.victronenergy.inverter,/Alarms/HighTemperature,u,0=No alarm;1=Warning;2=Alarm,3110,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltage,u,0=No alarm;1=Warning;2=Alarm,3111,uint16,1,R +com.victronenergy.inverter,/Alarms/HighVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3112,uint16,1,R +com.victronenergy.inverter,/Alarms/LowTemperature,u,0=No alarm;1=Warning;2=Alarm,3113,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltage,u,0=No alarm;1=Warning;2=Alarm,3114,uint16,1,R +com.victronenergy.inverter,/Alarms/LowVoltageAcOut,u,0=No alarm;1=Warning;2=Alarm,3115,uint16,1,R +com.victronenergy.inverter,/Alarms/Overload,u,0=No alarm;1=Warning;2=Alarm,3116,uint16,1,R +com.victronenergy.inverter,/Alarms/Ripple,u,0=No alarm;1=Warning;2=Alarm,3117,uint16,1,R +com.victronenergy.inverter,/Dc/0/Voltage,d,V DC,3105,uint16,100,R +com.victronenergy.inverter,/Dc/0/Current,d,A DC,3106,int16,10,R +com.victronenergy.inverter,/Mode,u,2=On;4=Off;5=Eco,3126,uint16,1,W +com.victronenergy.inverter,/State,u,0=Off;1=Low power mode (search mode);2=Fault;9=Inverting (on),3128,uint16,1,R +com.victronenergy.inverter,/Energy/InverterToAcOut,d,kWh,3130,uint32,100,R +com.victronenergy.inverter,/Energy/OutToInverter,d,kWh,3132,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToAcOut,d,kWh,3134,uint32,100,R +com.victronenergy.inverter,/Energy/SolarToBattery,d,kWh,3136,uint32,100,R +com.victronenergy.inverter,/Pv/V,d,V DC,3138,uint16,10,R +com.victronenergy.inverter,/Pv/0/V,d,V DC,3140,uint16,10,R +com.victronenergy.inverter,/Pv/1/V,d,V DC,3141,uint16,10,R +com.victronenergy.inverter,/Pv/2/V,d,V DC,3142,uint16,10,R +com.victronenergy.inverter,/Pv/3/V,d,V DC,3143,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/Yield,d,kWh,3148,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/Yield,d,kWh,3149,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/Yield,d,kWh,3150,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/Yield,d,kWh,3151,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/Yield,d,kWh,3152,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/Yield,d,kWh,3153,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/Yield,d,kWh,3154,uint16,10,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/Yield,d,kWh,3155,uint16,10,R +com.victronenergy.inverter,/History/Daily/0/Pv/0/MaxPower,d,W,3156,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/1/MaxPower,d,W,3157,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/2/MaxPower,d,W,3158,uint16,1,R +com.victronenergy.inverter,/History/Daily/0/Pv/3/MaxPower,d,W,3159,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/0/MaxPower,d,W,3160,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/1/MaxPower,d,W,3161,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/2/MaxPower,d,W,3162,uint16,1,R +com.victronenergy.inverter,/History/Daily/1/Pv/3/MaxPower,d,W,3163,uint16,1,R +com.victronenergy.inverter,/Pv/0/P,d,W,3164,uint16,1,R +com.victronenergy.inverter,/Pv/1/P,d,W,3165,uint16,1,R +com.victronenergy.inverter,/Pv/2/P,d,W,3166,uint16,1,R +com.victronenergy.inverter,/Pv/3/P,d,W,3167,uint16,1,R +com.victronenergy.inverter,/Alarms/LowSoc,u,,3168,uint16,1,R +com.victronenergy.inverter,/Pv/0/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3169,uint16,1,R +com.victronenergy.inverter,/Pv/1/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3170,uint16,1,R +com.victronenergy.inverter,/Pv/2/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3171,uint16,1,R +com.victronenergy.inverter,/Pv/3/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,3172,uint16,1,R +com.victronenergy.genset,/ProductId,u,,3212,uint16,1,R +com.victronenergy.genset,/StatusCode,u,0=Standby;1=Startup 1;2=Startup 2;3=Startup 3;4=Startup 4;5=Startup 5;6=Startup 6;7=Startup 7;8=Running;9=Stopping;10=Error,3213,uint16,1,R +com.victronenergy.genset,/ErrorCode,u,0=No error;1=AC voltage L1 too low;2=AC frequency L1 too low;3=AC current too low;4=AC power too low;5=Emergency stop;6=Servo current too low;7=Oil pressure too low;8=Engine temperature too low;9=Winding temperature too low;10=Exhaust temperature too low;13=Starter current too low;14=Glow current too low;15=Glow current too low;16=Fuel holding magnet current too low;17=Stop solenoid hold coil current too low;18=Stop solenoid pull coil current too low;19=Optional DC out current too low;20=5V output voltage too low;21=Boost output current too low;22=Panel supply current too high;25=Starter battery voltage too low;26=Startup aborted (rotation too low);28=Rotation too low;29=Power contactor current too low;30=AC voltage L2 too low;31=AC frequency L2 too low;32=AC current L2 too low;33=AC power L2 too low;34=AC voltage L3 too low;35=AC frequency L3 too low;36=AC current L3 too low;37=AC power L3 too low;62=Fuel temperature too low;63=Fuel level too low;65=AC voltage L1 too high;66=AC frequency too high;67=AC current too high;68=AC power too high;70=Servo current too high;71=Oil pressure too high;72=Engine temperature too high;73=Winding temperature too high;74=Exhaust temperature too low;77=Starter current too low;78=Glow current too high;79=Glow current too high;80=Fuel holding magnet current too high;81=Stop solenoid hold coil current too high;82=Stop solenoid pull coil current too high;83=Optional DC out current too high;84=5V output voltage too high;85=Boost output current too high;89=Starter battery voltage too high;90=Startup aborted (rotation too high);92=Rotation too high;93=Power contactor current too high;94=AC voltage L2 too high;95=AC frequency L2 too high;96=AC current L2 too high;97=AC power L2 too high;98=AC voltage L3 too high;99=AC frequency L3 too high;100=AC current L3 too high;101=AC power L3 too high;126=Fuel temperature too high;127=Fuel level too high;130=Lost control unit;131=Lost panel;132=Service needed;133=Lost 3-phase module;134=Lost AGT module;135=Synchronization failure;137=Intake airfilter;139=Lost sync. module;140=Load-balance failed;141=Sync-mode deactivated;142=Engine controller;148=Rotating field wrong;149=Fuel level sensor lost;150=Init failed;151=Watchdog;152=Out: winding;153=Out: exhaust;154=Out: Cyl. head;155=Inverter over temperature;156=Inverter overload;157=Inverter communication lost;158=Inverter sync failed;159=CAN communication lost;160=L1 overload;161=L2 overload;162=L3 overload;163=DC overload;164=DC overvoltage;165=Emergency stop;166=No connection,3214,uint16,1,R +com.victronenergy.genset,/AutoStart,u,0=Disabled;1=Enabled,3215,uint16,1,R +com.victronenergy.genset,/Start,u,0=Stop;1=Start,3223,uint16,1,W +com.victronenergy.genset,/Engine/Load,d,%,3216,uint16,1,R +com.victronenergy.genset,/Engine/Speed,d,RPM,3217,uint16,1,R +com.victronenergy.genset,/Engine/OperatingHours,d,s,3218,uint16,0.01,R +com.victronenergy.genset,/Engine/CoolantTemperature,d,Degrees celsius,3219,int16,10,R +com.victronenergy.genset,/Engine/WindingTemperature,d,Degrees celsius,3220,int16,10,R +com.victronenergy.genset,/Engine/ExaustTemperature,d,Degrees celsius,3221,int16,10,R +com.victronenergy.genset,/StarterVoltage,d,V DC,3222,uint16,100,R +com.victronenergy.genset,/Engine/OilPressure,d,kPa,3224,int16,1,R +com.victronenergy.genset,/Ac/L1/Voltage,d,V AC,3200,uint16,10,R +com.victronenergy.genset,/Ac/L1/Current,d,A AC,3203,int16,10,R +com.victronenergy.genset,/Ac/L1/Power,d,W,3206,int16,1,R +com.victronenergy.genset,/Ac/L1/Frequency,d,Hz,3209,uint16,100,R +com.victronenergy.genset,/Ac/L2/Voltage,d,V AC,3201,uint16,10,R +com.victronenergy.genset,/Ac/L2/Current,d,A AC,3204,int16,10,R +com.victronenergy.genset,/Ac/L2/Power,d,W,3207,int16,1,R +com.victronenergy.genset,/Ac/L2/Frequency,d,Hz,3210,uint16,100,R +com.victronenergy.genset,/Ac/L3/Voltage,d,V AC,3202,uint16,10,R +com.victronenergy.genset,/Ac/L3/Current,d,A AC,3205,int16,10,R +com.victronenergy.genset,/Ac/L3/Power,d,W,3208,int16,1,R +com.victronenergy.genset,/Ac/L3/Frequency,d,Hz,3211,uint16,100,R +com.victronenergy.temperature,/ProductId,u,,3300,uint16,1,R +com.victronenergy.temperature,/Scale,d,,3301,uint16,100,R +com.victronenergy.temperature,/Offset,d,,3302,int16,100,R +com.victronenergy.temperature,/TemperatureType,u,0=Battery;1=Fridge;2=Generic,3303,uint16,1,R +com.victronenergy.temperature,/Temperature,d,Degrees celsius,3304,int16,100,R +com.victronenergy.temperature,/Status,u,0=OK;1=Disconnected;2=Short circuited;3=Reverse Polarity;4=Unknown,3305,uint16,1,R +com.victronenergy.temperature,/Humidity,u,%,3306,uint16,10,R +com.victronenergy.temperature,/BatteryVoltage,d,V,3307,uint16,100,R +com.victronenergy.temperature,/Pressure,u,hPa,3308,uint16,1,R +com.victronenergy.pulsemeter,/Aggregate,i,,3400,uint32,1,R +com.victronenergy.pulsemeter,/Count,i,,3402,uint32,1,R +com.victronenergy.digitalinput,/Count,i,,3420,uint32,1,R +com.victronenergy.digitalinput,/State,i,,3422,uint16,1,R +com.victronenergy.digitalinput,/Alarm,i,0=No alarm;2=Alarm,3423,uint16,1,R +com.victronenergy.digitalinput,/Type,i,2=Door;3=Bilge pump;4=Bilge alarm;5=Burglar alarm;6=Smoke alarm;7=Fire alarm;8=CO2 alarm;9=Generator,3424,uint16,1,R +com.victronenergy.generator,/ManualStart,i,0=Stop generator;1=Start generator,3500,uint16,1,W +com.victronenergy.generator,/RunningByConditionCode,i,0=Stopped;1=Manual;2=TestRun;3=LossOfComms;4=Soc;5=AcLoad;6=BatteryCurrent;7=BatteryVoltage;8=InverterTemperatur;9=InverterOverload;10=StopOnAc1,3501,uint16,1,R +com.victronenergy.generator,/Runtime,i,seconds,3502,uint16,1,R +com.victronenergy.generator,/QuietHours,i,0=Quiet hours inactive; 1=Quiet hours active,3503,uint16,1,R +com.victronenergy.generator,/Runtime,u,seconds,3504,uint32,1,R +com.victronenergy.generator,/State,i,0=Stopped;1=Running;10=Error,3506,uint16,1,R +com.victronenergy.generator,/Error,i,0=No Error;1=Remote disabled;2=Remote fault,3507,uint16,1,R +com.victronenergy.generator,/Alarms/NoGeneratorAtAcIn,i,0=No Alarm;2=Alarm,3508,uint16,1,R +com.victronenergy.generator,/AutoStartEnabled,i,0=Autostart disabled;1=Autostart enabled,3509,uint16,1,W +com.victronenergy.generator,/ServiceCounter,u,seconds,3510,uint32,1,R +com.victronenergy.generator,/ServiceCounterReset,u,1=Reset,3512,uint16,1,W +com.victronenergy.meteo,/Irradiance,d,W/m^2,3600,uint16,10,R +com.victronenergy.meteo,/WindSpeed,d,m/s,3601,uint16,10,R +com.victronenergy.meteo,/CellTemperature,d,Degrees celsius,3602,int16,10,R +com.victronenergy.meteo,/ExternalTemperature,d,Degrees celsius,3603,int16,10,R +com.victronenergy.meteo,/ExternalTemperature2,d,Degrees celsius,3604,int16,10,R +com.victronenergy.evcharger,/ProductId,u,,3800,uint16,1,R +com.victronenergy.evcharger,/FirmwareVersion,u,,3802,uint32,1,R +com.victronenergy.evcharger,/Serial,s,,3804,string[6],,R +com.victronenergy.evcharger,/Model,s,,3810,string[4],,R +com.victronenergy.evcharger,/MaxCurrent,d,A,3814,uint16,1,W +com.victronenergy.evcharger,/Mode,u,0=Manual;1=Auto,3815,uint16,1,W +com.victronenergy.evcharger,/Ac/Energy/Forward,d,kWh,3816,uint32,100,R +com.victronenergy.evcharger,/Ac/L1/Power,d,W,3818,uint16,1,R +com.victronenergy.evcharger,/Ac/L2/Power,d,W,3819,uint16,1,R +com.victronenergy.evcharger,/Ac/L3/Power,d,W,3820,uint16,1,R +com.victronenergy.evcharger,/Ac/Power,d,W,3821,uint16,1,R +com.victronenergy.evcharger,/ChargingTime,d,s,3822,uint16,0.01,R +com.victronenergy.evcharger,/Current,d,A,3823,uint16,1,W +com.victronenergy.evcharger,/Status,u,0=Disconnected;1=Connected;2=Charging;3=Charged;4=Waiting for sun;5=Waiting for RFID;6=Waiting for start;7=Low SOC;8=Ground fault;9=Welded contacts;10=CP Input shorted;11=Residual current detected;12=Under voltage detected;13=Overvoltage detected;14=Overheating detected,3824,uint16,1,R +com.victronenergy.evcharger,/SetCurrent,d,A,3825,uint16,1,W +com.victronenergy.evcharger,/StartStop,u,0=Stop;1=Start,3826,uint16,1,W +com.victronenergy.evcharger,/Position,i,0=AC input 1;1=AC output;2=AC input 2,3827,uint16,1,W +com.victronenergy.acload,/Ac/L1/Power,d,W,3900,int16,1,R +com.victronenergy.acload,/Ac/L2/Power,d,W,3901,int16,1,R +com.victronenergy.acload,/Ac/L3/Power,d,W,3902,int16,1,R +com.victronenergy.acload,/Serial,s,,3903,string[7],,R +com.victronenergy.acload,/Ac/L1/Voltage,d,V AC,3910,uint16,10,R +com.victronenergy.acload,/Ac/L1/Current,d,A AC,3911,int16,10,R +com.victronenergy.acload,/Ac/L2/Voltage,d,V AC,3912,uint16,10,R +com.victronenergy.acload,/Ac/L2/Current,d,A AC,3913,int16,10,R +com.victronenergy.acload,/Ac/L3/Voltage,d,V AC,3914,uint16,10,R +com.victronenergy.acload,/Ac/L3/Current,d,A AC,3915,int16,10,R +com.victronenergy.acload,/Ac/L1/Energy/Forward,d,kWh,3916,uint32,100,R +com.victronenergy.acload,/Ac/L2/Energy/Forward,d,kWh,3918,uint32,100,R +com.victronenergy.acload,/Ac/L3/Energy/Forward,d,kWh,3920,uint32,100,R +com.victronenergy.fuelcell,/Dc/0/Voltage,d,V DC,4000,uint16,100,R +com.victronenergy.fuelcell,/Dc/0/Current,d,A DC,4001,int16,10,R +com.victronenergy.fuelcell,/Dc/1/Voltage,d,V DC,4002,int16,10,R +com.victronenergy.fuelcell,/Dc/0/Temperature,d,Degrees celsius,4003,int16,10,R +com.victronenergy.fuelcell,/History/EnergyOut,d,kWh,4004,uint32,100,R +com.victronenergy.fuelcell,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4006,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4007,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4008,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4009,uint16,1,R +com.victronenergy.fuelcell,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4010,uint16,1,R +com.victronenergy.fuelcell,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4011,uint16,1,R +com.victronenergy.alternator,/Dc/0/Voltage,d,V DC,4100,uint16,100,R +com.victronenergy.alternator,/Dc/0/Current,d,A DC,4101,int16,10,R +com.victronenergy.alternator,/Dc/1/Voltage,d,V DC,4102,int16,10,R +com.victronenergy.alternator,/Dc/0/Temperature,d,Degrees celsius,4103,int16,10,R +com.victronenergy.alternator,/History/EnergyOut,d,kWh,4104,uint32,100,R +com.victronenergy.alternator,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4106,uint16,1,R +com.victronenergy.alternator,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4107,uint16,1,R +com.victronenergy.alternator,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4108,uint16,1,R +com.victronenergy.alternator,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4109,uint16,1,R +com.victronenergy.alternator,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4110,uint16,1,R +com.victronenergy.alternator,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4111,uint16,1,R +com.victronenergy.alternator,/State,u,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;252=External control,4112,uint16,1,R +com.victronenergy.alternator,/ErrorCode,u,12=High battery temperature;13=High battery voltage;14=Low battery voltage;15=VBat exceeds $CPB;21=High alternator temperature;22=Alternator overspeed;24=Internal error;41=High field FET temperature;42=Sensor missing;43=Low VAlt;44=High Voltage offset;45=VAlt exceeds $CPB;51-52=Battery disconnect request;53=Battery instance out of range;54=Too many BMSes;55=AEBus fault;56=Too many Victron devices;58-61=Battery requested disconnection;91=BMS lost;92=Forced idle;201=DCDC converter fail;201-207=DCDC error,4113,uint16,1,R +com.victronenergy.alternator,/Engine/Speed,d,RPM,4114,uint16,1,R +com.victronenergy.alternator,/Speed,d,RPM,4115,uint16,1,R +com.victronenergy.alternator,/FieldDrive,q,%,4116,uint16,1,R +com.victronenergy.dcsource,/Dc/0/Voltage,d,V DC,4200,uint16,100,R +com.victronenergy.dcsource,/Dc/0/Current,d,A DC,4201,int16,10,R +com.victronenergy.dcsource,/Dc/1/Voltage,d,V DC,4202,int16,10,R +com.victronenergy.dcsource,/Dc/0/Temperature,d,Degrees centigrade,4203,int16,10,R +com.victronenergy.dcsource,/History/EnergyOut,d,kWh,4204,uint32,100,R +com.victronenergy.dcsource,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4206,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4207,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4208,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4209,uint16,1,R +com.victronenergy.dcsource,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4210,uint16,1,R +com.victronenergy.dcsource,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4211,uint16,1,R +com.victronenergy.dcload,/Dc/0/Voltage,d,V DC,4300,uint16,100,R +com.victronenergy.dcload,/Dc/0/Current,d,A DC,4301,int16,10,R +com.victronenergy.dcload,/Dc/1/Voltage,d,V DC,4302,int16,10,R +com.victronenergy.dcload,/Dc/0/Temperature,d,Degrees centigrade,4303,int16,10,R +com.victronenergy.dcload,/History/EnergyIn,d,kWh,4304,uint32,100,R +com.victronenergy.dcload,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4306,uint16,1,R +com.victronenergy.dcload,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4307,uint16,1,R +com.victronenergy.dcload,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4308,uint16,1,R +com.victronenergy.dcload,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4309,uint16,1,R +com.victronenergy.dcload,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4310,uint16,1,R +com.victronenergy.dcload,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4311,uint16,1,R +com.victronenergy.dcsystem,/Dc/0/Voltage,d,V DC,4400,uint16,100,R +com.victronenergy.dcsystem,/Dc/0/Current,d,A DC,4401,int16,10,R +com.victronenergy.dcsystem,/Dc/1/Voltage,d,V DC,4402,int16,10,R +com.victronenergy.dcsystem,/Dc/0/Temperature,d,Degrees centigrade,4403,int16,10,R +com.victronenergy.dcsystem,/History/EnergyOut,d,kWh,4404,uint32,100,R +com.victronenergy.dcsystem,/History/EnergyIn,d,kWh,4406,uint32,100,R +com.victronenergy.dcsystem,/Alarms/LowVoltage,u,0=No alarm;2=Alarm,4408,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighVoltage,u,0=No alarm;2=Alarm,4409,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowStarterVoltage,u,0=No alarm;2=Alarm,4410,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighStarterVoltage,u,0=No alarm;2=Alarm,4411,uint16,1,R +com.victronenergy.dcsystem,/Alarms/LowTemperature,u,0=No alarm;2=Alarm,4412,uint16,1,R +com.victronenergy.dcsystem,/Alarms/HighTemperature,u,0=No alarm;2=Alarm,4413,uint16,1,R +com.victronenergy.multi,/Ac/In/1/L1/V,d,V AC,4500,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/V,d,V AC,4501,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/V,d,V AC,4502,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/I,d,A AC,4503,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L2/I,d,A AC,4504,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L3/I,d,A AC,4505,uint16,10,R +com.victronenergy.multi,/Ac/In/1/L1/P,d,W,4506,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L2/P,d,W,4507,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L3/P,d,W,4508,int16,0.1,R +com.victronenergy.multi,/Ac/In/1/L1/F,d,Hz,4509,uint16,100,R +com.victronenergy.multi,/Ac/Out/L1/V,d,V AC,4510,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/V,d,V AC,4511,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/V,d,V AC,4512,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/I,d,A AC,4513,uint16,10,R +com.victronenergy.multi,/Ac/Out/L2/I,d,A AC,4514,uint16,10,R +com.victronenergy.multi,/Ac/Out/L3/I,d,A AC,4515,uint16,10,R +com.victronenergy.multi,/Ac/Out/L1/P,d,W,4516,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L2/P,d,W,4517,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L3/P,d,W,4518,int16,0.1,R +com.victronenergy.multi,/Ac/Out/L1/F,d,Hz,4519,uint16,100,R +com.victronenergy.multi,/Ac/In/1/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4520,uint16,1,R +com.victronenergy.multi,/Ac/In/2/Type,u,0=Unused;1=Grid;2=Genset;3=Shore,4521,uint16,1,R +com.victronenergy.multi,/Ac/In/1/CurrentLimit,d,A,4522,uint16,10,W +com.victronenergy.multi,/Ac/In/2/CurrentLimit,d,A,4523,uint16,10,W +com.victronenergy.multi,/Ac/NumberOfPhases,u,count,4524,uint16,1,R +com.victronenergy.multi,/Ac/ActiveIn/ActiveInput,u,0=AC Input 1;1=AC Input 2;240=Disconnected,4525,uint16,1,R +com.victronenergy.multi,/Dc/0/Voltage,d,V DC,4526,uint16,100,R +com.victronenergy.multi,/Dc/0/Current,d,A DC,4527,int16,10,R +com.victronenergy.multi,/Dc/0/Temperature,d,Degrees celsius,4528,int16,10,R +com.victronenergy.multi,/Soc,d,%,4529,uint16,10,R +com.victronenergy.multi,/State,u,0=Off;1=Low Power;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize;8=Passthru;9=Inverting;10=Power assist;11=Power supply;252=External control,4530,uint16,1,R +com.victronenergy.multi,/Mode,u,1=Charger Only;2=Inverter Only;3=On;4=Off,4531,uint16,1,W +com.victronenergy.multi,/Alarms/HighTemperature,u,0=Ok;1=Warning;2=Alarm,4532,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltage,u,0=Ok;1=Warning;2=Alarm,4533,uint16,1,R +com.victronenergy.multi,/Alarms/HighVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4534,uint16,1,R +com.victronenergy.multi,/Alarms/LowTemperature,u,0=Ok;1=Warning;2=Alarm,4535,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltage,u,0=Ok;1=Warning;2=Alarm,4536,uint16,1,R +com.victronenergy.multi,/Alarms/LowVoltageAcOut,u,0=Ok;1=Warning;2=Alarm,4537,uint16,1,R +com.victronenergy.multi,/Alarms/Overload,u,0=Ok;1=Warning;2=Alarm,4538,uint16,1,R +com.victronenergy.multi,/Alarms/Ripple,u,0=Ok;1=Warning;2=Alarm,4539,uint16,1,R +com.victronenergy.multi,/Yield/Power,d,W,4540,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4541,uint16,10,R +com.victronenergy.multi,/Relay/0/State,i,0=Open;1=Closed,4542,uint16,1,R +com.victronenergy.multi,/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4543,uint16,1,R +com.victronenergy.multi,/Pv/V,d,V DC,4544,uint16,10,R +com.victronenergy.multi,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,4545,uint16,1,R +com.victronenergy.multi,/Energy/AcIn1ToAcOut,d,kWh,4546,uint32,100,R +com.victronenergy.multi,/Energy/AcIn1ToInverter,d,kWh,4548,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToAcOut,d,kWh,4550,uint32,100,R +com.victronenergy.multi,/Energy/AcIn2ToInverter,d,kWh,4552,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn1,d,kWh,4554,uint32,100,R +com.victronenergy.multi,/Energy/AcOutToAcIn2,d,kWh,4556,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn1,d,kWh,4558,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcIn2,d,kWh,4560,uint32,100,R +com.victronenergy.multi,/Energy/InverterToAcOut,d,kWh,4562,uint32,100,R +com.victronenergy.multi,/Energy/OutToInverter,d,kWh,4564,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn1,d,kWh,4566,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcIn2,d,kWh,4568,uint32,100,R +com.victronenergy.multi,/Energy/SolarToAcOut,d,kWh,4570,uint32,100,R +com.victronenergy.multi,/Energy/SolarToBattery,d,kWh,4572,uint32,100,R +com.victronenergy.multi,/History/Daily/0/Yield,d,kWh,4574,uint16,10,R +com.victronenergy.multi,/History/Daily/0/MaxPower,d,W,4575,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Yield,d,kWh,4576,uint16,10,R +com.victronenergy.multi,/History/Daily/1/MaxPower,d,W,4577,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/0/Yield,d,kWh,4578,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/1/Yield,d,kWh,4579,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/2/Yield,d,kWh,4580,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/3/Yield,d,kWh,4581,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/0/Yield,d,kWh,4582,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/1/Yield,d,kWh,4583,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/2/Yield,d,kWh,4584,uint16,10,R +com.victronenergy.multi,/History/Daily/1/Pv/3/Yield,d,kWh,4585,uint16,10,R +com.victronenergy.multi,/History/Daily/0/Pv/0/MaxPower,d,W,4586,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/1/MaxPower,d,W,4587,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/2/MaxPower,d,W,4588,uint16,1,R +com.victronenergy.multi,/History/Daily/0/Pv/3/MaxPower,d,W,4589,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/0/MaxPower,d,W,4590,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/1/MaxPower,d,W,4591,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/2/MaxPower,d,W,4592,uint16,1,R +com.victronenergy.multi,/History/Daily/1/Pv/3/MaxPower,d,W,4593,uint16,1,R +com.victronenergy.multi,/Pv/0/V,d,V DC,4594,uint16,10,R +com.victronenergy.multi,/Pv/1/V,d,V DC,4595,uint16,10,R +com.victronenergy.multi,/Pv/2/V,d,V DC,4596,uint16,10,R +com.victronenergy.multi,/Pv/3/V,d,V DC,4597,uint16,10,R +com.victronenergy.multi,/Pv/0/P,d,W,4598,uint16,1,R +com.victronenergy.multi,/Pv/1/P,d,W,4599,uint16,1,R +com.victronenergy.multi,/Pv/2/P,d,W,4600,uint16,1,R +com.victronenergy.multi,/Pv/3/P,d,W,4601,uint16,1,R +com.victronenergy.multi,/Alarms/LowSoc,u,,4602,uint16,1,R +com.victronenergy.multi,/Yield/User,d,kWh,4603,uint32,1,R +com.victronenergy.multi,/Pv/0/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4605,uint16,1,R +com.victronenergy.multi,/Pv/1/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4606,uint16,1,R +com.victronenergy.multi,/Pv/2/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4607,uint16,1,R +com.victronenergy.multi,/Pv/3/MppOperationMode,i,0=Off;1=Voltage/current limited;2=MPPT active;255=Not available,4608,uint16,1,R +com.victronenergy.pump,/State,d,0=Stopped;1=Running,4700,uint16,1,R +com.victronenergy.settings,/Settings/Pump0/AutoStartEnabled,d,0=Disabled;1=Enabled,4701,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/Mode,d,0=Auto;1=On;2=Off,4702,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/StartValue,d,%,4703,uint16,1,W +com.victronenergy.settings,/Settings/Pump0/StopValue,d,%,4704,uint16,1,W +com.victronenergy.dcdc,/ProductId,u,,4800,uint16,1,R +com.victronenergy.dcdc,/FirmwareVersion,u,,4801,uint32,1,R +com.victronenergy.dcdc,/ErrorCode,i,0=No error;1=Battery temperature too high;2=Battery voltage too high;3=Battery temperature sensor miswired (+);4=Battery temperature sensor miswired (-);5=Battery temperature sensor disconnected;6=Battery voltage sense miswired (+);7=Battery voltage sense miswired (-);8=Battery voltage sense disconnected;9=Battery voltage wire losses too high;17=Charger temperature too high;18=Charger over-current;19=Charger current polarity reversed;20=Bulk time limit reached;22=Charger temperature sensor miswired;23=Charger temperature sensor disconnected;34=Input current too high,4803,uint16,1,R +com.victronenergy.dcdc,/Dc/0/Voltage,d,V DC,4804,uint16,100,R +com.victronenergy.dcdc,/Dc/0/Current,d,A DC,4805,int16,10,R +com.victronenergy.dcdc,/Dc/0/Temperature,d,Degrees celsius,4806,int16,10,R +com.victronenergy.dcdc,/Mode,u,1=On;4=Off,4807,uint16,1,W +com.victronenergy.dcdc,/State,i,0=Off;2=Fault;3=Bulk;4=Absorption;5=Float;6=Storage;7=Equalize,4808,uint16,1,R +com.victronenergy.dcdc,/Dc/In/V,d,V DC,4809,uint16,100,R +com.victronenergy.dcdc,/Dc/In/P,d,W,4810,uint16,1,R +com.victronenergy.dcdc,/History/Cumulative/User/ChargedAh,d,Ah,4811,uint16,10,R diff --git a/FileSets/v3.30~1/dbus_digitalinputs.py b/FileSets/v3.30~1/dbus_digitalinputs.py new file mode 100755 index 00000000..a49e9c6e --- /dev/null +++ b/FileSets/v3.30~1/dbus_digitalinputs.py @@ -0,0 +1,651 @@ +#!/usr/bin/python3 -u + +#### modified for ExtTransferSwitch package + +import sys, os +import signal +from threading import Thread +from select import select, epoll, EPOLLPRI +from functools import partial +from collections import namedtuple +from argparse import ArgumentParser +import traceback +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) + +from dbus.mainloop.glib import DBusGMainLoop +import dbus +from gi.repository import GLib +from vedbus import VeDbusService, VeDbusItemImport +from settingsdevice import SettingsDevice + +VERSION = '0.23' +MAXCOUNT = 2**31-1 +SAVEINTERVAL = 60000 + +INPUT_FUNCTION_COUNTER = 1 +INPUT_FUNCTION_INPUT = 2 + +Translation = namedtuple('Translation', ['no', 'yes']) + +# Only append at the end +INPUTTYPES = [ + 'Disabled', + 'Pulse meter', + 'Door', + 'Bilge pump', + 'Bilge alarm', + 'Burglar alarm', + 'Smoke alarm', + 'Fire alarm', + 'CO2 alarm', + 'Generator', + 'Generic I/O', + 'Touch enable', +#### added for ExtTransferSwitch package -- must be LAST in the list + 'Transfer switch' +] + +# Translations. The text will be used only for GetText, it will be translated +# in the gui. +TRANSLATIONS = [ + Translation('low', 'high'), + Translation('off', 'on'), + Translation('no', 'yes'), + Translation('open', 'closed'), + Translation('ok', 'alarm'), + Translation('running', 'stopped'), +#### added for ExtTransferSwitch package + Translation('on generator', 'on grid') +] + +class SystemBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SYSTEM) + +class SessionBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SESSION) + +class BasePulseCounter(object): + pass + +class DebugPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + self.gpiomap[gpio] = None + return 0 + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + for level in cycle([0, 1]): + for gpio in list(self.gpiomap.keys()): + yield gpio, level + sleep(0.25/len(self.gpiomap)) + +class EpollPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + self.states = {} + self.ob = epoll() + + def register(self, path, gpio): + path = os.path.realpath(path) + + # Set up gpio for rising edge interrupts + with open(os.path.join(path, 'edge'), 'ab') as fp: + fp.write(b'both') + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) # flush it in case it's high at startup + self.gpiomap[gpio] = fp + self.states[gpio] = level + self.ob.register(fp, EPOLLPRI) + return level + + def unregister(self, gpio): + fp = self.gpiomap[gpio] + self.ob.unregister(fp) + del self.gpiomap[gpio] + del self.states[gpio] + fp.close() + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + while True: + # We have a timeout of 1 second on the poll, because poll() only + # looks at files in the epoll object at the time poll() was called. + # The timeout means we let other files (added via calls to + # register/unregister) into the loop at least that often. + self.ob.poll(1) + + # When coming out of the epoll call, we read all the gpios to make + # sure we didn't miss any edges. This is a safety fallback that + # ensures everything is up to date once a second, but + # edge-triggered results are handled immediately. + # NOTE: There has not been a report of a missed interrupt yet. + # Belts and suspenders. + for gpio, fp in list(self.gpiomap.items()): + os.lseek(fp.fileno(), 0, os.SEEK_SET) + v = int(os.read(fp.fileno(), 1)) + if v != self.states[gpio]: + self.states[gpio] = v + yield gpio, v + +class PollingPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + path = os.path.realpath(path) + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) + self.gpiomap[gpio] = [fp, level] + return level + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + while True: + for gpio, (fp, level) in list(self.gpiomap.items()): + fp.seek(0, os.SEEK_SET) + v = int(fp.read()) + if v != level: + self.gpiomap[gpio][1] = v + yield gpio, v + sleep(1) + +class HandlerMaker(type): + """ Meta-class for keeping track of all extended classes. """ + def __init__(cls, name, bases, attrs): + if not hasattr(cls, 'handlers'): + cls.handlers = {} + else: + cls.handlers[cls.type_id] = cls + +class PinHandler(object, metaclass=HandlerMaker): + product_id = 0xFFFF + _product_name = 'Generic GPIO' + dbus_name = "digital" + def __init__(self, bus, base, path, gpio, settings): + self.gpio = gpio + self.path = path + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + self.service = VeDbusService( + "{}.{}.input{:02d}".format(base, self.dbus_name, gpio), bus=bus) + + # Add objects required by ve-api + self.service.add_path('/Mgmt/ProcessName', __file__) + self.service.add_path('/Mgmt/ProcessVersion', VERSION) + self.service.add_path('/Mgmt/Connection', path) + self.service.add_path('/DeviceInstance', gpio) + self.service.add_path('/ProductId', self.product_id) + self.service.add_path('/ProductName', self.product_name) + self.service.add_path('/Connected', 1) + + # Custom name setting + def _change_name(p, v): + # This should fire a change event that will update product_name + # below. + settings['name'] = v + return True + + self.service.add_path('/CustomName', settings['name'], writeable=True, + onchangecallback=_change_name) + + # We'll count the pulses for all types of services + self.service.add_path('/Count', value=settings['count']) + + @property + def product_name(self): + return self.settings['name'] or self._product_name + + @product_name.setter + def product_name(self, v): + # Some pin types don't have an associated service (Disabled pins for + # example) + if self.service is not None: + self.service['/ProductName'] = v or self._product_name + + def deactivate(self): + self.save_count() + self.service.__del__() + del self.service + self.service = None + + @property + def level(self): + return self._level + + @level.setter + def level(self, l): + self._level = int(bool(l)) + + def toggle(self, level): + raise NotImplementedError + + def _toggle(self, level, service): + # Only increment Count on rising edge. + if level and level != self._level: + service['/Count'] = (service['/Count']+1) % MAXCOUNT + self._level = level + + def refresh(self): + """ Toggle state to last remembered state. This is called if settings + are changed so the Service can recalculate paths. """ + self.toggle(self._level) + + def save_count(self): + if self.service is not None: + self.settings['count'] = self.count + + @property + def active(self): + return self.service is not None + + @property + def count(self): + return self.service['/Count'] + + @count.setter + def count(self, v): + self.service['/Count'] = v + + @classmethod + def createHandler(cls, _type, *args, **kwargs): + if _type in cls.handlers: + return cls.handlers[_type](*args, **kwargs) + return None + + +class NopPin(object): + """ Mixin for a pin with empty behaviour. Mix in BEFORE PinHandler so that + __init__ overrides the base behaviour. """ + def __init__(self, bus, base, path, gpio, settings): + self.service = None + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + def deactivate(self): + pass + + def toggle(self, level): + self._level = level + + def save_count(self): + # Do nothing + pass + + @property + def count(self): + return self.settings['count'] + + @count.setter + def count(self, v): + pass + + def refresh(self): + pass + + +class DisabledPin(NopPin, PinHandler): + """ Place holder for a disabled pin. """ + _product_name = 'Disabled' + type_id = 0 + + +class VolumeCounter(PinHandler): + product_id = 0xA165 + _product_name = "Generic pulse meter" + dbus_name = "pulsemeter" + type_id = 1 + + def __init__(self, bus, base, path, gpio, settings): + super(VolumeCounter, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/Aggregate', value=self.count*self.rate, + gettextcallback=lambda p, v: (str(v) + ' cubic meter')) + + @property + def rate(self): + return self.settings['rate'] + + def toggle(self, level): + with self.service as s: + super(VolumeCounter, self)._toggle(level, s) + s['/Aggregate'] = self.count * self.rate + +class TouchEnable(NopPin, PinHandler): + """ The pin is used to enable/disable the Touch screen when toggled. + No dbus-service is created. """ + _product_name = 'TouchEnable' + type_id = 11 + + def __init__(self, *args, **kwargs): + super(TouchEnable, self).__init__(*args, **kwargs) + self.item = VeDbusItemImport(self.bus, + "com.victronenergy.settings", "/Settings/Gui/TouchEnabled") + + def toggle(self, level): + super(TouchEnable, self).toggle(level) + + # Toggle the touch-enable setting on the downward edge. + # Level is expected to be high with the switch open, and + # pulled low when pushed. + if level == 0: + enabled = bool(self.item.get_value()) + self.item.set_value(int(not enabled)) + + def deactivate(self): + # Always re-enable touch when the pin is deactivated. + # This adds another layer of protection against accidental + # lockout. + self.item.set_value(1) + del self.item + +class PinAlarm(PinHandler): + product_id = 0xA166 + _product_name = "Generic digital input" + dbus_name = "digitalinput" + type_id = 0xFF + translation = 0 # low, high + + def __init__(self, bus, base, path, gpio, settings): + super(PinAlarm, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/InputState', value=0) + self.service.add_path('/State', value=self.get_state(0), + gettextcallback=lambda p, v: TRANSLATIONS[v//2][v%2]) + self.service.add_path('/Alarm', value=self.get_alarm_state(0)) + + # Also expose the type + self.service.add_path('/Type', value=self.type_id, + gettextcallback=lambda p, v: INPUTTYPES[v]) + + def toggle(self, level): + with self.service as s: + super(PinAlarm, self)._toggle(level, s) + s['/InputState'] = bool(level)*1 + s['/State'] = self.get_state(level) + # Ensure that the alarm flag resets if the /AlarmSetting config option + # disappears. + s['/Alarm'] = self.get_alarm_state(level) + + def get_state(self, level): + state = level ^ self.settings['invert'] + return 2 * self.translation + state + + def get_alarm_state(self, level): + return 2 * bool( + (level ^ self.settings['invertalarm']) and self.settings['alarm']) + + +class Generator(PinAlarm): + _product_name = "Generator" + type_id = 9 + translation = 5 # running, stopped + + def __init__(self, *args, **kwargs): + super(Generator, self).__init__(*args, **kwargs) + # Periodically rewrite the generator selection. The Multi may reset + # causing this to be lost, or a race condition on startup may cause + # it to not be set properly. + self._timer = GLib.timeout_add(30000, + lambda: self.select_generator(self.level ^ self.settings['invert'] ^ 1) or True) + +#### added for ExtTransferSwitch package + self.mainVeBusServiceItem = None +#### end added for ExtTransferSwitch package + + + def select_generator(self, v): + + # Find all vebus services, and let them know + try: + services = [n for n in self.bus.list_names() if n.startswith( + 'com.victronenergy.vebus.')] + for n in services: +#### added for ExtTransferSwitch package + # skip this service if it is the main VE.Bus device + # processing for that is handled in ExtTransferSwitch + try: + if self.mainVeBusServiceItem == None: + self.mainVeBusServiceItem = VeDbusItemImport(self.bus, + "com.victronenergy.service", "/VebusService") + if n == self.mainVeBusService.get_value (): + continue + except: + pass +#### end added for ExtTransferSwitch package + + self.bus.call_async(n, '/Ac/Control/RemoteGeneratorSelected', None, + 'SetValue', 'v', [v], None, None) + except dbus.exceptions.DBusException: + print ("DBus exception setting RemoteGeneratorSelected") + traceback.print_exc() + + def toggle(self, level): + super(Generator, self).toggle(level) + + # Follow the same inversion sense as for display + self.select_generator(level ^ self.settings['invert'] ^ 1) + + def deactivate(self): + super(Generator, self).deactivate() + # When deactivating, reset the generator selection state + self.select_generator(0) + + # And kill the periodic job + if self._timer is not None: + GLib.source_remove(self._timer) + self._timer = None + +# Various types of things we might want to monitor +class DoorSensor(PinAlarm): + _product_name = "Door alarm" + type_id = 2 + translation = 3 # open, closed + +class BilgePump(PinAlarm): + _product_name = "Bilge pump" + type_id = 3 + translation = 1 # off, on + +class BilgeAlarm(PinAlarm): + _product_name = "Bilge alarm" + type_id = 4 + translation = 4 # ok, alarm + +class BurglarAlarm(PinAlarm): + _product_name = "Burglar alarm" + type_id = 5 + translation = 4 # ok, alarm + +class SmokeAlarm(PinAlarm): + _product_name = "Smoke alarm" + type_id = 6 + translation = 4 # ok, alarm + +class FireAlarm(PinAlarm): + _product_name = "Fire alarm" + type_id = 7 + translation = 4 # ok, alarm + +class CO2Alarm(PinAlarm): + _product_name = "CO2 alarm" + type_id = 8 + translation = 4 # ok, alarm + +class GenericIO(PinAlarm): + _product_name = "Generic I/O" + type_id = 10 + translation = 0 # low, high + +#### added for ExtTransferSwitch package +class TransferSwitch(PinAlarm): + _product_name = "External AC Input transfer switch" + type_id = 12 + translation = 6 # Grid In / Generator In + + +def dbusconnection(): + return SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else SystemBus() + + +def main(): + parser = ArgumentParser(description=sys.argv[0]) + parser.add_argument('--servicebase', + help='Base service name on dbus, default is com.victronenergy', + default='com.victronenergy') + parser.add_argument('--poll', + help='Use a different kind of polling. Options are epoll, dumb and debug', + default='epoll') + parser.add_argument('inputs', nargs='+', help='Path to digital input') + args = parser.parse_args() + + PulseCounter = { + 'debug': DebugPulseCounter, + 'poll': PollingPulseCounter, + }.get(args.poll, EpollPulseCounter) + + DBusGMainLoop(set_as_default=True) + + # Keep track of enabled services + services = {} + inputs = dict(enumerate(args.inputs, 1)) + pulses = PulseCounter() # callable that iterates over pulses + + def register_gpio(path, gpio, bus, settings): + _type = settings['inputtype'] + print ("Registering GPIO {} for type {}".format(gpio, _type)) + + handler = PinHandler.createHandler(_type, + bus, args.servicebase, path, gpio, settings) + services[gpio] = handler + + # Only monitor if enabled + if _type > 0: + handler.level = pulses.register(path, gpio) + handler.refresh() + + def unregister_gpio(gpio): + print ("unRegistering GPIO {}".format(gpio)) + pulses.unregister(gpio) + services[gpio].deactivate() + + def handle_setting_change(inp, setting, old, new): + # This handler may also be called if some attribute of a setting + # is changed, but not the value. Bail if the value is unchanged. + if old == new: + return + + if setting == 'inputtype': + if new: + # Get current bus and settings objects, to be reused + service = services[inp] + bus, settings = service.bus, service.settings + + # Input enabled. If already enabled, unregister the old one first. + if pulses.registered(inp): + unregister_gpio(inp) + + # Before registering the new input, reset its settings to defaults + settings['count'] = 0 + settings['invert'] = 0 + settings['invertalarm'] = 0 + settings['alarm'] = 0 + + # Register it + register_gpio(inputs[inp], inp, bus, settings) + elif old: + # Input disabled + unregister_gpio(inp) + elif setting in ('rate', 'invert', 'alarm', 'invertalarm'): + services[inp].refresh() + elif setting == 'name': + services[inp].product_name = new + elif setting == 'count': + # Don't want this triggered on a period save, so only execute + # if it has changed. + v = int(new) + s = services[inp] + if s.count != v: + s.count = v + s.refresh() + + for inp, pth in inputs.items(): + supported_settings = { + 'inputtype': ['/Settings/DigitalInput/{}/Type'.format(inp), 0, 0, len(INPUTTYPES)-1], + 'rate': ['/Settings/DigitalInput/{}/Multiplier'.format(inp), 0.001, 0, 1.0], + 'count': ['/Settings/DigitalInput/{}/Count'.format(inp), 0, 0, MAXCOUNT, 1], + 'invert': ['/Settings/DigitalInput/{}/InvertTranslation'.format(inp), 0, 0, 1], + 'invertalarm': ['/Settings/DigitalInput/{}/InvertAlarm'.format(inp), 0, 0, 1], + 'alarm': ['/Settings/DigitalInput/{}/AlarmSetting'.format(inp), 0, 0, 1], + 'name': ['/Settings/DigitalInput/{}/CustomName'.format(inp), '', '', ''], + } + bus = dbusconnection() + sd = SettingsDevice(bus, supported_settings, partial(handle_setting_change, inp), timeout=10) + register_gpio(pth, inp, bus, sd) + + def poll(mainloop): + from time import time + idx = 0 + + try: + for inp, level in pulses(): + # epoll object only resyncs once a second. We may receive + # a pulse for something that's been deregistered. + try: + services[inp].toggle(level) + except KeyError: + continue + except: + traceback.print_exc() + mainloop.quit() + + # Need to run the gpio polling in separate thread. Pass in the mainloop so + # the thread can kill us if there is an exception. + mainloop = GLib.MainLoop() + + poller = Thread(target=lambda: poll(mainloop)) + poller.daemon = True + poller.start() + + # Periodically save the counter + def save_counters(): + for inp in inputs: + services[inp].save_count() + return True + GLib.timeout_add(SAVEINTERVAL, save_counters) + + # Save counter on shutdown + signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) + + try: + mainloop.run() + except KeyboardInterrupt: + pass + finally: + save_counters() + +if __name__ == "__main__": + main() diff --git a/FileSets/v3.30~1/dbus_digitalinputs.py.orig b/FileSets/v3.30~1/dbus_digitalinputs.py.orig new file mode 100755 index 00000000..67f5a398 --- /dev/null +++ b/FileSets/v3.30~1/dbus_digitalinputs.py.orig @@ -0,0 +1,619 @@ +#!/usr/bin/python3 -u + +import sys, os +import signal +from threading import Thread +from select import select, epoll, EPOLLPRI +from functools import partial +from collections import namedtuple +from argparse import ArgumentParser +import traceback +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) + +from dbus.mainloop.glib import DBusGMainLoop +import dbus +from gi.repository import GLib +from vedbus import VeDbusService, VeDbusItemImport +from settingsdevice import SettingsDevice + +VERSION = '0.23' +MAXCOUNT = 2**31-1 +SAVEINTERVAL = 60000 + +INPUT_FUNCTION_COUNTER = 1 +INPUT_FUNCTION_INPUT = 2 + +Translation = namedtuple('Translation', ['no', 'yes']) + +# Only append at the end +INPUTTYPES = [ + 'Disabled', + 'Pulse meter', + 'Door', + 'Bilge pump', + 'Bilge alarm', + 'Burglar alarm', + 'Smoke alarm', + 'Fire alarm', + 'CO2 alarm', + 'Generator', + 'Generic I/O', + 'Touch enable', +] + +# Translations. The text will be used only for GetText, it will be translated +# in the gui. +TRANSLATIONS = [ + Translation('low', 'high'), + Translation('off', 'on'), + Translation('no', 'yes'), + Translation('open', 'closed'), + Translation('ok', 'alarm'), + Translation('running', 'stopped') +] + +class SystemBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SYSTEM) + +class SessionBus(dbus.bus.BusConnection): + def __new__(cls): + return dbus.bus.BusConnection.__new__(cls, dbus.bus.BusConnection.TYPE_SESSION) + +class BasePulseCounter(object): + pass + +class DebugPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + self.gpiomap[gpio] = None + return 0 + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + for level in cycle([0, 1]): + for gpio in list(self.gpiomap.keys()): + yield gpio, level + sleep(0.25/len(self.gpiomap)) + +class EpollPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + self.states = {} + self.ob = epoll() + + def register(self, path, gpio): + path = os.path.realpath(path) + + # Set up gpio for rising edge interrupts + with open(os.path.join(path, 'edge'), 'ab') as fp: + fp.write(b'both') + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) # flush it in case it's high at startup + self.gpiomap[gpio] = fp + self.states[gpio] = level + self.ob.register(fp, EPOLLPRI) + return level + + def unregister(self, gpio): + fp = self.gpiomap[gpio] + self.ob.unregister(fp) + del self.gpiomap[gpio] + del self.states[gpio] + fp.close() + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + while True: + # We have a timeout of 1 second on the poll, because poll() only + # looks at files in the epoll object at the time poll() was called. + # The timeout means we let other files (added via calls to + # register/unregister) into the loop at least that often. + self.ob.poll(1) + + # When coming out of the epoll call, we read all the gpios to make + # sure we didn't miss any edges. This is a safety fallback that + # ensures everything is up to date once a second, but + # edge-triggered results are handled immediately. + # NOTE: There has not been a report of a missed interrupt yet. + # Belts and suspenders. + for gpio, fp in list(self.gpiomap.items()): + os.lseek(fp.fileno(), 0, os.SEEK_SET) + v = int(os.read(fp.fileno(), 1)) + if v != self.states[gpio]: + self.states[gpio] = v + yield gpio, v + +class PollingPulseCounter(BasePulseCounter): + def __init__(self): + self.gpiomap = {} + + def register(self, path, gpio): + path = os.path.realpath(path) + + fp = open(os.path.join(path, 'value'), 'rb') + level = int(fp.read()) + self.gpiomap[gpio] = [fp, level] + return level + + def unregister(self, gpio): + del self.gpiomap[gpio] + + def registered(self, gpio): + return gpio in self.gpiomap + + def __call__(self): + from itertools import cycle + from time import sleep + while True: + for gpio, (fp, level) in list(self.gpiomap.items()): + fp.seek(0, os.SEEK_SET) + v = int(fp.read()) + if v != level: + self.gpiomap[gpio][1] = v + yield gpio, v + sleep(1) + +class HandlerMaker(type): + """ Meta-class for keeping track of all extended classes. """ + def __init__(cls, name, bases, attrs): + if not hasattr(cls, 'handlers'): + cls.handlers = {} + else: + cls.handlers[cls.type_id] = cls + +class PinHandler(object, metaclass=HandlerMaker): + product_id = 0xFFFF + _product_name = 'Generic GPIO' + dbus_name = "digital" + def __init__(self, bus, base, path, gpio, settings): + self.gpio = gpio + self.path = path + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + self.service = VeDbusService( + "{}.{}.input{:02d}".format(base, self.dbus_name, gpio), bus=bus) + + # Add objects required by ve-api + self.service.add_path('/Mgmt/ProcessName', __file__) + self.service.add_path('/Mgmt/ProcessVersion', VERSION) + self.service.add_path('/Mgmt/Connection', path) + self.service.add_path('/DeviceInstance', gpio) + self.service.add_path('/ProductId', self.product_id) + self.service.add_path('/ProductName', self.product_name) + self.service.add_path('/Connected', 1) + + # Custom name setting + def _change_name(p, v): + # This should fire a change event that will update product_name + # below. + settings['name'] = v + return True + + self.service.add_path('/CustomName', settings['name'], writeable=True, + onchangecallback=_change_name) + + # We'll count the pulses for all types of services + self.service.add_path('/Count', value=settings['count']) + + @property + def product_name(self): + return self.settings['name'] or self._product_name + + @product_name.setter + def product_name(self, v): + # Some pin types don't have an associated service (Disabled pins for + # example) + if self.service is not None: + self.service['/ProductName'] = v or self._product_name + + def deactivate(self): + self.save_count() + self.service.__del__() + del self.service + self.service = None + + @property + def level(self): + return self._level + + @level.setter + def level(self, l): + self._level = int(bool(l)) + + def toggle(self, level): + raise NotImplementedError + + def _toggle(self, level, service): + # Only increment Count on rising edge. + if level and level != self._level: + service['/Count'] = (service['/Count']+1) % MAXCOUNT + self._level = level + + def refresh(self): + """ Toggle state to last remembered state. This is called if settings + are changed so the Service can recalculate paths. """ + self.toggle(self._level) + + def save_count(self): + if self.service is not None: + self.settings['count'] = self.count + + @property + def active(self): + return self.service is not None + + @property + def count(self): + return self.service['/Count'] + + @count.setter + def count(self, v): + self.service['/Count'] = v + + @classmethod + def createHandler(cls, _type, *args, **kwargs): + if _type in cls.handlers: + return cls.handlers[_type](*args, **kwargs) + return None + + +class NopPin(object): + """ Mixin for a pin with empty behaviour. Mix in BEFORE PinHandler so that + __init__ overrides the base behaviour. """ + def __init__(self, bus, base, path, gpio, settings): + self.service = None + self.bus = bus + self.settings = settings + self._level = 0 # Remember last state + + def deactivate(self): + pass + + def toggle(self, level): + self._level = level + + def save_count(self): + # Do nothing + pass + + @property + def count(self): + return self.settings['count'] + + @count.setter + def count(self, v): + pass + + def refresh(self): + pass + + +class DisabledPin(NopPin, PinHandler): + """ Place holder for a disabled pin. """ + _product_name = 'Disabled' + type_id = 0 + + +class VolumeCounter(PinHandler): + product_id = 0xA165 + _product_name = "Generic pulse meter" + dbus_name = "pulsemeter" + type_id = 1 + + def __init__(self, bus, base, path, gpio, settings): + super(VolumeCounter, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/Aggregate', value=self.count*self.rate, + gettextcallback=lambda p, v: (str(v) + ' cubic meter')) + + @property + def rate(self): + return self.settings['rate'] + + def toggle(self, level): + with self.service as s: + super(VolumeCounter, self)._toggle(level, s) + s['/Aggregate'] = self.count * self.rate + +class TouchEnable(NopPin, PinHandler): + """ The pin is used to enable/disable the Touch screen when toggled. + No dbus-service is created. """ + _product_name = 'TouchEnable' + type_id = 11 + + def __init__(self, *args, **kwargs): + super(TouchEnable, self).__init__(*args, **kwargs) + self.item = VeDbusItemImport(self.bus, + "com.victronenergy.settings", "/Settings/Gui/TouchEnabled") + + def toggle(self, level): + super(TouchEnable, self).toggle(level) + + # Toggle the touch-enable setting on the downward edge. + # Level is expected to be high with the switch open, and + # pulled low when pushed. + if level == 0: + enabled = bool(self.item.get_value()) + self.item.set_value(int(not enabled)) + + def deactivate(self): + # Always re-enable touch when the pin is deactivated. + # This adds another layer of protection against accidental + # lockout. + self.item.set_value(1) + del self.item + +class PinAlarm(PinHandler): + product_id = 0xA166 + _product_name = "Generic digital input" + dbus_name = "digitalinput" + type_id = 0xFF + translation = 0 # low, high + + def __init__(self, bus, base, path, gpio, settings): + super(PinAlarm, self).__init__(bus, base, path, gpio, settings) + self.service.add_path('/InputState', value=0) + self.service.add_path('/State', value=self.get_state(0), + gettextcallback=lambda p, v: TRANSLATIONS[v//2][v%2]) + self.service.add_path('/Alarm', value=self.get_alarm_state(0)) + + # Also expose the type + self.service.add_path('/Type', value=self.type_id, + gettextcallback=lambda p, v: INPUTTYPES[v]) + + def toggle(self, level): + with self.service as s: + super(PinAlarm, self)._toggle(level, s) + s['/InputState'] = bool(level)*1 + s['/State'] = self.get_state(level) + # Ensure that the alarm flag resets if the /AlarmSetting config option + # disappears. + s['/Alarm'] = self.get_alarm_state(level) + + def get_state(self, level): + state = level ^ self.settings['invert'] + return 2 * self.translation + state + + def get_alarm_state(self, level): + return 2 * bool( + (level ^ self.settings['invertalarm']) and self.settings['alarm']) + + +class Generator(PinAlarm): + _product_name = "Generator" + type_id = 9 + translation = 5 # running, stopped + + def __init__(self, *args, **kwargs): + super(Generator, self).__init__(*args, **kwargs) + # Periodically rewrite the generator selection. The Multi may reset + # causing this to be lost, or a race condition on startup may cause + # it to not be set properly. + self._timer = GLib.timeout_add(30000, + lambda: self.select_generator(self.level ^ self.settings['invert'] ^ 1) or True) + + def select_generator(self, v): + # Find all vebus services, and let them know + try: + services = [n for n in self.bus.list_names() if n.startswith( + 'com.victronenergy.vebus.')] + for n in services: + self.bus.call_async(n, '/Ac/Control/RemoteGeneratorSelected', None, + 'SetValue', 'v', [v], None, None) + except dbus.exceptions.DBusException: + print ("DBus exception setting RemoteGeneratorSelected") + traceback.print_exc() + + def toggle(self, level): + super(Generator, self).toggle(level) + + # Follow the same inversion sense as for display + self.select_generator(level ^ self.settings['invert'] ^ 1) + + def deactivate(self): + super(Generator, self).deactivate() + # When deactivating, reset the generator selection state + self.select_generator(0) + + # And kill the periodic job + GLib.source_remove(self._timer) + self._timer = None + +# Various types of things we might want to monitor +class DoorSensor(PinAlarm): + _product_name = "Door alarm" + type_id = 2 + translation = 3 # open, closed + +class BilgePump(PinAlarm): + _product_name = "Bilge pump" + type_id = 3 + translation = 1 # off, on + +class BilgeAlarm(PinAlarm): + _product_name = "Bilge alarm" + type_id = 4 + translation = 4 # ok, alarm + +class BurglarAlarm(PinAlarm): + _product_name = "Burglar alarm" + type_id = 5 + translation = 4 # ok, alarm + +class SmokeAlarm(PinAlarm): + _product_name = "Smoke alarm" + type_id = 6 + translation = 4 # ok, alarm + +class FireAlarm(PinAlarm): + _product_name = "Fire alarm" + type_id = 7 + translation = 4 # ok, alarm + +class CO2Alarm(PinAlarm): + _product_name = "CO2 alarm" + type_id = 8 + translation = 4 # ok, alarm + +class GenericIO(PinAlarm): + _product_name = "Generic I/O" + type_id = 10 + translation = 0 # low, high + + +def dbusconnection(): + return SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else SystemBus() + + +def main(): + parser = ArgumentParser(description=sys.argv[0]) + parser.add_argument('--servicebase', + help='Base service name on dbus, default is com.victronenergy', + default='com.victronenergy') + parser.add_argument('--poll', + help='Use a different kind of polling. Options are epoll, dumb and debug', + default='epoll') + parser.add_argument('inputs', nargs='+', help='Path to digital input') + args = parser.parse_args() + + PulseCounter = { + 'debug': DebugPulseCounter, + 'poll': PollingPulseCounter, + }.get(args.poll, EpollPulseCounter) + + DBusGMainLoop(set_as_default=True) + + # Keep track of enabled services + services = {} + inputs = dict(enumerate(args.inputs, 1)) + pulses = PulseCounter() # callable that iterates over pulses + + def register_gpio(path, gpio, bus, settings): + _type = settings['inputtype'] + print ("Registering GPIO {} for type {}".format(gpio, _type)) + + handler = PinHandler.createHandler(_type, + bus, args.servicebase, path, gpio, settings) + services[gpio] = handler + + # Only monitor if enabled + if _type > 0: + handler.level = pulses.register(path, gpio) + handler.refresh() + + def unregister_gpio(gpio): + print ("unRegistering GPIO {}".format(gpio)) + pulses.unregister(gpio) + services[gpio].deactivate() + + def handle_setting_change(inp, setting, old, new): + # This handler may also be called if some attribute of a setting + # is changed, but not the value. Bail if the value is unchanged. + if old == new: + return + + if setting == 'inputtype': + if new: + # Get current bus and settings objects, to be reused + service = services[inp] + bus, settings = service.bus, service.settings + + # Input enabled. If already enabled, unregister the old one first. + if pulses.registered(inp): + unregister_gpio(inp) + + # Before registering the new input, reset its settings to defaults + settings['count'] = 0 + settings['invert'] = 0 + settings['invertalarm'] = 0 + settings['alarm'] = 0 + + # Register it + register_gpio(inputs[inp], inp, bus, settings) + elif old: + # Input disabled + unregister_gpio(inp) + elif setting in ('rate', 'invert', 'alarm', 'invertalarm'): + services[inp].refresh() + elif setting == 'name': + services[inp].product_name = new + elif setting == 'count': + # Don't want this triggered on a period save, so only execute + # if it has changed. + v = int(new) + s = services[inp] + if s.count != v: + s.count = v + s.refresh() + + for inp, pth in inputs.items(): + supported_settings = { + 'inputtype': ['/Settings/DigitalInput/{}/Type'.format(inp), 0, 0, len(INPUTTYPES)-1], + 'rate': ['/Settings/DigitalInput/{}/Multiplier'.format(inp), 0.001, 0, 1.0], + 'count': ['/Settings/DigitalInput/{}/Count'.format(inp), 0, 0, MAXCOUNT, 1], + 'invert': ['/Settings/DigitalInput/{}/InvertTranslation'.format(inp), 0, 0, 1], + 'invertalarm': ['/Settings/DigitalInput/{}/InvertAlarm'.format(inp), 0, 0, 1], + 'alarm': ['/Settings/DigitalInput/{}/AlarmSetting'.format(inp), 0, 0, 1], + 'name': ['/Settings/DigitalInput/{}/CustomName'.format(inp), '', '', ''], + } + bus = dbusconnection() + sd = SettingsDevice(bus, supported_settings, partial(handle_setting_change, inp), timeout=10) + register_gpio(pth, inp, bus, sd) + + def poll(mainloop): + from time import time + idx = 0 + + try: + for inp, level in pulses(): + # epoll object only resyncs once a second. We may receive + # a pulse for something that's been deregistered. + try: + services[inp].toggle(level) + except KeyError: + continue + except: + traceback.print_exc() + mainloop.quit() + + # Need to run the gpio polling in separate thread. Pass in the mainloop so + # the thread can kill us if there is an exception. + mainloop = GLib.MainLoop() + + poller = Thread(target=lambda: poll(mainloop)) + poller.daemon = True + poller.start() + + # Periodically save the counter + def save_counters(): + for inp in inputs: + services[inp].save_count() + return True + GLib.timeout_add(SAVEINTERVAL, save_counters) + + # Save counter on shutdown + signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) + + try: + mainloop.run() + except KeyboardInterrupt: + pass + finally: + save_counters() + +if __name__ == "__main__": + main() diff --git a/FileSets/v3.30~1/dbus_generator.py b/FileSets/v3.30~1/dbus_generator.py new file mode 100755 index 00000000..d6f8f00d --- /dev/null +++ b/FileSets/v3.30~1/dbus_generator.py @@ -0,0 +1,348 @@ +#!/usr/bin/python3 -u +# -*- coding: utf-8 -*- + +#### GuiMods +#### This file has been modified to allow the generator running state derived from the generator digital input +#### or the genset AC input +#### If the incoming generator state changes, the manual start state is updated +#### time accumulation is suspended when the generator is not running +#### A switch in the generator settings menucontrols whethter the incoming state affects manual start or time accumulaiton +#### It is now possible to start the generator manually and have it stop automatically based on the preset conditions +#### for automaitc start / stop +#### Search for #### GuiMods to find changes + +from dbus.mainloop.glib import DBusGMainLoop +import dbus +import argparse +import sys +import os +import signal +from gi.repository import GLib + +# Victron packages +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) +from vedbus import VeDbusService +from ve_utils import exit_on_error +from dbusmonitor import DbusMonitor +from settingsdevice import SettingsDevice +from logger import setup_logging +import logging +from gen_utils import dummy +import time +import relay +import genset +from version import softwareversion + +class Generator(object): + def __init__(self): + self._exit = False + self._instances = {} + self._modules = [relay, genset] + + # Common dbus services/path + commondbustree = { + 'com.victronenergy.settings': { + '/Settings/System/TimeZone': dummy, + '/Settings/SystemSetup/AcInput1': dummy, + '/Settings/SystemSetup/AcInput2': dummy, + '/Settings/Relay/Polarity': dummy + }, + 'com.victronenergy.battery': { + '/Dc/0/Voltage': dummy, + '/Dc/0/Current': dummy, + '/Dc/1/Voltage': dummy, + '/Dc/1/Current': dummy, + '/Soc': dummy + }, + 'com.victronenergy.vebus': { + '/Ac/Out/L1/P': dummy, + '/Ac/Out/L2/P': dummy, + '/Ac/Out/L3/P': dummy, + '/Alarms/L1/Overload': dummy, + '/Alarms/L2/Overload': dummy, + '/Alarms/L3/Overload': dummy, + '/Alarms/L1/HighTemperature': dummy, + '/Alarms/L2/HighTemperature': dummy, + '/Alarms/L3/HighTemperature': dummy, + '/Alarms/HighTemperature': dummy, + '/Alarms/Overload': dummy, + '/Ac/ActiveIn/ActiveInput': dummy, + '/Ac/ActiveIn/Connected': dummy, + '/Dc/0/Voltage': dummy, + '/Dc/0/Current': dummy, + '/Dc/1/Voltage': dummy, + '/Dc/1/Current': dummy, + '/Soc': dummy, + '/Ac/State/AcIn1Available': dummy, + '/Ac/State/AcIn2Available': dummy, + '/Ac/Control/IgnoreAcIn1': dummy, + '/Ac/Control/IgnoreAcIn2': dummy + }, + 'com.victronenergy.system': { + '/Ac/ConsumptionOnInput/L1/Power': dummy, + '/Ac/ConsumptionOnInput/L2/Power': dummy, + '/Ac/ConsumptionOnInput/L3/Power': dummy, + '/Ac/ConsumptionOnOutput/L1/Power': dummy, + '/Ac/ConsumptionOnOutput/L2/Power': dummy, + '/Ac/ConsumptionOnOutput/L3/Power': dummy, + '/Dc/Pv/Power': dummy, + '/AutoSelectedBatteryMeasurement': dummy, + '/Ac/ActiveIn/Source': dummy, + '/VebusService': dummy, + '/Dc/Battery/Voltage': dummy, + '/Dc/Battery/Current': dummy, + '/Dc/Battery/Soc': dummy, +#### GuiMods + '/Ac/Genset/Frequency': dummy, + '/Ac/In/NumberOfAcInputs': dummy + } + } + + # Settings base + settingsbase = { + 'autostart': ['/Settings/{0}/AutoStartEnabled', 0, 0, 1], + 'serviceinterval': ['/Settings/{0}/ServiceInterval', 0, 0, 0], + 'lastservicereset': ['/Settings/{0}/LastServiceReset', 0, 0, 0], + 'accumulateddaily': ['/Settings/{0}/AccumulatedDaily', '', 0, 0, True], + 'accumulatedtotal': ['/Settings/{0}/AccumulatedTotal', 0, 0, 0, True], # Internal, can't be reset by the user + 'accumulatedtotalOffset': ['/Settings/{0}/AccumulatedTotalOffset', 0, 0, 0], # For calculating user runtime +#### GuiMods + 'linkManualStartToExternal': ['/Settings/{0}/LinkToExternalStatus', 0, 0, 0, True], + + 'batterymeasurement': ['/Settings/{0}/BatteryService', 'default', 0, 0], + 'minimumruntime': ['/Settings/{0}/MinimumRuntime', 0, 0, 86400], # minutes + 'stoponac1enabled': ['/Settings/{0}/StopWhenAc1Available', 0, 0, 1], + 'stoponac2enabled': ['/Settings/{0}/StopWhenAc2Available', 0, 0, 1], + # On permanent loss of communication: 0 = Stop, 1 = Start, 2 = keep running + 'onlosscommunication': ['/Settings/{0}/OnLossCommunication', 0, 0, 2], + # Quiet hours + 'quiethoursenabled': ['/Settings/{0}/QuietHours/Enabled', 0, 0, 1], + 'quiethoursstarttime': ['/Settings/{0}/QuietHours/StartTime', 75600, 0, 86400], + 'quiethoursendtime': ['/Settings/{0}/QuietHours/EndTime', 21600, 0, 86400], + # SOC + 'socenabled': ['/Settings/{0}/Soc/Enabled', 0, 0, 1], + 'socstart': ['/Settings/{0}/Soc/StartValue', 80, 0, 100], + 'socstop': ['/Settings/{0}/Soc/StopValue', 90, 0, 100], + 'socstarttimer': ['/Settings/{0}/Soc/StartTimer', 0, 0, 10000], + 'socstoptimer': ['/Settings/{0}/Soc/StopTimer', 0, 0, 10000], + 'qh_socstart': ['/Settings/{0}/Soc/QuietHoursStartValue', 90, 0, 100], + 'qh_socstop': ['/Settings/{0}/Soc/QuietHoursStopValue', 90, 0, 100], + # Voltage + 'batteryvoltageenabled': ['/Settings/{0}/BatteryVoltage/Enabled', 0, 0, 1], + 'batteryvoltagestart': ['/Settings/{0}/BatteryVoltage/StartValue', 11.5, 0, 150], + 'batteryvoltagestop': ['/Settings/{0}/BatteryVoltage/StopValue', 12.4, 0, 150], + 'batteryvoltagestarttimer': ['/Settings/{0}/BatteryVoltage/StartTimer', 20, 0, 10000], + 'batteryvoltagestoptimer': ['/Settings/{0}/BatteryVoltage/StopTimer', 20, 0, 10000], + 'qh_batteryvoltagestart': ['/Settings/{0}/BatteryVoltage/QuietHoursStartValue', 11.9, 0, 100], + 'qh_batteryvoltagestop': ['/Settings/{0}/BatteryVoltage/QuietHoursStopValue', 12.4, 0, 100], + # Current + 'batterycurrentenabled': ['/Settings/{0}/BatteryCurrent/Enabled', 0, 0, 1], + 'batterycurrentstart': ['/Settings/{0}/BatteryCurrent/StartValue', 10.5, 0.5, 10000], + 'batterycurrentstop': ['/Settings/{0}/BatteryCurrent/StopValue', 5.5, 0, 10000], + 'batterycurrentstarttimer': ['/Settings/{0}/BatteryCurrent/StartTimer', 20, 0, 10000], + 'batterycurrentstoptimer': ['/Settings/{0}/BatteryCurrent/StopTimer', 20, 0, 10000], + 'qh_batterycurrentstart': ['/Settings/{0}/BatteryCurrent/QuietHoursStartValue', 20.5, 0, 10000], + 'qh_batterycurrentstop': ['/Settings/{0}/BatteryCurrent/QuietHoursStopValue', 15.5, 0, 10000], + # AC load + 'acloadenabled': ['/Settings/{0}/AcLoad/Enabled', 0, 0, 1], + # Measuerement, 0 = Total AC consumption, 1 = AC on inverter output, 2 = Single phase + 'acloadmeasurement': ['/Settings/{0}/AcLoad/Measurement', 0, 0, 100], + 'acloadstart': ['/Settings/{0}/AcLoad/StartValue', 1600, 5, 1000000], + 'acloadstop': ['/Settings/{0}/AcLoad/StopValue', 800, 0, 1000000], + 'acloadstarttimer': ['/Settings/{0}/AcLoad/StartTimer', 20, 0, 10000], + 'acloadstoptimer': ['/Settings/{0}/AcLoad/StopTimer', 20, 0, 10000], + 'qh_acloadstart': ['/Settings/{0}/AcLoad/QuietHoursStartValue', 1900, 0, 1000000], + 'qh_acloadstop': ['/Settings/{0}/AcLoad/QuietHoursStopValue', 1200, 0, 1000000], + # VE.Bus high temperature + 'inverterhightempenabled': ['/Settings/{0}/InverterHighTemp/Enabled', 0, 0, 1], + 'inverterhightempstarttimer': ['/Settings/{0}/InverterHighTemp/StartTimer', 20, 0, 10000], + 'inverterhightempstoptimer': ['/Settings/{0}/InverterHighTemp/StopTimer', 20, 0, 10000], + # VE.Bus overload + 'inverteroverloadenabled': ['/Settings/{0}/InverterOverload/Enabled', 0, 0, 1], + 'inverteroverloadstarttimer': ['/Settings/{0}/InverterOverload/StartTimer', 20, 0, 10000], + 'inverteroverloadstoptimer': ['/Settings/{0}/InverterOverload/StopTimer', 20, 0, 10000], + # TestRun + 'testrunenabled': ['/Settings/{0}/TestRun/Enabled', 0, 0, 1], + 'testrunstartdate': ['/Settings/{0}/TestRun/StartDate', 1483228800, 0, 10000000000.1], + 'testrunstarttimer': ['/Settings/{0}/TestRun/StartTime', 54000, 0, 86400], + 'testruninterval': ['/Settings/{0}/TestRun/Interval', 28, 1, 365], + 'testrunruntime': ['/Settings/{0}/TestRun/Duration', 7200, 1, 86400], + 'testrunskipruntime': ['/Settings/{0}/TestRun/SkipRuntime', 0, 0, 100000], + 'testruntillbatteryfull': ['/Settings/{0}/TestRun/RunTillBatteryFull', 0, 0, 1], + # Alarms + 'nogeneratoratacinalarm': ['/Settings/{0}/Alarms/NoGeneratorAtAcIn', 0, 0, 1], + 'autostartdisabledalarm': ['/Settings/{0}/Alarms/AutoStartDisabled', 0, 0, 1], + # Warm-up and Cool-down + 'warmuptime': ['/Settings/{0}/WarmUpTime', 0, 0, 600], + 'cooldowntime': ['/Settings/{0}/CoolDownTime', 0, 0, 600], + 'generatorstoptime': ['/Settings/{0}/GeneratorStopTime', 0, 0, 600] + } + + settings = {} + dbus_tree = dict(commondbustree) + + for m in self._modules: + # Create settings for each module + # Settings are created under the module prefix, for example: + # /Settings/Generator0/AcLoad/Enabled + # /Settings/FischerPanda0/AcLoad/Enabled + for s in settingsbase: + v = settingsbase[s][:] # Copy + v[0] = v[0].format(m.name) + settings[s + m.name] = v + + # Get all services/paths that must be monitored + # There are a base of common services/pathas that must be monitored + # for the correct function such as battery monitors of vebus devices + # and a extra ones that is only used by a certain module, these + # are mainly the "remote switch". + for i in m.monitoring: + if i in commondbustree: + for s in m.monitoring[i]: + dbus_tree[i][s] = m.monitoring[i][s] + else: + dbus_tree[i] = m.monitoring[i] + + # Create settings device which is shared + self._settings = self._create_settings(settings, self._handlechangedsetting) + + # Create dbusmonitor, this is shared by all the instances + self._dbusmonitor = self._create_dbus_monitor(dbus_tree, valueChangedCallback=self._dbus_value_changed, + deviceAddedCallback=self._device_added, deviceRemovedCallback=self._device_removed) + + # Set timezone to user selected timezone + tz = self._dbusmonitor.get_value('com.victronenergy.settings', '/Settings/System/TimeZone') + os.environ['TZ'] = tz if tz else 'UTC' + time.tzset() + + # Call device_added for all existing devices at startup. + for service, instance in self._dbusmonitor.get_service_list().items(): + self._device_added(service, instance) + + GLib.timeout_add(1000, exit_on_error, self._handletimertick) + + def _handlechangedsetting(self, setting, oldvalue, newvalue): + for i in self._instances: + self._instances[i].handlechangedsetting(setting, oldvalue, newvalue) + + def _device_added(self, dbusservicename, instance): + # If settings check built-in relays + if dbusservicename == 'com.victronenergy.settings': + self._handle_builtin_relay('/Settings/Relay/Function') + + self._add_device(dbusservicename) + + for i in self._instances: + self._instances[i].device_added(dbusservicename, instance) + + def _dbus_value_changed(self, dbusServiceName, dbusPath, options, changes, deviceInstance): + # Track built-in relays + if "/Settings/Relay/Function" in dbusPath: + self._handle_builtin_relay(dbusPath) + + # Some devices like Fischer Panda gensets doesn't disappear from dbus + # when disconnected so check '/Connected' value to add or remove start/stop + # for that device + if dbusPath == "/Connected": + if self._dbusmonitor.get_value(dbusServiceName, dbusPath) == 0: + self._remove_device(dbusServiceName) + else: + self._add_device(dbusServiceName) + + # Update env timezone when setting changes + if (dbusServiceName, dbusPath) == ('com.victronenergy.settings', '/Settings/System/TimeZone'): + os.environ['TZ'] = changes['Value'] if changes['Value'] else 'UTC' + time.tzset() + + for i in self._instances: + self._instances[i].dbus_value_changed(dbusServiceName, dbusPath, options, changes, deviceInstance) + + def _device_removed(self, dbusservicename, instance): + if dbusservicename == 'com.victronenergy.settings': + self._handle_builtin_relay('/Settings/Relay/Function') + for i in self._instances: + self._instances[i].device_removed(dbusservicename, instance) + self._remove_device(dbusservicename) + + def _create_dbus_monitor(self, *args, **kwargs): + return DbusMonitor(*args, **kwargs) + + def _create_settings(self, *args, **kwargs): + bus = dbus.SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else dbus.SystemBus() + return SettingsDevice(bus, *args, timeout=10, **kwargs) + + def _add_device(self, service): + for i in self._modules: + # Check if module can handle this service + if i.remoteprefix not in service: + continue + # Check and create start/stop instance for the device + if i.check_device(self._dbusmonitor, service): + self._instances[service] = i.create(self._dbusmonitor, + service, self._settings) + + def _handle_builtin_relay(self, dbuspath): + function = self._dbusmonitor.get_value('com.victronenergy.settings', dbuspath) + relaynr = 'generator0' + relayservice = 'com.victronenergy.system' + + # Create a instance if relay function is set to 1 (gen. start/stop) + # otherwise remove the instance if exists + if function == 1: + self._instances[relaynr] = relay.create(self._dbusmonitor, + relayservice, + self._settings) + elif relaynr in self._instances: + self._instances[relaynr].remove() + del self._instances[relaynr] + + def _remove_device(self, servicename): + if servicename in self._instances: + if self._instances[servicename] is not None: + self._instances[servicename].remove() + del self._instances[servicename] + + def terminate(self, signum, frame): + # Remove instances before exiting, remote services might need to perform actions before releasing control + # of the switch + for i in self._instances: + self._instances[i].remove() + os._exit(0) + + def _handletimertick(self): + # try catch, to make sure that we kill ourselves on an error. Without this try-catch, there would + # be an error written to stdout, and then the timer would not be restarted, resulting in a dead- + # lock waiting for manual intervention -> not good! + try: + for i in self._instances: + self._instances[i].tick() + except: + self._instances[i].remove() + import traceback + traceback.print_exc() + sys.exit(1) + return True + +if __name__ == '__main__': + # Argument parsing + parser = argparse.ArgumentParser( + description='Start and stop a generator based on conditions' + ) + + parser.add_argument('-d', '--debug', help='set logging level to debug', + action='store_true') + args = parser.parse_args() + + print ('-------- dbus_generator, v' + softwareversion + ' is starting up --------') + + logger = setup_logging(args.debug) + + # Have a mainloop, so we can send/receive asynchronous calls to and from dbus + DBusGMainLoop(set_as_default=True) + + generator = Generator() + signal.signal(signal.SIGTERM, generator.terminate) + + # Start and run the mainloop + mainloop = GLib.MainLoop() + mainloop.run() diff --git a/FileSets/v3.30~1/dbus_generator.py.orig b/FileSets/v3.30~1/dbus_generator.py.orig new file mode 100755 index 00000000..564e702c --- /dev/null +++ b/FileSets/v3.30~1/dbus_generator.py.orig @@ -0,0 +1,332 @@ +#!/usr/bin/python3 -u +# -*- coding: utf-8 -*- + +from dbus.mainloop.glib import DBusGMainLoop +import dbus +import argparse +import sys +import os +import signal +from gi.repository import GLib + +# Victron packages +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) +from vedbus import VeDbusService +from ve_utils import exit_on_error +from dbusmonitor import DbusMonitor +from settingsdevice import SettingsDevice +from logger import setup_logging +import logging +from gen_utils import dummy +import time +import relay +import genset +from version import softwareversion + +class Generator(object): + def __init__(self): + self._exit = False + self._instances = {} + self._modules = [relay, genset] + + # Common dbus services/path + commondbustree = { + 'com.victronenergy.settings': { + '/Settings/System/TimeZone': dummy, + '/Settings/SystemSetup/AcInput1': dummy, + '/Settings/SystemSetup/AcInput2': dummy, + '/Settings/Relay/Polarity': dummy + }, + 'com.victronenergy.battery': { + '/Dc/0/Voltage': dummy, + '/Dc/0/Current': dummy, + '/Dc/1/Voltage': dummy, + '/Dc/1/Current': dummy, + '/Soc': dummy + }, + 'com.victronenergy.vebus': { + '/Ac/Out/L1/P': dummy, + '/Ac/Out/L2/P': dummy, + '/Ac/Out/L3/P': dummy, + '/Alarms/L1/Overload': dummy, + '/Alarms/L2/Overload': dummy, + '/Alarms/L3/Overload': dummy, + '/Alarms/L1/HighTemperature': dummy, + '/Alarms/L2/HighTemperature': dummy, + '/Alarms/L3/HighTemperature': dummy, + '/Alarms/HighTemperature': dummy, + '/Alarms/Overload': dummy, + '/Ac/ActiveIn/ActiveInput': dummy, + '/Ac/ActiveIn/Connected': dummy, + '/Dc/0/Voltage': dummy, + '/Dc/0/Current': dummy, + '/Dc/1/Voltage': dummy, + '/Dc/1/Current': dummy, + '/Soc': dummy, + '/Ac/State/AcIn1Available': dummy, + '/Ac/State/AcIn2Available': dummy, + '/Ac/Control/IgnoreAcIn1': dummy, + '/Ac/Control/IgnoreAcIn2': dummy + }, + 'com.victronenergy.system': { + '/Ac/ConsumptionOnInput/L1/Power': dummy, + '/Ac/ConsumptionOnInput/L2/Power': dummy, + '/Ac/ConsumptionOnInput/L3/Power': dummy, + '/Ac/ConsumptionOnOutput/L1/Power': dummy, + '/Ac/ConsumptionOnOutput/L2/Power': dummy, + '/Ac/ConsumptionOnOutput/L3/Power': dummy, + '/Dc/Pv/Power': dummy, + '/AutoSelectedBatteryMeasurement': dummy, + '/Ac/ActiveIn/Source': dummy, + '/VebusService': dummy, + '/Dc/Battery/Voltage': dummy, + '/Dc/Battery/Current': dummy, + '/Dc/Battery/Soc': dummy + } + } + + # Settings base + settingsbase = { + 'autostart': ['/Settings/{0}/AutoStartEnabled', 0, 0, 1], + 'serviceinterval': ['/Settings/{0}/ServiceInterval', 0, 0, 0], + 'lastservicereset': ['/Settings/{0}/LastServiceReset', 0, 0, 0], + 'accumulateddaily': ['/Settings/{0}/AccumulatedDaily', '', 0, 0, True], + 'accumulatedtotal': ['/Settings/{0}/AccumulatedTotal', 0, 0, 0, True], # Internal, can't be reset by the user + 'accumulatedtotalOffset': ['/Settings/{0}/AccumulatedTotalOffset', 0, 0, 0], # For calculating user runtime + 'batterymeasurement': ['/Settings/{0}/BatteryService', 'default', 0, 0], + 'minimumruntime': ['/Settings/{0}/MinimumRuntime', 0, 0, 86400], # minutes + 'stoponac1enabled': ['/Settings/{0}/StopWhenAc1Available', 0, 0, 1], + 'stoponac2enabled': ['/Settings/{0}/StopWhenAc2Available', 0, 0, 1], + # On permanent loss of communication: 0 = Stop, 1 = Start, 2 = keep running + 'onlosscommunication': ['/Settings/{0}/OnLossCommunication', 0, 0, 2], + # Quiet hours + 'quiethoursenabled': ['/Settings/{0}/QuietHours/Enabled', 0, 0, 1], + 'quiethoursstarttime': ['/Settings/{0}/QuietHours/StartTime', 75600, 0, 86400], + 'quiethoursendtime': ['/Settings/{0}/QuietHours/EndTime', 21600, 0, 86400], + # SOC + 'socenabled': ['/Settings/{0}/Soc/Enabled', 0, 0, 1], + 'socstart': ['/Settings/{0}/Soc/StartValue', 80, 0, 100], + 'socstop': ['/Settings/{0}/Soc/StopValue', 90, 0, 100], + 'socstarttimer': ['/Settings/{0}/Soc/StartTimer', 0, 0, 10000], + 'socstoptimer': ['/Settings/{0}/Soc/StopTimer', 0, 0, 10000], + 'qh_socstart': ['/Settings/{0}/Soc/QuietHoursStartValue', 90, 0, 100], + 'qh_socstop': ['/Settings/{0}/Soc/QuietHoursStopValue', 90, 0, 100], + # Voltage + 'batteryvoltageenabled': ['/Settings/{0}/BatteryVoltage/Enabled', 0, 0, 1], + 'batteryvoltagestart': ['/Settings/{0}/BatteryVoltage/StartValue', 11.5, 0, 150], + 'batteryvoltagestop': ['/Settings/{0}/BatteryVoltage/StopValue', 12.4, 0, 150], + 'batteryvoltagestarttimer': ['/Settings/{0}/BatteryVoltage/StartTimer', 20, 0, 10000], + 'batteryvoltagestoptimer': ['/Settings/{0}/BatteryVoltage/StopTimer', 20, 0, 10000], + 'qh_batteryvoltagestart': ['/Settings/{0}/BatteryVoltage/QuietHoursStartValue', 11.9, 0, 100], + 'qh_batteryvoltagestop': ['/Settings/{0}/BatteryVoltage/QuietHoursStopValue', 12.4, 0, 100], + # Current + 'batterycurrentenabled': ['/Settings/{0}/BatteryCurrent/Enabled', 0, 0, 1], + 'batterycurrentstart': ['/Settings/{0}/BatteryCurrent/StartValue', 10.5, 0.5, 10000], + 'batterycurrentstop': ['/Settings/{0}/BatteryCurrent/StopValue', 5.5, 0, 10000], + 'batterycurrentstarttimer': ['/Settings/{0}/BatteryCurrent/StartTimer', 20, 0, 10000], + 'batterycurrentstoptimer': ['/Settings/{0}/BatteryCurrent/StopTimer', 20, 0, 10000], + 'qh_batterycurrentstart': ['/Settings/{0}/BatteryCurrent/QuietHoursStartValue', 20.5, 0, 10000], + 'qh_batterycurrentstop': ['/Settings/{0}/BatteryCurrent/QuietHoursStopValue', 15.5, 0, 10000], + # AC load + 'acloadenabled': ['/Settings/{0}/AcLoad/Enabled', 0, 0, 1], + # Measuerement, 0 = Total AC consumption, 1 = AC on inverter output, 2 = Single phase + 'acloadmeasurement': ['/Settings/{0}/AcLoad/Measurement', 0, 0, 100], + 'acloadstart': ['/Settings/{0}/AcLoad/StartValue', 1600, 5, 1000000], + 'acloadstop': ['/Settings/{0}/AcLoad/StopValue', 800, 0, 1000000], + 'acloadstarttimer': ['/Settings/{0}/AcLoad/StartTimer', 20, 0, 10000], + 'acloadstoptimer': ['/Settings/{0}/AcLoad/StopTimer', 20, 0, 10000], + 'qh_acloadstart': ['/Settings/{0}/AcLoad/QuietHoursStartValue', 1900, 0, 1000000], + 'qh_acloadstop': ['/Settings/{0}/AcLoad/QuietHoursStopValue', 1200, 0, 1000000], + # VE.Bus high temperature + 'inverterhightempenabled': ['/Settings/{0}/InverterHighTemp/Enabled', 0, 0, 1], + 'inverterhightempstarttimer': ['/Settings/{0}/InverterHighTemp/StartTimer', 20, 0, 10000], + 'inverterhightempstoptimer': ['/Settings/{0}/InverterHighTemp/StopTimer', 20, 0, 10000], + # VE.Bus overload + 'inverteroverloadenabled': ['/Settings/{0}/InverterOverload/Enabled', 0, 0, 1], + 'inverteroverloadstarttimer': ['/Settings/{0}/InverterOverload/StartTimer', 20, 0, 10000], + 'inverteroverloadstoptimer': ['/Settings/{0}/InverterOverload/StopTimer', 20, 0, 10000], + # TestRun + 'testrunenabled': ['/Settings/{0}/TestRun/Enabled', 0, 0, 1], + 'testrunstartdate': ['/Settings/{0}/TestRun/StartDate', 1483228800, 0, 10000000000.1], + 'testrunstarttimer': ['/Settings/{0}/TestRun/StartTime', 54000, 0, 86400], + 'testruninterval': ['/Settings/{0}/TestRun/Interval', 28, 1, 365], + 'testrunruntime': ['/Settings/{0}/TestRun/Duration', 7200, 1, 86400], + 'testrunskipruntime': ['/Settings/{0}/TestRun/SkipRuntime', 0, 0, 100000], + 'testruntillbatteryfull': ['/Settings/{0}/TestRun/RunTillBatteryFull', 0, 0, 1], + # Alarms + 'nogeneratoratacinalarm': ['/Settings/{0}/Alarms/NoGeneratorAtAcIn', 0, 0, 1], + 'autostartdisabledalarm': ['/Settings/{0}/Alarms/AutoStartDisabled', 0, 0, 1], + # Warm-up and Cool-down + 'warmuptime': ['/Settings/{0}/WarmUpTime', 0, 0, 600], + 'cooldowntime': ['/Settings/{0}/CoolDownTime', 0, 0, 600], + 'generatorstoptime': ['/Settings/{0}/GeneratorStopTime', 0, 0, 600] + } + + settings = {} + dbus_tree = dict(commondbustree) + + for m in self._modules: + # Create settings for each module + # Settings are created under the module prefix, for example: + # /Settings/Generator0/AcLoad/Enabled + # /Settings/FischerPanda0/AcLoad/Enabled + for s in settingsbase: + v = settingsbase[s][:] # Copy + v[0] = v[0].format(m.name) + settings[s + m.name] = v + + # Get all services/paths that must be monitored + # There are a base of common services/pathas that must be monitored + # for the correct function such as battery monitors of vebus devices + # and a extra ones that is only used by a certain module, these + # are mainly the "remote switch". + for i in m.monitoring: + if i in commondbustree: + for s in m.monitoring[i]: + dbus_tree[i][s] = m.monitoring[i][s] + else: + dbus_tree[i] = m.monitoring[i] + + # Create settings device which is shared + self._settings = self._create_settings(settings, self._handlechangedsetting) + + # Create dbusmonitor, this is shared by all the instances + self._dbusmonitor = self._create_dbus_monitor(dbus_tree, valueChangedCallback=self._dbus_value_changed, + deviceAddedCallback=self._device_added, deviceRemovedCallback=self._device_removed) + + # Set timezone to user selected timezone + tz = self._dbusmonitor.get_value('com.victronenergy.settings', '/Settings/System/TimeZone') + os.environ['TZ'] = tz if tz else 'UTC' + time.tzset() + + # Call device_added for all existing devices at startup. + for service, instance in self._dbusmonitor.get_service_list().items(): + self._device_added(service, instance) + + GLib.timeout_add(1000, exit_on_error, self._handletimertick) + + def _handlechangedsetting(self, setting, oldvalue, newvalue): + for i in self._instances: + self._instances[i].handlechangedsetting(setting, oldvalue, newvalue) + + def _device_added(self, dbusservicename, instance): + # If settings check built-in relays + if dbusservicename == 'com.victronenergy.settings': + self._handle_builtin_relay('/Settings/Relay/Function') + + self._add_device(dbusservicename) + + for i in self._instances: + self._instances[i].device_added(dbusservicename, instance) + + def _dbus_value_changed(self, dbusServiceName, dbusPath, options, changes, deviceInstance): + # Track built-in relays + if "/Settings/Relay/Function" in dbusPath: + self._handle_builtin_relay(dbusPath) + + # Some devices like Fischer Panda gensets doesn't disappear from dbus + # when disconnected so check '/Connected' value to add or remove start/stop + # for that device + if dbusPath == "/Connected": + if self._dbusmonitor.get_value(dbusServiceName, dbusPath) == 0: + self._remove_device(dbusServiceName) + else: + self._add_device(dbusServiceName) + + # Update env timezone when setting changes + if (dbusServiceName, dbusPath) == ('com.victronenergy.settings', '/Settings/System/TimeZone'): + os.environ['TZ'] = changes['Value'] if changes['Value'] else 'UTC' + time.tzset() + + for i in self._instances: + self._instances[i].dbus_value_changed(dbusServiceName, dbusPath, options, changes, deviceInstance) + + def _device_removed(self, dbusservicename, instance): + if dbusservicename == 'com.victronenergy.settings': + self._handle_builtin_relay('/Settings/Relay/Function') + for i in self._instances: + self._instances[i].device_removed(dbusservicename, instance) + self._remove_device(dbusservicename) + + def _create_dbus_monitor(self, *args, **kwargs): + return DbusMonitor(*args, **kwargs) + + def _create_settings(self, *args, **kwargs): + bus = dbus.SessionBus() if 'DBUS_SESSION_BUS_ADDRESS' in os.environ else dbus.SystemBus() + return SettingsDevice(bus, *args, timeout=10, **kwargs) + + def _add_device(self, service): + for i in self._modules: + # Check if module can handle this service + if i.remoteprefix not in service: + continue + # Check and create start/stop instance for the device + if i.check_device(self._dbusmonitor, service): + self._instances[service] = i.create(self._dbusmonitor, + service, self._settings) + + def _handle_builtin_relay(self, dbuspath): + function = self._dbusmonitor.get_value('com.victronenergy.settings', dbuspath) + relaynr = 'generator0' + relayservice = 'com.victronenergy.system' + + # Create a instance if relay function is set to 1 (gen. start/stop) + # otherwise remove the instance if exists + if function == 1: + self._instances[relaynr] = relay.create(self._dbusmonitor, + relayservice, + self._settings) + elif relaynr in self._instances: + self._instances[relaynr].remove() + del self._instances[relaynr] + + def _remove_device(self, servicename): + if servicename in self._instances: + if self._instances[servicename] is not None: + self._instances[servicename].remove() + del self._instances[servicename] + + def terminate(self, signum, frame): + # Remove instances before exiting, remote services might need to perform actions before releasing control + # of the switch + for i in self._instances: + self._instances[i].remove() + os._exit(0) + + def _handletimertick(self): + # try catch, to make sure that we kill ourselves on an error. Without this try-catch, there would + # be an error written to stdout, and then the timer would not be restarted, resulting in a dead- + # lock waiting for manual intervention -> not good! + try: + for i in self._instances: + self._instances[i].tick() + except: + self._instances[i].remove() + import traceback + traceback.print_exc() + sys.exit(1) + return True + +if __name__ == '__main__': + # Argument parsing + parser = argparse.ArgumentParser( + description='Start and stop a generator based on conditions' + ) + + parser.add_argument('-d', '--debug', help='set logging level to debug', + action='store_true') + args = parser.parse_args() + + print ('-------- dbus_generator, v' + softwareversion + ' is starting up --------') + + logger = setup_logging(args.debug) + + # Have a mainloop, so we can send/receive asynchronous calls to and from dbus + DBusGMainLoop(set_as_default=True) + + generator = Generator() + signal.signal(signal.SIGTERM, generator.terminate) + + # Start and run the mainloop + mainloop = GLib.MainLoop() + mainloop.run() diff --git a/FileSets/v3.20~5/dbus_systemcalc.py b/FileSets/v3.30~1/dbus_systemcalc.py similarity index 96% rename from FileSets/v3.20~5/dbus_systemcalc.py rename to FileSets/v3.30~1/dbus_systemcalc.py index 80d4e8da..900b0efc 100755 --- a/FileSets/v3.20~5/dbus_systemcalc.py +++ b/FileSets/v3.30~1/dbus_systemcalc.py @@ -23,7 +23,7 @@ import delegates from sc_utils import safeadd as _safeadd, safemax as _safemax -softwareVersion = '2.133' +softwareVersion = '2.150' class SystemCalc: STATE_IDLE = 0 @@ -174,6 +174,14 @@ def __init__(self): '/Ac/Out/L1/S': dummy, '/Ac/Out/L1/V': dummy, '/Ac/Out/L1/I': dummy, + '/Ac/Out/L2/P': dummy, + '/Ac/Out/L2/S': dummy, + '/Ac/Out/L2/V': dummy, + '/Ac/Out/L2/I': dummy, + '/Ac/Out/L3/P': dummy, + '/Ac/Out/L3/S': dummy, + '/Ac/Out/L3/V': dummy, + '/Ac/Out/L3/I': dummy, #### add for GuiMods '/Ac/Out/L1/F': dummy, @@ -196,8 +204,22 @@ def __init__(self): '/Ac/Out/L1/P': dummy, '/Ac/Out/L1/V': dummy, '/Ac/Out/L1/I': dummy, + '/Ac/In/1/L2/P': dummy, + '/Ac/In/1/L2/I': dummy, + '/Ac/In/2/L2/P': dummy, + '/Ac/In/2/L2/I': dummy, + '/Ac/Out/L2/P': dummy, + '/Ac/Out/L2/V': dummy, + '/Ac/Out/L2/I': dummy, + '/Ac/In/1/L3/P': dummy, + '/Ac/In/1/L3/I': dummy, + '/Ac/In/2/L3/P': dummy, + '/Ac/In/2/L3/I': dummy, + '/Ac/Out/L3/P': dummy, + '/Ac/Out/L3/V': dummy, + '/Ac/Out/L3/I': dummy, #### add for GuiMods - '/Ac/L1/F': dummy, + '/Ac/Out/L1/F': dummy, '/Yield/Power': dummy, '/Soc': dummy}, @@ -989,17 +1011,18 @@ def _updatevalues(self): except TypeError: pass elif non_vebus_inverter is not None and active_input in (0, 1): - try: - c = _safeadd(c, -self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/P' % (active_input+1, phase))) - cc = _safeadd(cc, -self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/I' % (active_input+1, phase))) + for i in non_vebus_inverters: + try: + c = _safeadd(c, -self._dbusmonitor.get_value(i, '/Ac/In/%d/%s/P' % (active_input+1, phase))) + cc = _safeadd(cc, -self._dbusmonitor.get_value(i, '/Ac/In/%d/%s/I' % (active_input+1, phase))) #### added for GuiMods - if voltageIn[phase] == None: - voltageIn[phase] = self._dbusmonitor.get_value(em.service, '/Ac/In/%d/%s/V' % (active_input+1, phase)) - if frequencyIn == None: - frequencyIn = self._dbusmonitor.get_value(em.service, '/Ac/In/%d/%s/F' % (active_input+1, phase)) + if voltageIn[phase] == None: + voltageIn[phase] = self._dbusmonitor.get_value(i, '/Ac/In/%d/%s/V' % (active_input+1, phase)) + if frequencyIn == None: + frequencyIn = self._dbusmonitor.get_value(i, '/Ac/In/%d/%s/F' % (active_input+1, phase)) - except TypeError: - pass + except TypeError: + pass # If there's any power coming from a PV inverter in the inactive AC in (which is unlikely), # it will still be used, because there may also be a load in the same ACIn consuming @@ -1024,17 +1047,20 @@ def _updatevalues(self): frequencyIn = freq elif non_vebus_inverter is not None and active_input in (0, 1): - p = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/P' % (active_input + 1, phase)) - mc = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/I' % (active_input + 1, phase)) + for i in non_vebus_inverters: + p = _safeadd(p, + self._dbusmonitor.get_value(i, '/Ac/In/%d/%s/P' % (active_input + 1, phase))) + mc = _safeadd(mc, + self._dbusmonitor.get_value(i, '/Ac/In/%d/%s/I' % (active_input + 1, phase))) #### added for GuiMods - if voltageIn[phase] == None: - voltageIn[phase] = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/V' % (active_input + 1, phase)) - if frequencyIn == None: - frequencyIn = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/F' % (active_input + 1, phase)) + if voltageIn[phase] == None: + voltageIn[phase] = self._dbusmonitor.get_value(i, '/Ac/In/%d/%s/V' % (active_input + 1, phase)) + if frequencyIn == None: + frequencyIn = self._dbusmonitor.get_value(i, '/Ac/In/%d/%s/F' % (active_input + 1, phase)) - if p is not None: - consumption[phase] = _safeadd(0, consumption[phase]) - currentconsumption[phase] = _safeadd(0, currentconsumption[phase]) + if p is not None: + consumption[phase] = _safeadd(0, consumption[phase]) + currentconsumption[phase] = _safeadd(0, currentconsumption[phase]) # No relevant energy meter present. Assume there is no load between the grid and the multi. # There may be a PV inverter present though (Hub-3 setup). diff --git a/FileSets/v3.20~5/dbus_systemcalc.py.orig b/FileSets/v3.30~1/dbus_systemcalc.py.orig similarity index 97% rename from FileSets/v3.20~5/dbus_systemcalc.py.orig rename to FileSets/v3.30~1/dbus_systemcalc.py.orig index e24dfffe..6ae68254 100755 --- a/FileSets/v3.20~5/dbus_systemcalc.py.orig +++ b/FileSets/v3.30~1/dbus_systemcalc.py.orig @@ -21,7 +21,7 @@ from logger import setup_logging import delegates from sc_utils import safeadd as _safeadd, safemax as _safemax -softwareVersion = '2.133' +softwareVersion = '2.150' class SystemCalc: STATE_IDLE = 0 @@ -143,6 +143,14 @@ class SystemCalc: '/Ac/Out/L1/S': dummy, '/Ac/Out/L1/V': dummy, '/Ac/Out/L1/I': dummy, + '/Ac/Out/L2/P': dummy, + '/Ac/Out/L2/S': dummy, + '/Ac/Out/L2/V': dummy, + '/Ac/Out/L2/I': dummy, + '/Ac/Out/L3/P': dummy, + '/Ac/Out/L3/S': dummy, + '/Ac/Out/L3/V': dummy, + '/Ac/Out/L3/I': dummy, '/Yield/Power': dummy, '/Soc': dummy}, 'com.victronenergy.multi': { @@ -162,6 +170,20 @@ class SystemCalc: '/Ac/Out/L1/P': dummy, '/Ac/Out/L1/V': dummy, '/Ac/Out/L1/I': dummy, + '/Ac/In/1/L2/P': dummy, + '/Ac/In/1/L2/I': dummy, + '/Ac/In/2/L2/P': dummy, + '/Ac/In/2/L2/I': dummy, + '/Ac/Out/L2/P': dummy, + '/Ac/Out/L2/V': dummy, + '/Ac/Out/L2/I': dummy, + '/Ac/In/1/L3/P': dummy, + '/Ac/In/1/L3/I': dummy, + '/Ac/In/2/L3/P': dummy, + '/Ac/In/2/L3/I': dummy, + '/Ac/Out/L3/P': dummy, + '/Ac/Out/L3/V': dummy, + '/Ac/Out/L3/I': dummy, '/Yield/Power': dummy, '/Soc': dummy}, 'com.victronenergy.dcsystem': { @@ -853,11 +875,12 @@ class SystemCalc: except TypeError: pass elif non_vebus_inverter is not None and active_input in (0, 1): - try: - c = _safeadd(c, -self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/P' % (active_input+1, phase))) - cc = _safeadd(cc, -self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/I' % (active_input+1, phase))) - except TypeError: - pass + for i in non_vebus_inverters: + try: + c = _safeadd(c, -self._dbusmonitor.get_value(i, '/Ac/In/%d/%s/P' % (active_input+1, phase))) + cc = _safeadd(cc, -self._dbusmonitor.get_value(i, '/Ac/In/%d/%s/I' % (active_input+1, phase))) + except TypeError: + pass # If there's any power coming from a PV inverter in the inactive AC in (which is unlikely), # it will still be used, because there may also be a load in the same ACIn consuming @@ -874,8 +897,11 @@ class SystemCalc: currentconsumption[phase] = _safeadd(0, currentconsumption[phase]) mc = self._dbusmonitor.get_value(multi_path, '/Ac/ActiveIn/%s/I' % phase) elif non_vebus_inverter is not None and active_input in (0, 1): - p = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/P' % (active_input + 1, phase)) - mc = self._dbusmonitor.get_value(non_vebus_inverter, '/Ac/In/%d/%s/I' % (active_input + 1, phase)) + for i in non_vebus_inverters: + p = _safeadd(p, + self._dbusmonitor.get_value(i, '/Ac/In/%d/%s/P' % (active_input + 1, phase))) + mc = _safeadd(mc, + self._dbusmonitor.get_value(i, '/Ac/In/%d/%s/I' % (active_input + 1, phase))) if p is not None: consumption[phase] = _safeadd(0, consumption[phase]) currentconsumption[phase] = _safeadd(0, currentconsumption[phase]) diff --git a/FileSets/v3.30~1/main.qml b/FileSets/v3.30~1/main.qml new file mode 100644 index 00000000..d300de63 --- /dev/null +++ b/FileSets/v3.30~1/main.qml @@ -0,0 +1,598 @@ +//////// Modified to hide the OverviewTiles page +//////// Modified to substitute flow overview pages + +import QtQuick 1.1 + +import Qt.labs.components.native 1.0 +import com.victron.velib 1.0 +import "utils.js" as Utils + +PageStackWindow { + id: rootWindow + + gpsConnected: gpsFix.value === 1 + onCompletedChanged: checkAlarm() + initialPage: PageMain {} + + property VeQuickItem gpsService: VeQuickItem { uid: "dbus/com.victronenergy.system/GpsService" } + property VeQuickItem gpsFix: VeQuickItem { uid: Utils.path("dbus/", gpsService.value, "/Fix") } + property bool completed: false + property bool alarm: alarmNotification.valid ? alarmNotification.value : 0 + property bool showAlert: alertNotification.valid ? alertNotification.value : 0 +//////// added for GuiMods flow pages + property bool overviewsLoaded: defaultOverview.valid && generatorOverview.valid && mobileOverview.valid && startWithMenu.valid && mobileOverviewEnhanced.valid && guiModsFlowOverview.valid && generatorOverviewEnhanced.valid + property string bindPrefix: "com.victronenergy.settings" + + property bool isNotificationPage: pageStack.currentPage && pageStack.currentPage.title === qsTr("Notifications") + property bool isOverviewPage: pageStack.currentPage && pageStack.currentPage.model === overviewModel; + property bool isOfflineFwUpdatePage: pageStack.currentPage && pageStack.currentPage.objectName === "offlineFwUpdatePage"; + +//////// modified for GuiMods pages + property string hubOverviewType: theSystem.systemType.valid ? + withoutGridMeter.value === 1 ? "Hub" : theSystem.systemType.value : "unknown" + property string currentHubOverview: "OverviewHub.qml" + property string currentMobileOverview: "" + property string currentGeneratorOverview: "" + + // Keep track of the current view (menu/overview) to show as default next time the + // CCGX is restarted + onIsOverviewPageChanged: startWithMenu.setValue(isOverviewPage ? 0 : 1) + + // Add the correct OverviewGridParallelEnhanced page +//////// modified for OverviewHubEnhanced page + onHubOverviewTypeChanged: selectHubOverview () + + VBusItem + { + id: guiModsFlowOverview + bind: "com.victronenergy.settings/Settings/GuiMods/FlowOverview" + onValueChanged: selectHubOverview () + } + +////// GuiMods — DarkMode + property VBusItem darkModeItem: VBusItem { bind: "com.victronenergy.settings/Settings/GuiMods/DarkMode" } + property bool darkMode: darkModeItem.valid && darkModeItem.value == 1 + +////// GuiMods — DarkMode + Rectangle { + anchors + { + fill: parent + } + color: !darkMode ? "transparent" : "#202020" + z: -1 + } + + // base a new hub selection on the hub type and the enhanced flow overview flag + function selectHubOverview () + { + var newHubOverview = currentHubOverview + // Victron stock overviews with automatic selection + if (guiModsFlowOverview.value == 0) + { + switch(hubOverviewType){ + case "Hub": + case "Hub-1": + case "Hub-2": + case "Hub-3": + case "unknown": + newHubOverview = "OverviewHub.qml" + break; + case "Hub-4": + case "ESS": + newHubOverview = "OverviewGridParallel.qml" + break; + default: + break; + } + } + // Gui Mods simple flow + else if (guiModsFlowOverview.value === 1) + { + newHubOverview = "OverviewHubEnhanced.qml" + } + // Gui Mods complex flow (AC coupled or DC coupled) + else + { + newHubOverview = "OverviewFlowComplex.qml" + } + + if (newHubOverview != currentHubOverview) + { + replaceOverview(currentHubOverview, newHubOverview); + currentHubOverview = newHubOverview + } + + // Workaround the QTBUG-17012 (only the first sentence in each case of Switch Statement can be executed) + // by adding a return statement + return + } + + VBusItem { + id: generatorOverview + bind: "com.victronenergy.settings/Settings/Relay/Function" + onValueChanged: selectGeneratorOverview () + } + + VBusItem + { + id: generatorOverviewEnhanced + bind: "com.victronenergy.settings/Settings/GuiMods/UseEnhancedGeneratorOverview" + onValueChanged: selectGeneratorOverview () + } + + VBusItem { + bind: "com.victronenergy.generator.startstop1/GensetProductId" + onValueChanged: { + // Show specific overview for FischerPanda + extraOverview("OverviewGeneratorFp.qml", value === 0xB040) + + // Show generic overview for ComAp and DSE + extraOverview("OverviewGeneratorOther.qml", + [0xB044, 0xB046].indexOf(value) > -1) + + // Switch to FP overview in case it is the default one + if (isOverviewPage) { + pageStack.currentPage.currentIndex = getDefaultOverviewIndex() + } + } + } + + function selectGeneratorOverview () + { + var newGeneratorOverview + if (generatorOverview.value === 1) + { + if (generatorOverviewEnhanced.value === 1) + newGeneratorOverview = "OverviewGeneratorRelayEnhanced.qml" + else + newGeneratorOverview = "OverviewGeneratorRelay.qml" + if (currentGeneratorOverview === "") + extraOverview (newGeneratorOverview, true) + else + replaceOverview (currentGeneratorOverview, newGeneratorOverview) + currentGeneratorOverview = newGeneratorOverview + } + else + { + // hide existing generator overview if any + if (currentGeneratorOverview != "") + { + extraOverview (currentGeneratorOverview, false) + currentGeneratorOverview = "" + } + } + } + +//////// handle OverviewMobileEnhanced page + VBusItem + { + id: mobileOverview + bind: "com.victronenergy.settings/Settings/Gui/MobileOverview" + onValueChanged: selectMobileOverview () + } + VBusItem + { + id: mobileOverviewEnhanced + bind: "com.victronenergy.settings/Settings/GuiMods/UseEnhancedMobileOverview" + onValueChanged: selectMobileOverview () + } + + // base a new mobile overview selection on the the mobile overview and enhanced mobile overview flags + function selectMobileOverview () + { + var newMobileOverview + if (mobileOverview.value === 1) + { + if (mobileOverviewEnhanced.value === 1) + newMobileOverview = "OverviewMobileEnhanced.qml" + else + newMobileOverview = "OverviewMobile.qml" + if (currentMobileOverview === "") + extraOverview (newMobileOverview, true) + else + replaceOverview (currentMobileOverview, newMobileOverview) + currentMobileOverview = newMobileOverview + } + else + { + // hide existing mobile overview if any + if (currentMobileOverview != "") + { + extraOverview (currentMobileOverview, false) + currentMobileOverview = "" + } + } + } + +//////// show/hide the OverviewTiles page + VBusItem + { + id: showOverviewTiles + bind: "com.victronenergy.settings/Settings/GuiMods/ShowTileOverview" + onValueChanged: extraOverview ("OverviewTiles.qml", value === 1) + } + +//////// show/hide the OverviewRelays page + VBusItem { + id: showOverviewRelays + bind: "com.victronenergy.settings/Settings/GuiMods/ShowRelayOverview" + onValueChanged: extraOverview ("OverviewRelays.qml", value === 1) + } + +//////// show/hide the Overview Tanks/Temps/Digital Inputs page + VBusItem { + id: showOverviewTanksTemps + bind: "com.victronenergy.settings/Settings/GuiMods/ShowTanksTempsDigIn" + onValueChanged: extraOverview ("OverviewTanksTempsDigInputs.qml", value === 1) + } + + VBusItem { + id: tanksOverview + bind: "com.victronenergy.settings/Settings/Gui/TanksOverview" + onValueChanged:{ + extraOverview("OverviewTanks.qml", value === 1) + } + } + + VBusItem { + id: startWithMenu + bind: "com.victronenergy.settings/Settings/Gui/StartWithMenuView" + } + + VBusItem { + id: withoutGridMeter + bind: "com.victronenergy.settings/Settings/CGwacs/RunWithoutGridMeter" + } + + + VBusItem { + id: defaultOverview + bind: "com.victronenergy.settings/Settings/Gui/DefaultOverview" + } + + VBusItem { + id: touchEnabled + bind: "com.victronenergy.settings/Settings/Gui/TouchEnabled" + onValueChanged: { + if (completed && value !== undefined) + toast.createToast(value ? qsTr("Touch input on") : qsTr("Touch input off"), 3000) + } + } + + VBusItem { + id: alertNotification + bind: "com.victronenergy.platform/Notifications/Alert" + } + + VBusItem { + id: alarmNotification + bind: "com.victronenergy.platform/Notifications/Alarm" + } + + // Note: finding a firmware image on the storage device is error 4 for vrm storage + // since it should not be used for logging. That fact is used here to determine if + // there is a firmware image. + Connections { + target: storageEvents + onVrmStorageError: { + if (error === 4) { + setTopPage(offlineFwUpdates) + } + } + } + + Connections { + target: vePlatform + onMouseRejected: toast.createToast(qsTr("Touch input disabled"), 1000) + } + + onAlarmChanged: { + if (completed) + checkAlarm() + } + + // always keep track of system information + HubData { + id: theSystem + } + + // note: used for leaving the overviews as well + function backToMainMenu() + { + pageStack.pop(initialPage); + } + + Toast { + id: toast + transform: Scale { + xScale: screen.scaleX + yScale: screen.scaleY + origin.x: toast.width / 2 + origin.y: toast.height / 2 + } + } + + SignalToaster {} + + ToolbarHandlerPages { + id: mainToolbarHandler + isDefault: true + } + + ToolBarLayout { + id: mbTools + height: parent.height + +//// GuiMods - DarkMode + Row + { + spacing: 0 + anchors.fill: parent + Item { + id: pagesItem + anchors.verticalCenter: parent.verticalCenter + height: mbTools.height + width: 170 + + MouseArea { + anchors.fill: parent + onClicked: { + if (pageStack.currentPage) + pageStack.currentPage.toolbarHandler.leftAction(true) + } + } + + Row { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + + MbIcon { + anchors.verticalCenter: parent.verticalCenter + iconId: pageStack.currentPage ? pageStack.currentPage.leftIcon : "" + } + + Text { + anchors.verticalCenter: parent.verticalCenter + text: pageStack.currentPage ? pageStack.currentPage.leftText : "" + color: "white" + font.bold: true + font.pixelSize: 16 + } + } + } + + Item { + anchors.verticalCenter: parent.verticalCenter + height: mbTools.height + width: mbTools.width - pagesItem.width - menusItem.width - centerScrollIndicator.width + + MouseArea + { + anchors.fill: parent + onClicked: + { + if (darkModeItem.valid) + darkModeItem.setValue (! darkMode) + } + } + + Text + { + anchors.fill: parent + horizontalAlignment: Text.AlignHCenter + text: qsTr ("change to") + "\n" + (darkMode ? qsTr ("Light mode") : qsTr ("Dark mode")) + color: "white" + font.bold: true + font.pixelSize: 12 + visible: darkModeItem.valid + } + } + Item + { + id: centerScrollIndicator + anchors.verticalCenter: parent.verticalCenter + height: mbTools.height + width: 20 + MbIcon { + anchors.verticalCenter: parent.verticalCenter + iconId: pageStack.currentPage ? pageStack.currentPage.scrollIndicator : "" + } + } + + Item { + id: menusItem + anchors.verticalCenter: parent.verticalCenter + height: mbTools.height + width: pagesItem.width + + MouseArea { + anchors.fill: parent + onClicked: { + if (pageStack.currentPage) + pageStack.currentPage.toolbarHandler.rightAction(true) + } + } + + Row { + anchors.centerIn: parent + + MbIcon { + iconId: pageStack.currentPage ? pageStack.currentPage.rightIcon : "" + anchors.verticalCenter: parent.verticalCenter + } + + Text { + text: pageStack.currentPage ? pageStack.currentPage.rightText : "" + anchors.verticalCenter: parent.verticalCenter + color: "white" + font.bold: true + font.pixelSize: 16 + } + } + } + } + } + + Component.onCompleted: { + completed = true + } + + ListModel { + id: overviewModel + ListElement { + pageSource: "OverviewHub.qml" + } +//////// (commented out) -- added dynamically above +// ListElement { +// pageSource: "OverviewTiles.qml" +// } + } + + Component { + id: overviewComponent + PageFlow { + // Display default overview when loaded + defaultIndex: getDefaultOverviewIndex() + // Store the current overview page as default + onCurrentIndexChanged: if (active) defaultOverview.setValue(overviewModel.get(currentIndex).pageSource.replace(".qml", "")) + model: overviewModel + } + } + + // When all the related settings items are valid, show the overview page if was the last oppened page + // before restarting + Timer { + interval: 2000 + running: completed && overviewsLoaded && startWithMenu.valid + onTriggered: + { +//////// modified for OverviewGridParallelEnhanced page + selectHubOverview () + if (startWithMenu.value === 0) showOverview() + } + } + + function getDefaultOverviewIndex() + { + if(!defaultOverview.valid) + return 0 + for (var i = 0; i < overviewModel.count; i++){ + if (overviewModel.get(i).pageSource.replace(".qml", "") === defaultOverview.value) { + return i + } + } + return 0 + } + + Component { + id: noticationsComponent + PageNotifications {} + } + + Component { + id: offlineFwUpdates + PageSettingsFirmwareOffline { checkOnCompleted: true} + + } + + // Add or remove extra overviews. for example, generator overview + // shouldn't be shown if the start/stop functionality is not enabled. + // Index parameter is optional, usefull to keep an order. + function extraOverview(name, show, index) + { + var i = 0 + if (show) { + if (index !== undefined) { + if (overviewModel.get(index).pageSource === name) + return + // First append the page + overviewModel.append({"pageSource": name}) + // Then move all the pages behind index + overviewModel.move(index, overviewModel.count - 2, overviewModel.count - 2) + } else { + for (i = 0; i < overviewModel.count; i++) + if (overviewModel.get(i).pageSource === name) + // Don't append if already exists + return + overviewModel.append({"pageSource": name}) + } + } else { + for (i = 0; i < overviewModel.count; i++) + if (overviewModel.get(i).pageSource === name) + overviewModel.remove(i) + } + } + +//////// Modified to append page if oldPage not found + function replaceOverview(oldPage, newPage) + { + for (var i = 0; i < overviewModel.count; i++) + { + if (overviewModel.get(i).pageSource === oldPage) + { + overviewModel.get(i).pageSource = newPage + return + } + } + // here if oldPage wasn't found -- append the new page + overviewModel.append({"pageSource": newPage}) + } + + // Central mover for the ball animation on the overviews + // Instead of using a timer per line, using a central one + // reduces the CPU usage a little bit and makes the animations + // smoother. + Timer { + id: mover + property double pos: _counter / _loops + property int _counter + property int _loops: 13 + + interval: 100 + running: true + repeat: true + onTriggered: if (_counter >= (_loops - 1)) _counter = 0; else _counter++ + } + + // If an overview or notifications is active, the new page will replace it + // instead to be pushed. This way we prevent an unwanted stackpage depth + // increment everytime another page wants to be on top. + function setTopPage(page) + { + if (touchEnabled.valid && !touchEnabled.value) + return + + if (isNotificationPage || isOverviewPage || isOfflineFwUpdatePage) + rootWindow.pageStack.replace(page); + else + rootWindow.pageStack.push(page); + } + + function spuriousKeyPress() + { + return !pageStack.currentPage || !pageStack.currentPage.active + } + + function showOverview() + { + if (spuriousKeyPress() || isOverviewPage) + return + setTopPage(overviewComponent) + } + + function showPageNotifications() + { + if (spuriousKeyPress() || isNotificationPage) + return + setTopPage(noticationsComponent) + } + + function checkAlarm() + { + if (alarm) + showPageNotifications() + } + + FirmwareUpdate { id: firmwareUpdate } +} diff --git a/FileSets/v3.30~1/main.qml.orig b/FileSets/v3.30~1/main.qml.orig new file mode 100644 index 00000000..35be5402 --- /dev/null +++ b/FileSets/v3.30~1/main.qml.orig @@ -0,0 +1,403 @@ +import QtQuick 1.1 + +import Qt.labs.components.native 1.0 +import com.victron.velib 1.0 +import "utils.js" as Utils + +PageStackWindow { + id: rootWindow + + gpsConnected: gpsFix.value === 1 + onCompletedChanged: checkAlarm() + initialPage: PageMain {} + + property VeQuickItem gpsService: VeQuickItem { uid: "dbus/com.victronenergy.system/GpsService" } + property VeQuickItem gpsFix: VeQuickItem { uid: Utils.path("dbus/", gpsService.value, "/Fix") } + property bool completed: false + property bool alarm: alarmNotification.valid ? alarmNotification.value : 0 + property bool showAlert: alertNotification.valid ? alertNotification.value : 0 + property bool overviewsLoaded: defaultOverview.valid && generatorOverview.valid && mobileOverview.valid && tanksOverview.valid && startWithMenu.valid + property string bindPrefix: "com.victronenergy.settings" + + property bool isNotificationPage: pageStack.currentPage && pageStack.currentPage.title === qsTr("Notifications") + property bool isOverviewPage: pageStack.currentPage && pageStack.currentPage.model === overviewModel; + property bool isOfflineFwUpdatePage: pageStack.currentPage && pageStack.currentPage.objectName === "offlineFwUpdatePage"; + + + property string hubOverviewType: theSystem.systemType.valid ? + withoutGridMeter.value === 1 ? "Hub" : theSystem.systemType.value : "" + + // Keep track of the current view (menu/overview) to show as default next time the + // CCGX is restarted + onIsOverviewPageChanged: startWithMenu.setValue(isOverviewPage ? 0 : 1) + + // Add the correct OverviewHub page + onHubOverviewTypeChanged: { + switch(hubOverviewType){ + case "Hub": + case "Hub-1": + case "Hub-2": + case "Hub-3": + replaceOverview("OverviewGridParallel.qml", "OverviewHub.qml"); + break; + case "Hub-4": + case "ESS": + replaceOverview("OverviewHub.qml", "OverviewGridParallel.qml"); + break; + default: + break; + } + // Workaround the QTBUG-17012 (only the first sentence in each case of Switch Statement can be executed) + // by adding a return statement + return + } + + VBusItem { + id: generatorOverview + bind: "com.victronenergy.settings/Settings/Relay/Function" + onValueChanged: extraOverview("OverviewGeneratorRelay.qml", value === 1) + } + + VBusItem { + bind: "com.victronenergy.generator.startstop1/GensetProductId" + onValueChanged: { + // Show specific overview for FischerPanda + extraOverview("OverviewGeneratorFp.qml", value === 0xB040) + + // Show generic overview for ComAp and DSE + extraOverview("OverviewGeneratorOther.qml", + [0xB044, 0xB046].indexOf(value) > -1) + + // Switch to FP overview in case it is the default one + if (isOverviewPage) { + pageStack.currentPage.currentIndex = getDefaultOverviewIndex() + } + } + } + + VBusItem { + id: mobileOverview + bind: "com.victronenergy.settings/Settings/Gui/MobileOverview" + onValueChanged:{ + extraOverview("OverviewMobile.qml", value === 1) + } + } + VBusItem { + id: tanksOverview + bind: "com.victronenergy.settings/Settings/Gui/TanksOverview" + onValueChanged:{ + extraOverview("OverviewTanks.qml", value === 1) + } + } + + VBusItem { + id: startWithMenu + bind: "com.victronenergy.settings/Settings/Gui/StartWithMenuView" + } + + VBusItem { + id: withoutGridMeter + bind: "com.victronenergy.settings/Settings/CGwacs/RunWithoutGridMeter" + } + + + VBusItem { + id: defaultOverview + bind: "com.victronenergy.settings/Settings/Gui/DefaultOverview" + } + + VBusItem { + id: touchEnabled + bind: "com.victronenergy.settings/Settings/Gui/TouchEnabled" + onValueChanged: { + if (completed && value !== undefined) + toast.createToast(value ? qsTr("Touch input on") : qsTr("Touch input off"), 3000) + } + } + + VBusItem { + id: alertNotification + bind: "com.victronenergy.platform/Notifications/Alert" + } + + VBusItem { + id: alarmNotification + bind: "com.victronenergy.platform/Notifications/Alarm" + } + + // Note: finding a firmware image on the storage device is error 4 for vrm storage + // since it should not be used for logging. That fact is used here to determine if + // there is a firmware image. + Connections { + target: storageEvents + onVrmStorageError: { + if (error === 4) { + setTopPage(offlineFwUpdates) + } + } + } + + Connections { + target: vePlatform + onMouseRejected: toast.createToast(qsTr("Touch input disabled"), 1000) + } + + onAlarmChanged: { + if (completed) + checkAlarm() + } + + // always keep track of system information + HubData { + id: theSystem + } + + // note: used for leaving the overviews as well + function backToMainMenu() + { + pageStack.pop(initialPage); + } + + Toast { + id: toast + transform: Scale { + xScale: screen.scaleX + yScale: screen.scaleY + origin.x: toast.width / 2 + origin.y: toast.height / 2 + } + } + + SignalToaster {} + + ToolbarHandlerPages { + id: mainToolbarHandler + isDefault: true + } + + ToolBarLayout { + id: mbTools + height: parent.height + + Item { + anchors.verticalCenter: parent.verticalCenter + anchors.left: mbTools.left + height: mbTools.height + width: 200 + + MouseArea { + anchors.fill: parent + onClicked: { + if (pageStack.currentPage) + pageStack.currentPage.toolbarHandler.leftAction(true) + } + } + + Row { + anchors.centerIn: parent + + MbIcon { + anchors.verticalCenter: parent.verticalCenter + iconId: pageStack.currentPage ? pageStack.currentPage.leftIcon : "" + } + + Text { + anchors.verticalCenter: parent.verticalCenter + text: pageStack.currentPage ? pageStack.currentPage.leftText : "" + color: "white" + font.bold: true + font.pixelSize: 16 + } + } + } + + MbIcon { + id: centerScrollIndicator + + anchors { + horizontalCenter: parent.horizontalCenter + verticalCenter: mbTools.verticalCenter + } + iconId: pageStack.currentPage ? pageStack.currentPage.scrollIndicator : "" + } + + Item { + anchors.verticalCenter: parent.verticalCenter + height: mbTools.height + anchors.right: mbTools.right + width: 200 + + MouseArea { + anchors.fill: parent + onClicked: { + if (pageStack.currentPage) + pageStack.currentPage.toolbarHandler.rightAction(true) + } + } + + Row { + anchors.centerIn: parent + + MbIcon { + iconId: pageStack.currentPage ? pageStack.currentPage.rightIcon : "" + anchors.verticalCenter: parent.verticalCenter + } + + Text { + text: pageStack.currentPage ? pageStack.currentPage.rightText : "" + anchors.verticalCenter: parent.verticalCenter + color: "white" + font.bold: true + font.pixelSize: 16 + } + } + } + } + + Component.onCompleted: { + completed = true + } + + ListModel { + id: overviewModel + ListElement { + pageSource: "OverviewHub.qml" + } + ListElement { + pageSource: "OverviewTiles.qml" + } + } + + Component { + id: overviewComponent + PageFlow { + // Display default overview when loaded + defaultIndex: getDefaultOverviewIndex() + // Store the current overview page as default + onCurrentIndexChanged: if (active) defaultOverview.setValue(overviewModel.get(currentIndex).pageSource.replace(".qml", "")) + model: overviewModel + } + } + + // When all the related settings items are valid, show the overview page if was the last oppened page + // before restarting + Timer { + interval: 2000 + running: completed && overviewsLoaded && startWithMenu.valid + onTriggered: if (startWithMenu.value === 0) showOverview() + } + + function getDefaultOverviewIndex() + { + if(!defaultOverview.valid) + return 0 + for (var i = 0; i < overviewModel.count; i++){ + if (overviewModel.get(i).pageSource.replace(".qml", "") === defaultOverview.value) { + return i + } + } + return 0 + } + + Component { + id: noticationsComponent + PageNotifications {} + } + + Component { + id: offlineFwUpdates + PageSettingsFirmwareOffline { checkOnCompleted: true} + } + + // Add or remove extra overviews. for example, generator overview + // shouldn't be shown if the start/stop functionality is not enabled. + // Index parameter is optional, usefull to keep an order. + function extraOverview(name, show, index) + { + var i = 0 + if (show) { + if (index !== undefined) { + if (overviewModel.get(index).pageSource === name) + return + // First append the page + overviewModel.append({"pageSource": name}) + // Then move all the pages behind index + overviewModel.move(index, overviewModel.count - 2, overviewModel.count - 2) + } else { + for (i = 0; i < overviewModel.count; i++) + if (overviewModel.get(i).pageSource === name) + // Don't append if already exists + return + overviewModel.append({"pageSource": name}) + } + } else { + for (i = 0; i < overviewModel.count; i++) + if (overviewModel.get(i).pageSource === name) + overviewModel.remove(i) + } + } + + function replaceOverview(oldPage, newPage) + { + for (var i = 0; i < overviewModel.count; i++) + if (overviewModel.get(i).pageSource === oldPage) + overviewModel.get(i).pageSource = newPage + } + + // Central mover for the ball animation on the overviews + // Instead of using a timer per line, using a central one + // reduces the CPU usage a little bit and makes the animations + // smoother. + Timer { + id: mover + property double pos: _counter / _loops + property int _counter + property int _loops: 13 + + interval: 100 + running: true + repeat: true + onTriggered: if (_counter >= (_loops - 1)) _counter = 0; else _counter++ + } + + // If an overview or notifications is active, the new page will replace it + // instead to be pushed. This way we prevent an unwanted stackpage depth + // increment everytime another page wants to be on top. + function setTopPage(page) + { + if (touchEnabled.valid && !touchEnabled.value) + return + + if (isNotificationPage || isOverviewPage || isOfflineFwUpdatePage) + rootWindow.pageStack.replace(page); + else + rootWindow.pageStack.push(page); + } + + function spuriousKeyPress() + { + return !pageStack.currentPage || !pageStack.currentPage.active + } + + function showOverview() + { + if (spuriousKeyPress() || isOverviewPage) + return + setTopPage(overviewComponent) + } + + function showPageNotifications() + { + if (spuriousKeyPress() || isNotificationPage) + return + setTopPage(noticationsComponent) + } + + function checkAlarm() + { + if (alarm) + showPageNotifications() + } + + FirmwareUpdate { id: firmwareUpdate } +} diff --git a/FileSets/v3.30~1/startstop.py b/FileSets/v3.30~1/startstop.py new file mode 100644 index 00000000..112bdc03 --- /dev/null +++ b/FileSets/v3.30~1/startstop.py @@ -0,0 +1,1551 @@ +#!/usr/bin/python -u +# -*- coding: utf-8 -*- + +#### GuiMods +#### This file has been modified to allow the generator running state derived from the generator digital input +#### or the genset AC input +#### If the incoming generator state changes, the manual start state is updated +#### time accumulation is suspended when the generator is not running +#### A switch in the generator settings menucontrols whethter the incoming state affects manual start or time accumulaiton +#### It is now possible to start the generator manually and have it stop automatically based on the preset conditions +#### for automaitc start / stop +#### A service interval timer was added so the accumulated run time does not need to be reset, +#### providing total run time for the generator +#### warm-up and cool-down periods have been modified in order to work well with an external transfer switch +#### selecting grid or generator ahead of a MultiPlus input. +#### Search for #### GuiMods to find changes + +# Function +# dbus_generator monitors the dbus for batteries (com.victronenergy.battery.*) and +# vebus com.victronenergy.vebus.* +# Battery and vebus monitors can be configured through the gui. +# It then monitors SOC, AC loads, battery current and battery voltage,to auto start/stop the generator based +# on the configuration settings. Generator can be started manually or periodically setting a tes trun period. +# Time zones function allows to use different values for the conditions along the day depending on time + +import dbus +import datetime +import calendar +import time +import sys +import json +import os +import logging +from collections import OrderedDict +import monotonic_time +from gen_utils import SettingsPrefix, Errors, States, enum +from gen_utils import create_dbus_service +# Victron packages +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) +from ve_utils import exit_on_error +from settingsdevice import SettingsDevice + +RunningConditions = enum( + Stopped = 0, + Manual = 1, + TestRun = 2, + LossOfCommunication = 3, + Soc = 4, + Acload = 5, + BatteryCurrent = 6, + BatteryVoltage = 7, + InverterHighTemp = 8, + InverterOverload = 9, + StopOnAc1 = 10, + StopOnAc2 = 11) + +Capabilities = enum( + WarmupCooldown = 1 +) + +SYSTEM_SERVICE = 'com.victronenergy.system' +BATTERY_PREFIX = '/Dc/Battery' +HISTORY_DAYS = 30 + +def safe_max(args): + try: + return max(x for x in args if x is not None) + except ValueError: + return None + +class Condition(object): + def __init__(self, parent): + self.parent = parent + self.reached = False + self.start_timer = 0 + self.stop_timer = 0 + self.valid = True + self.enabled = False + self.retries = 0 + + def __getitem__(self, key): + try: + return getattr(self, key) + except AttributeError: + raise KeyError(key) + + def __setitem__(self, key, value): + setattr(self, key, value) + + def get_value(self): + raise NotImplementedError("get_value") + + @property + def vebus_service(self): + return self.parent._vebusservice if self.parent._vebusservice else '' + + @property + def monitor(self): + return self.parent._dbusmonitor + +class SocCondition(Condition): + name = 'soc' + monitoring = 'battery' + boolean = False + timed = True + + def get_value(self): + return self.parent._get_battery().soc + +class AcLoadCondition(Condition): + name = 'acload' + monitoring = 'vebus' + boolean = False + timed = True + + def get_value(self): + loadOnAcOut = [] + totalConsumption = [] + + for phase in ['L1', 'L2', 'L3']: + # Get the values directly from the inverter, systemcalc doesn't provide raw inverted power + loadOnAcOut.append(self.monitor.get_value(self.vebus_service, ('/Ac/Out/%s/P' % phase))) + + # Calculate total consumption, '/Ac/Consumption/%s/Power' is deprecated + c_i = self.monitor.get_value(SYSTEM_SERVICE, ('/Ac/ConsumptionOnInput/%s/Power' % phase)) + c_o = self.monitor.get_value(SYSTEM_SERVICE, ('/Ac/ConsumptionOnOutput/%s/Power' % phase)) + totalConsumption.append(sum(filter(None, (c_i, c_o)))) + + # Invalidate if vebus is not available + if loadOnAcOut[0] == None: + return None + + # Total consumption + if self.parent._settings['acloadmeasurement'] == 0: + return sum(filter(None, totalConsumption)) + + # Load on inverter AC out + if self.parent._settings['acloadmeasurement'] == 1: + return sum(filter(None, loadOnAcOut)) + + # Highest phase load + if self.parent._settings['acloadmeasurement'] == 2: + return safe_max(loadOnAcOut) + +class BatteryCurrentCondition(Condition): + name = 'batterycurrent' + monitoring = 'battery' + boolean = False + timed = True + + def get_value(self): + c = self.parent._get_battery().current + if c is not None: + c *= -1 + return c + +class BatteryVoltageCondition(Condition): + name = 'batteryvoltage' + monitoring = 'battery' + boolean = False + timed = True + + def get_value(self): + return self.parent._get_battery().voltage + +class InverterTempCondition(Condition): + name = 'inverterhightemp' + monitoring = 'vebus' + boolean = True + timed = True + + def get_value(self): + v = self.monitor.get_value(self.vebus_service, + '/Alarms/HighTemperature') + + # When multi is connected to CAN-bus, alarms are published to + # /Alarms/HighTemperature... but when connected to vebus alarms are + # splitted in three phases and published to /Alarms/LX/HighTemperature... + if v is None: + inverterHighTemp = [] + for phase in ['L1', 'L2', 'L3']: + # Inverter alarms must be fetched directly from the inverter service + inverterHighTemp.append(self.monitor.get_value(self.vebus_service, ('/Alarms/%s/HighTemperature' % phase))) + return safe_max(inverterHighTemp) + return v + +class InverterOverloadCondition(Condition): + name = 'inverteroverload' + monitoring = 'vebus' + boolean = True + timed = True + + def get_value(self): + v = self.monitor.get_value(self.vebus_service, + '/Alarms/Overload') + + # When multi is connected to CAN-bus, alarms are published to + # /Alarms/Overload... but when connected to vebus alarms are + # splitted in three phases and published to /Alarms/LX/Overload... + if v is None: + inverterOverload = [] + for phase in ['L1', 'L2', 'L3']: + # Inverter alarms must be fetched directly from the inverter service + inverterOverload.append(self.monitor.get_value(self.vebus_service, ('/Alarms/%s/Overload' % phase))) + return safe_max(inverterOverload) + return v + +class StopOnAc1Condition(Condition): + name = 'stoponac1' + monitoring = 'vebus' + boolean = True + timed = False + + def get_value(self): + # AC input 1 + available = self.monitor.get_value(self.vebus_service, + '/Ac/State/AcIn1Available') + if available is None: + # Not supported in firmware, fall back to old behaviour + activein = self.monitor.get_value(self.vebus_service, + '/Ac/ActiveIn/ActiveInput') + + # Active input is connected + connected = self.monitor.get_value(self.vebus_service, + '/Ac/ActiveIn/Connected') + if None not in (activein, connected): + return activein == 0 and connected == 1 + return None + + return bool(available) + +class StopOnAc2Condition(Condition): + name = 'stoponac2' + monitoring = 'vebus' + boolean = True + timed = False + + def get_value(self): + # AC input 2 available (used when grid is on AC-in-2) + available = self.monitor.get_value(self.vebus_service, + '/Ac/State/AcIn2Available') + + return None if available is None else bool(available) + +class Battery(object): + def __init__(self, monitor, service, prefix): + self.monitor = monitor + self.service = service + self.prefix = prefix + + @property + def voltage(self): + return self.monitor.get_value(self.service, self.prefix + '/Voltage') + + @property + def current(self): + return self.monitor.get_value(self.service, self.prefix + '/Current') + + @property + def soc(self): + # Soc from the device doesn't have the '/Dc/0' prefix like the current and voltage do, but it does + # have the same prefix on systemcalc + return self.monitor.get_value(self.service, (BATTERY_PREFIX if self.prefix == BATTERY_PREFIX else '') + '/Soc') + +class StartStop(object): + _driver = None + def __init__(self, instance): +#### GuiMods + logging.info ("GuiMods version of startstop.py") + self._currentTime = 0 + self._last_update_mtime = 0 + self._accumulatedRunTime = 0 + self._digitalInputTypeObject = None + self._generatorInputStateObject = 0 + self._lastState = 0 + self._externalOverride = False + self._externalOverrideDelay = 99 + self._lastExternalOverride = False + self._searchDelay = 99 + self._linkToExternalState = False +#### GuiMods warm-up / cool-down + self._warmUpEndTime = 0 + self._coolDownEndTime = 0 + self._ac1isIgnored = False + self._ac2isIgnored = False + self._activeAcInIsIgnored = False + self._acInIsGenerator = False + self._generatorAcInput = 0 + + self._dbusservice = None + self._settings = None + self._dbusmonitor = None + self._remoteservice = None + self._name = None + self._enabled = False + self._instance = instance + + # One second per retry + self.RETRIES_ON_ERROR = 300 + self._testrun_soc_retries = 0 + self._last_counters_check = 0 + + self._starttime = 0 + self._stoptime = 0 # Used for cooldown + self._manualstarttimer = 0 + self._last_runtime_update = 0 + self._timer_runnning = 0 + + # The installer left autostart disabled + self.AUTOSTART_DISABLED_ALARM_TIME = 600 + self._autostart_last_time = self._get_monotonic_seconds() + + + # Manual battery service selection is deprecated in favour + # of getting the values directly from systemcalc, we keep + # manual selected services handling for compatibility reasons. + self._vebusservice = None + self._errorstate = 0 + self._battery_service = None + self._battery_prefix = None + + self._acpower_inverter_input = { + 'timeout': 0, + 'unabletostart': False + } + + # Order is important. Conditions are evaluated in the order listed. + self._condition_stack = OrderedDict({ + SocCondition.name: SocCondition(self), + AcLoadCondition.name: AcLoadCondition(self), + BatteryCurrentCondition.name: BatteryCurrentCondition(self), + BatteryVoltageCondition.name: BatteryVoltageCondition(self), + InverterTempCondition.name: InverterTempCondition(self), + InverterOverloadCondition.name: InverterOverloadCondition(self), + StopOnAc1Condition.name: StopOnAc1Condition(self), + StopOnAc2Condition.name: StopOnAc2Condition(self) + }) + + def set_sources(self, dbusmonitor, settings, name, remoteservice): + self._settings = SettingsPrefix(settings, name) + self._dbusmonitor = dbusmonitor + self._remoteservice = remoteservice + self._name = name + + self.log_info('Start/stop instance created for %s.' % self._remoteservice) + self._remote_setup() + + def _create_service(self): + self._dbusservice = self._create_dbus_service() + + # The driver used for this start/stop service + self._dbusservice.add_path('/Type', value=self._driver) + # State: None = invalid, 0 = stopped, 1 = running, 2=Warm-up, 3=Cool-down + self._dbusservice.add_path('/State', value=None, gettextcallback=lambda p, v: States.get_description(v)) + # RunningByConditionCode: Numeric Companion to /RunningByCondition below, but + # also encompassing a Stopped state. + self._dbusservice.add_path('/RunningByConditionCode', value=None) + # Error + self._dbusservice.add_path('/Error', value=None, gettextcallback=lambda p, v: Errors.get_description(v)) + # Condition that made the generator start + self._dbusservice.add_path('/RunningByCondition', value=None) + # Runtime + self._dbusservice.add_path('/Runtime', value=None, gettextcallback=self._seconds_to_text) + # Today runtime + self._dbusservice.add_path('/TodayRuntime', value=None, gettextcallback=self._seconds_to_text) + # Test run runtime + self._dbusservice.add_path('/TestRunIntervalRuntime', value=None , gettextcallback=self._seconds_to_text) + # Next test run date, values is 0 for test run disabled + self._dbusservice.add_path('/NextTestRun', value=None, gettextcallback=lambda p, v: datetime.datetime.fromtimestamp(v).strftime('%c')) + # Next test run is needed 1, not needed 0 + self._dbusservice.add_path('/SkipTestRun', value=None) + # Manual start + self._dbusservice.add_path('/ManualStart', value=None, writeable=True) + # Manual start timer + self._dbusservice.add_path('/ManualStartTimer', value=None, writeable=True) + # Silent mode active + self._dbusservice.add_path('/QuietHours', value=None) + # Alarms + self._dbusservice.add_path('/Alarms/NoGeneratorAtAcIn', value=None) + self._dbusservice.add_path('/Alarms/ServiceIntervalExceeded', value=None) + self._dbusservice.add_path('/Alarms/AutoStartDisabled', value=None) + # Autostart + self._dbusservice.add_path('/AutoStartEnabled', value=None, writeable=True, onchangecallback=self._set_autostart) + # Accumulated runtime + self._dbusservice.add_path('/AccumulatedRuntime', value=None) + # Service interval + self._dbusservice.add_path('/ServiceInterval', value=None) + # Capabilities, where we can add bits + self._dbusservice.add_path('/Capabilities', value=0) + # Service countdown, calculated by running time and service interval + self._dbusservice.add_path('/ServiceCounter', value=None) + self._dbusservice.add_path('/ServiceCounterReset', value=None, writeable=True, onchangecallback=self._reset_service_counter) + # Publish what service we're controlling, and the productid + self._dbusservice.add_path('/GensetService', value=self._remoteservice) + self._dbusservice.add_path('/GensetInstance', + value=self._dbusmonitor.get_value(self._remoteservice, '/DeviceInstance')) + self._dbusservice.add_path('/GensetProductId', + value=self._dbusmonitor.get_value(self._remoteservice, '/ProductId')) + + # We need to set the values after creating the paths to trigger the 'onValueChanged' event for the gui + # otherwise the gui will report the paths as invalid if we remove and recreate the paths without + # restarting the dbusservice. + self._dbusservice['/State'] = 0 + self._dbusservice['/RunningByConditionCode'] = RunningConditions.Stopped + self._dbusservice['/Error'] = 0 + self._dbusservice['/RunningByCondition'] = '' + self._dbusservice['/Runtime'] = 0 + self._dbusservice['/TodayRuntime'] = 0 + self._dbusservice['/TestRunIntervalRuntime'] = self._interval_runtime(self._settings['testruninterval']) + self._dbusservice['/NextTestRun'] = None + self._dbusservice['/SkipTestRun'] = None + self._dbusservice['/ProductName'] = "Generator start/stop" + self._dbusservice['/ManualStart'] = 0 + self._dbusservice['/ManualStartTimer'] = 0 + self._dbusservice['/QuietHours'] = 0 + self._dbusservice['/Alarms/NoGeneratorAtAcIn'] = 0 + self._dbusservice['/Alarms/ServiceIntervalExceeded'] = 0 + self._dbusservice['/Alarms/AutoStartDisabled'] = 0 + self._dbusservice['/AutoStartEnabled'] = self._settings['autostart'] + self._dbusservice['/AccumulatedRuntime'] = int(self._settings['accumulatedtotal']) + self._dbusservice['/ServiceInterval'] = int(self._settings['serviceinterval']) + self._dbusservice['/ServiceCounter'] = None + self._dbusservice['/ServiceCounterReset'] = 0 + +#### GuiMods + # generator input running state + self._dbusservice.add_path('/GeneratorRunningState', value=None) + # external override active + self._dbusservice.add_path('/ExternalOverride', value=None) + self._dbusservice['/GeneratorRunningState'] = "?" + self._dbusservice['/ExternalOverride'] = False + self._ignoresAutoStartCondition = False + + @property + def capabilities(self): + return self._dbusservice['/Capabilities'] + + def _set_autostart(self, path, value): + if 0 <= value <= 1: + self._settings['autostart'] = int(value) + return True + return False + + def enable(self): + if self._enabled: + return + self.log_info('Enabling auto start/stop and taking control of remote switch') + self._create_service() + self._determineservices() + self._update_remote_switch() + # If cooldown or warmup is enabled, the Quattro may be left in a bad + # state if there is an unfortunate crash or a reboot. Set the ignore_ac + # flag to a sane value on startup. + if self._settings['cooldowntime'] > 0 or \ + self._settings['warmuptime'] > 0: + self._set_ignore_ac1(False) + self._set_ignore_ac2(False) + self._enabled = True + + def disable(self): + if not self._enabled: + return + self.log_info('Disabling auto start/stop, releasing control of remote switch') + self._remove_service() + self._enabled = False + + def remove(self): + self.disable() + self.log_info('Removed from start/stop instances') + + def _remove_service(self): + self._dbusservice.__del__() + self._dbusservice = None + + def device_added(self, dbusservicename, instance): + self._determineservices() + + def device_removed(self, dbusservicename, instance): + self._determineservices() + + def get_error(self): + return self._dbusservice['/Error'] + + def set_error(self, errorn): + self._dbusservice['/Error'] = errorn + + def clear_error(self): + self._dbusservice['/Error'] = Errors.NONE + + def dbus_value_changed(self, dbusServiceName, dbusPath, options, changes, deviceInstance): + if self._dbusservice is None: + return + + # AcIn1Available is needed to determine capabilities, but may + # only show up later. So we have to wait for it here. + if self._vebusservice is not None and \ + dbusServiceName == self._vebusservice and \ + dbusPath == '/Ac/State/AcIn1Available': + self._set_capabilities() + + if dbusServiceName != 'com.victronenergy.system': + return + if dbusPath == '/AutoSelectedBatteryMeasurement' and self._settings['batterymeasurement'] == 'default': + self._determineservices() + + if dbusPath == '/VebusService': + self._determineservices() + + def handlechangedsetting(self, setting, oldvalue, newvalue): + if self._dbusservice is None: + return + if self._name not in setting: + # Not our setting + return + + s = self._settings.removeprefix(setting) + + if s == 'batterymeasurement': + self._determineservices() + # Reset retries and valid if service changes + for condition in self._condition_stack.values(): + if condition['monitoring'] == 'battery': + condition['valid'] = True + condition['retries'] = 0 + + if s == 'autostart': + self.log_info('Autostart function %s.' % ('enabled' if newvalue == 1 else 'disabled')) + self._dbusservice['/AutoStartEnabled'] = self._settings['autostart'] + + if self._dbusservice is not None and s == 'testruninterval': + self._dbusservice['/TestRunIntervalRuntime'] = self._interval_runtime( + self._settings['testruninterval']) + + if s == 'serviceinterval': + try: + self._dbusservice['/ServiceInterval'] = int(newvalue) + except TypeError: + pass + if newvalue == 0: + self._dbusservice['/ServiceCounter'] = None + else: + self._update_accumulated_time() + if s == 'lastservicereset': + self._update_accumulated_time() + + def _reset_service_counter(self, path, value): + if (path == '/ServiceCounterReset' and value == int(1) and self._dbusservice['/AccumulatedRuntime']): + self._settings['lastservicereset'] = self._dbusservice['/AccumulatedRuntime'] + self._update_accumulated_time() + self.log_info('Service counter reset triggered.') + + return True + + def _seconds_to_text(self, path, value): + m, s = divmod(value, 60) + h, m = divmod(m, 60) + return '%dh, %dm, %ds' % (h, m, s) + + def log_info(self, msg): + logging.info(self._name + ': %s' % msg) + + def tick(self): + if not self._enabled: + return + +#### GuiMods warm-up / cool-down + # determine which AC input is connected to the generator + try: + if self._dbusmonitor.get_value ('com.victronenergy.settings', '/Settings/SystemSetup/AcInput1') == 2: + self._generatorAcInput = 1 + elif self._dbusmonitor.get_value (SYSTEM_SERVICE, '/Ac/In/NumberOfAcInputs') >= 2 \ + and self._dbusmonitor.get_value ('com.victronenergy.settings', '/Settings/SystemSetup/AcInput2') == 2: + self._generatorAcInput = 2 + # no generator input found + else: + self._generatorAcInput = 0 + except: + self._generatorAcInput = 0 + + +#### GuiMods warm-up / cool-down + self._currentTime = self._get_monotonic_seconds () + + self._check_remote_status() +#### GuiMods + self._linkToExternalState = self._settings['linkManualStartToExternal'] == 1 + self._processGeneratorRunDetection () + + self._evaluate_startstop_conditions() + self._evaluate_autostart_disabled_alarm() + self._detect_generator_at_acinput() + if self._dbusservice['/ServiceCounterReset'] == 1: + self._dbusservice['/ServiceCounterReset'] = 0 + +#### GuiMods warm-up / cool-down + state = self._dbusservice['/State'] + + # shed load for active generator input in warm-up and cool-down + # note that external transfer switch might change the state of on generator + # so this needs to be checked and load adjusted every pass + # restore load for sources no longer in use or if state is not in warm-up/cool-down + # restoring load is delayed 1following end of cool-down + # to allow the generator to actually stop producing power + if state in (States.WARMUP, States.COOLDOWN, States.STOPPING): + self._ignore_ac (True) + else: + self._ignore_ac (False) + + # update cool down end time while running and generator has the load + # this is done because acInIsGenerator may change by an external transfer switch + # and we want an accurate picture of the cool down end time + # based on the last time the generatot was loaded + if state == States.RUNNING and self._acInIsGenerator: + self._coolDownEndTime = self._currentTime + self._settings['cooldowntime'] +#### end GuiMods warm-up / cool-down + + + def _evaluate_startstop_conditions(self): + if self.get_error() != Errors.NONE: + # First evaluation after an error, log it + if self._errorstate == 0: + self._errorstate = 1 + self._dbusservice['/State'] = States.ERROR + self.log_info('Error: #%i - %s, stop controlling remote.' % + (self.get_error(), + Errors.get_description(self.get_error()))) + elif self._errorstate == 1: + # Error cleared + self._errorstate = 0 + self._dbusservice['/State'] = States.STOPPED + self.log_info('Error state cleared, taking control of remote switch.') + + start = False + startbycondition = None + activecondition = self._dbusservice['/RunningByCondition'] + today = calendar.timegm(datetime.date.today().timetuple()) + self._timer_runnning = False + connection_lost = False + running = self._dbusservice['/State'] in (States.RUNNING, States.WARMUP) + + self._check_quiet_hours() + + # New day, register it + if self._last_counters_check < today and self._dbusservice['/State'] == States.STOPPED: + self._last_counters_check = today + self._update_accumulated_time() + + # Update current and accumulated runtime. +#### GuiMods + self._accumulateRunTime () + +#### GuiMods + # A negative /ManualStartTimer is used by the GUI to signal the generator should start now + # but stop when all auto stop conditions have been met + # so we skip manual start evaluation if this is the case + # and set a flag for use below to ignore auto start conditions + # the generator is actually started by the auto start/stop logic below + if self._dbusservice['/ManualStartTimer'] < 0 and self._dbusservice['/ManualStart'] == 1: + self._dbusservice['/ManualStartTimer'] = 0 + self._dbusservice['/ManualStart'] = 0 + self._ignoresAutoStartCondition = True + else: + self._ignoresAutoStartCondition = False + if self._evaluate_manual_start(): + startbycondition = 'manual' + start = True + + # Conditions will only be evaluated if the autostart functionality is enabled + if self._settings['autostart'] == 1: + + if self._evaluate_testrun_condition(): + startbycondition = 'testrun' + start = True + + # Evaluate stop on AC IN conditions first, when this conditions are enabled and reached the generator + # will stop as soon as AC IN in active. Manual and testrun conditions will make the generator start + # or keep it running. + stop_on_ac_reached = (self._evaluate_condition(self._condition_stack[StopOnAc1Condition.name]) or + self._evaluate_condition(self._condition_stack[StopOnAc2Condition.name])) + stop_by_ac1_ac2 = startbycondition not in ['manual', 'testrun'] and stop_on_ac_reached + + if stop_by_ac1_ac2 and running and activecondition not in ['manual', 'testrun']: + self.log_info('AC input available, stopping') + + # Evaluate value conditions + for condition, data in self._condition_stack.items(): + # Do not evaluate rest of conditions if generator is configured to stop + # when AC IN is available + if stop_by_ac1_ac2: + start = False + if running: + self._reset_condition(data) + continue + else: + break + + # Don't short-circuit this, _evaluate_condition sets .reached + start = self._evaluate_condition(data) or start + startbycondition = condition if start and startbycondition is None else startbycondition + # Connection lost is set to true if the number of retries of one or more enabled conditions + # >= RETRIES_ON_ERROR + if data.enabled: + connection_lost = data.retries >= self.RETRIES_ON_ERROR + + # If none condition is reached check if connection is lost and start/keep running the generator + # depending on '/OnLossCommunication' setting + if not start and connection_lost: + # Start always + if self._settings['onlosscommunication'] == 1: + start = True + startbycondition = 'lossofcommunication' + # Keep running if generator already started + if running and self._settings['onlosscommunication'] == 2: + start = True + startbycondition = 'lossofcommunication' + + if not start and self._errorstate: + self._stop_generator() + + if self._errorstate: + return + + if start: + self._start_generator(startbycondition) +#### GuiMods + # bypass the minimum run time check if External Override is active + elif (self._dbusservice['/Runtime'] >= self._settings['minimumruntime'] * 60 + or activecondition == 'manual') or self._dbusservice['/ExternalOverride']: + self._stop_generator() + + def _evaluate_autostart_disabled_alarm(self): + + if self._settings['autostart'] == 0 or \ + self.get_error() != Errors.REMOTEDISABLED or \ + self._settings['autostartdisabledalarm'] == 0: + self._autostart_last_time = self._get_monotonic_seconds() + if self._dbusservice['/Alarms/AutoStartDisabled'] != 0: + self._dbusservice['/Alarms/AutoStartDisabled'] = 0 + return + + timedisabled = self._get_monotonic_seconds() - self._autostart_last_time + if timedisabled > self.AUTOSTART_DISABLED_ALARM_TIME and self._dbusservice['/Alarms/AutoStartDisabled'] != 2: + self.log_info("Autostart was left for more than %i seconds, triggering alarm." % int(timedisabled)) + self._dbusservice['/Alarms/AutoStartDisabled'] = 2 + + +#### GuiMods warm-up / cool-down - rewrote so acInIsGenerator is updated even if alarm is disabled + def _detect_generator_at_acinput(self): +#### GuiMods warm-up / cool-down + self._acInIsGenerator = False # covers all conditions that result in a return + + state = self._dbusservice['/State'] + if state in [States.STOPPED, States.COOLDOWN, States.WARMUP]: + self._reset_acpower_inverter_input() + return + + vebus_service = self._vebusservice if self._vebusservice else '' + activein_state = self._dbusmonitor.get_value( + vebus_service, '/Ac/ActiveIn/Connected') + + # Path not supported, skip evaluation + if activein_state == None: + return + + # Sources 0 = Not available, 1 = Grid, 2 = Generator, 3 = Shore + generator_acsource = self._dbusmonitor.get_value( + SYSTEM_SERVICE, '/Ac/ActiveIn/Source') == 2 + # Not connected = 0, connected = 1 + activein_connected = activein_state == 1 + +#### GuiMods warm-up / cool-down + if self._settings['nogeneratoratacinalarm'] == 0: + processAlarm = False + self._reset_acpower_inverter_input() + else: + processAlarm = True + + if generator_acsource and activein_connected: +#### GuiMods warm-up / cool-down + self._acInIsGenerator = True +#### GuiMods warm-up / cool-down + if processAlarm and self._acpower_inverter_input['unabletostart']: + self.log_info('Generator detected at inverter AC input, alarm removed') + self._reset_acpower_inverter_input() +#### GuiMods warm-up / cool-down + elif not processAlarm: + self._reset_acpower_inverter_input() + return + elif self._acpower_inverter_input['timeout'] < self.RETRIES_ON_ERROR: + self._acpower_inverter_input['timeout'] += 1 + elif not self._acpower_inverter_input['unabletostart']: + self._acpower_inverter_input['unabletostart'] = True + self._dbusservice['/Alarms/NoGeneratorAtAcIn'] = 2 + self.log_info('Generator not detected at inverter AC input, triggering alarm') + + + def _reset_acpower_inverter_input(self, clear_error=True): + if self._acpower_inverter_input['timeout'] != 0: + self._acpower_inverter_input['timeout'] = 0 + + if self._acpower_inverter_input['unabletostart'] != 0: + self._acpower_inverter_input['unabletostart'] = 0 + + self._dbusservice['/Alarms/NoGeneratorAtAcIn'] = 0 + + def _reset_condition(self, condition): + condition['reached'] = False + if condition['timed']: + condition['start_timer'] = 0 + condition['stop_timer'] = 0 + + def _check_condition(self, condition, value): + name = condition['name'] + + if self._settings[name + 'enabled'] == 0: + if condition['enabled']: + condition['enabled'] = False + self.log_info('Disabling (%s) condition' % name) + condition['retries'] = 0 + condition['valid'] = True + self._reset_condition(condition) + return False + + elif not condition['enabled']: + condition['enabled'] = True + self.log_info('Enabling (%s) condition' % name) + + if (condition['monitoring'] == 'battery') and (self._settings['batterymeasurement'] == 'nobattery'): + # If no battery monitor is selected reset the condition + self._reset_condition(condition) + return False + + if value is None and condition['valid']: + if condition['retries'] >= self.RETRIES_ON_ERROR: + logging.info('Error getting (%s) value, skipping evaluation till get a valid value' % name) + self._reset_condition(condition) + self._comunnication_lost = True + condition['valid'] = False + else: + condition['retries'] += 1 + if condition['retries'] == 1 or (condition['retries'] % 10) == 0: + self.log_info('Error getting (%s) value, retrying(#%i)' % (name, condition['retries'])) + return False + + elif value is not None and not condition['valid']: + self.log_info('Success getting (%s) value, resuming evaluation' % name) + condition['valid'] = True + condition['retries'] = 0 + + # Reset retries if value is valid + if value is not None and condition['retries'] > 0: + self.log_info('Success getting (%s) value, resuming evaluation' % name) + condition['retries'] = 0 + + return condition['valid'] + + def _evaluate_condition(self, condition): + name = condition['name'] + value = condition.get_value() + setting = ('qh_' if self._dbusservice['/QuietHours'] == 1 else '') + name + startvalue = self._settings[setting + 'start'] if not condition['boolean'] else 1 + stopvalue = self._settings[setting + 'stop'] if not condition['boolean'] else 0 + + # Check if the condition has to be evaluated + if not self._check_condition(condition, value): + # If generator is started by this condition and value is invalid + # wait till RETRIES_ON_ERROR to skip the condition + if condition['reached'] and condition['retries'] <= self.RETRIES_ON_ERROR: + if condition['retries'] > 0: + return True + + return False + + # As this is a generic evaluation method, we need to know how to compare the values + # first check if start value should be greater than stop value and then compare + start_is_greater = startvalue > stopvalue + +#### GuiMods + stop = value <= stopvalue if start_is_greater else value >= stopvalue + # when starting manually and stopping based on auto stop values, + # start if stop condition is not satisfied + if self._ignoresAutoStartCondition: + start = not stop + else: + # When the condition is already reached only the stop value can set it to False + start = condition['reached'] or (value >= startvalue if start_is_greater else value <= startvalue) + + # Timed conditions must start/stop after the condition has been reached for a minimum + # time. + if condition['timed']: + if not condition['reached'] and start: + condition['start_timer'] += time.time() if condition['start_timer'] == 0 else 0 + start = time.time() - condition['start_timer'] >= self._settings[name + 'starttimer'] + condition['stop_timer'] *= int(not start) + self._timer_runnning = True + else: + condition['start_timer'] = 0 + + if condition['reached'] and stop: + condition['stop_timer'] += time.time() if condition['stop_timer'] == 0 else 0 + stop = time.time() - condition['stop_timer'] >= self._settings[name + 'stoptimer'] + condition['stop_timer'] *= int(not stop) + self._timer_runnning = True + else: + condition['stop_timer'] = 0 + + condition['reached'] = start and not stop + return condition['reached'] + + def _evaluate_manual_start(self): + if self._dbusservice['/ManualStart'] == 0: + if self._dbusservice['/RunningByCondition'] == 'manual': + self._dbusservice['/ManualStartTimer'] = 0 + return False + + start = True + # If /ManualStartTimer has a value greater than zero will use it to set a stop timer. + # If no timer is set, the generator will not stop until the user stops it manually. + # Once started by manual start, each evaluation the timer is decreased +#### GuiMods + if self._dbusservice['/ManualStartTimer'] > 0: + self._manualstarttimer += time.time() if self._manualstarttimer == 0 else 0 + self._dbusservice['/ManualStartTimer'] -= int(time.time()) - int(self._manualstarttimer) + self._manualstarttimer = time.time() + start = self._dbusservice['/ManualStartTimer'] > 0 + self._dbusservice['/ManualStart'] = int(start) + # Reset if timer is finished + self._manualstarttimer *= int(start) + self._dbusservice['/ManualStartTimer'] *= int(start) + + return start + + def _evaluate_testrun_condition(self): + if self._settings['testrunenabled'] == 0: + self._dbusservice['/SkipTestRun'] = None + self._dbusservice['/NextTestRun'] = None + return False + + today = datetime.date.today() + yesterday = today - datetime.timedelta(days=1) # Should deal well with DST + now = time.time() + runtillbatteryfull = self._settings['testruntillbatteryfull'] == 1 + soc = self._condition_stack['soc'].get_value() + batteryisfull = runtillbatteryfull and soc == 100 + duration = 60 if runtillbatteryfull else self._settings['testrunruntime'] + + try: + startdate = datetime.date.fromtimestamp(self._settings['testrunstartdate']) + _starttime = time.mktime(yesterday.timetuple()) + self._settings['testrunstarttimer'] + + # today might in fact still be yesterday, if this test run started + # before midnight and finishes after. If `now` still falls in + # yesterday's window, then by the temporal anthropic principle, + # which I just made up but loosely states that time must have + # these properties for observers to exist, it must be yesterday + # because we are here to observe it. + if _starttime <= now <= _starttime + duration: + today = yesterday + starttime = _starttime + else: + starttime = time.mktime(today.timetuple()) + self._settings['testrunstarttimer'] + except ValueError: + logging.debug('Invalid dates, skipping testrun') + return False + + # If start date is in the future set as NextTestRun and stop evaluating + if startdate > today: + self._dbusservice['/NextTestRun'] = time.mktime(startdate.timetuple()) + return False + + start = False + # If the accumulated runtime during the tes trun interval is greater than '/TestRunIntervalRuntime' + # the tes trun must be skipped + needed = (self._settings['testrunskipruntime'] > self._dbusservice['/TestRunIntervalRuntime'] + or self._settings['testrunskipruntime'] == 0) + self._dbusservice['/SkipTestRun'] = int(not needed) + + interval = self._settings['testruninterval'] + stoptime = starttime + duration + elapseddays = (today - startdate).days + mod = elapseddays % interval + + start = not bool(mod) and starttime <= now <= stoptime + + if runtillbatteryfull: + if soc is not None: + self._testrun_soc_retries = 0 + start = (start or self._dbusservice['/RunningByCondition'] == 'testrun') and not batteryisfull + elif self._dbusservice['/RunningByCondition'] == 'testrun': + if self._testrun_soc_retries < self.RETRIES_ON_ERROR: + self._testrun_soc_retries += 1 + start = True + if (self._testrun_soc_retries % 10) == 0: + self.log_info('Test run failed to get SOC value, retrying(#%i)' % self._testrun_soc_retries) + else: + self.log_info('Failed to get SOC after %i retries, terminating test run condition' % self._testrun_soc_retries) + start = False + else: + start = False + + if not bool(mod) and (now <= stoptime): + self._dbusservice['/NextTestRun'] = starttime + else: + self._dbusservice['/NextTestRun'] = (time.mktime((today + datetime.timedelta(days=interval - mod)).timetuple()) + + self._settings['testrunstarttimer']) + return start and needed + + def _check_quiet_hours(self): + active = False + if self._settings['quiethoursenabled'] == 1: + # Seconds after today 00:00 + timeinseconds = time.time() - time.mktime(datetime.date.today().timetuple()) + quiethoursstart = self._settings['quiethoursstarttime'] + quiethoursend = self._settings['quiethoursendtime'] + + # Check if the current time is between the start time and end time + if quiethoursstart < quiethoursend: + active = quiethoursstart <= timeinseconds and timeinseconds < quiethoursend + else: # End time is lower than start time, example Start: 21:00, end: 08:00 + active = not (quiethoursend < timeinseconds and timeinseconds < quiethoursstart) + + if self._dbusservice['/QuietHours'] == 0 and active: + self.log_info('Entering to quiet mode') + + elif self._dbusservice['/QuietHours'] == 1 and not active: + self.log_info('Leaving quiet mode') + + self._dbusservice['/QuietHours'] = int(active) + + return active + + def _update_accumulated_time(self): + seconds = self._dbusservice['/Runtime'] + accumulated = seconds - self._last_runtime_update + + self._settings['accumulatedtotal'] = accumulatedtotal = int(self._settings['accumulatedtotal']) + accumulated + # Using calendar to get timestamp in UTC, not local time + today_date = str(calendar.timegm(datetime.date.today().timetuple())) + + # If something goes wrong getting the json string create a new one + try: + accumulated_days = json.loads(self._settings['accumulateddaily']) + except ValueError: + accumulated_days = {today_date: 0} + + if (today_date in accumulated_days): + accumulated_days[today_date] += accumulated + else: + accumulated_days[today_date] = accumulated + + self._last_runtime_update = seconds + + # Keep the historical with a maximum of HISTORY_DAYS + while len(accumulated_days) > HISTORY_DAYS: + accumulated_days.pop(min(accumulated_days.keys()), None) + + # Upadate settings + self._settings['accumulateddaily'] = json.dumps(accumulated_days, sort_keys=True) + self._dbusservice['/TodayRuntime'] = self._interval_runtime(0) + self._dbusservice['/TestRunIntervalRuntime'] = self._interval_runtime(self._settings['testruninterval']) + self._dbusservice['/AccumulatedRuntime'] = accumulatedtotal + + # Service counter + serviceinterval = self._settings['serviceinterval'] + lastservicereset = self._settings['lastservicereset'] + if serviceinterval > 0: + servicecountdown = (lastservicereset + serviceinterval) - accumulatedtotal + self._dbusservice['/ServiceCounter'] = servicecountdown + if servicecountdown <= 0: + self._dbusservice['/Alarms/ServiceIntervalExceeded'] = 1 + elif self._dbusservice['/Alarms/ServiceIntervalExceeded'] != 0: + self._dbusservice['/Alarms/ServiceIntervalExceeded'] = 0 + + + + def _interval_runtime(self, days): + summ = 0 + try: + daily_record = json.loads(self._settings['accumulateddaily']) + except ValueError: + return 0 + + for i in range(days + 1): + previous_day = calendar.timegm((datetime.date.today() - datetime.timedelta(days=i)).timetuple()) + if str(previous_day) in daily_record.keys(): + summ += daily_record[str(previous_day)] if str(previous_day) in daily_record.keys() else 0 + + return summ + + def _get_battery(self): + if self._settings['batterymeasurement'] == 'default': + return Battery(self._dbusmonitor, SYSTEM_SERVICE, BATTERY_PREFIX) + + return Battery(self._dbusmonitor, + self._battery_service if self._battery_service else '', + self._battery_prefix if self._battery_prefix else '') + + def _set_capabilities(self): + # Update capabilities + # The ability to ignore AC1/AC2 came in at the same time as + # AC availability and is used to detect it here. + readout_supported = self._dbusmonitor.get_value(self._vebusservice, + '/Ac/State/AcIn1Available') is not None + self._dbusservice['/Capabilities'] |= ( + Capabilities.WarmupCooldown if readout_supported else 0) + + def _determineservices(self): + # batterymeasurement is either 'default' or 'com_victronenergy_battery_288/Dc/0'. + # In case it is set to default, we use the AutoSelected battery + # measurement, given by SystemCalc. + batterymeasurement = None + newbatteryservice = None + batteryprefix = '' + selectedbattery = self._settings['batterymeasurement'] + vebusservice = None + + if selectedbattery == 'default': + batterymeasurement = 'default' + elif len(selectedbattery.split('/', 1)) == 2: # Only very basic sanity checking.. + batterymeasurement = self._settings['batterymeasurement'] + elif selectedbattery == 'nobattery': + batterymeasurement = None + else: + # Exception: unexpected value for batterymeasurement + pass + + if batterymeasurement and batterymeasurement != 'default': + batteryprefix = '/' + batterymeasurement.split('/', 1)[1] + + # Get the current battery servicename + if self._battery_service: + oldservice = self._battery_service + else: + oldservice = None + + if batterymeasurement != 'default': + battery_instance = int(batterymeasurement.split('_', 3)[3].split('/')[0]) + service_type = None + + if 'vebus' in batterymeasurement: + service_type = 'vebus' + elif 'battery' in batterymeasurement: + service_type = 'battery' + + newbatteryservice = self._get_servicename_by_instance(battery_instance, service_type) + elif batterymeasurement == 'default': + newbatteryservice = 'default' + + if newbatteryservice and newbatteryservice != oldservice: + if selectedbattery == 'default': + self.log_info('Getting battery values from systemcalc.') + if selectedbattery == 'nobattery': + self.log_info('Battery monitoring disabled! Stop evaluating related conditions') + self._battery_service = None + self._battery_prefix = None + self.log_info('Battery service we need (%s) found! Using it for generator start/stop' % batterymeasurement) + self._battery_service = newbatteryservice + self._battery_prefix = batteryprefix + elif not newbatteryservice and newbatteryservice != oldservice: + self.log_info('Error getting battery service!') + self._battery_service = newbatteryservice + self._battery_prefix = batteryprefix + + # Get the default VE.Bus service + vebusservice = self._dbusmonitor.get_value('com.victronenergy.system', '/VebusService') + if vebusservice: + if self._vebusservice != vebusservice: + self._vebusservice = vebusservice + self._set_capabilities() + self.log_info('Vebus service (%s) found! Using it for generator start/stop' % vebusservice) + else: + if self._vebusservice is not None: + self.log_info('Vebus service (%s) dissapeared! Stop evaluating related conditions' % self._vebusservice) + else: + self.log_info('Error getting Vebus service!') + self._vebusservice = None + + def _get_servicename_by_instance(self, instance, service_type=None): + sv = None + services = self._dbusmonitor.get_service_list() + + for service in services: + if service_type and service_type not in service: + continue + + if services[service] == instance: + sv = service + break + + return sv + + def _get_monotonic_seconds(self): + return monotonic_time.monotonic_time().to_seconds_double() + + def _start_generator(self, condition): + state = self._dbusservice['/State'] + remote_running = self._get_remote_switch_state() + + # This function will start the generator in the case generator not + # already running. When differs, the RunningByCondition is updated + running = state in (States.WARMUP, States.COOLDOWN, States.STOPPING, States.RUNNING) + if not (running and remote_running): # STOPPED, ERROR +#### GuiMods warm-up / cool-down + self.log_info('Starting generator by %s condition' % condition) + # if there is a warmup time specified, always go through warm-up state + # regardless of AC input in use + warmUpPeriod = self._settings['warmuptime'] + if warmUpPeriod > 0: + self._warmUpEndTime = self._currentTime + warmUpPeriod + self.log_info ("starting warm-up") + self._dbusservice['/State'] = States.WARMUP + # no warm-up go directly to running + else: + self._dbusservice['/State'] = States.RUNNING + self._warmUpEndTime = 0 + + self._coolDownEndTime = 0 + self._stoptime = 0 + + self._update_remote_switch() + else: # WARMUP, COOLDOWN, RUNNING, STOPPING + if state in (States.COOLDOWN, States.STOPPING): + # Start request during cool-down run, go back to RUNNING + self.log_info ("aborting cool-down - returning to running") + self._dbusservice['/State'] = States.RUNNING + + elif state == States.WARMUP: + if self._currentTime > self._warmUpEndTime: + self.log_info ("warm-up complete") + self._dbusservice['/State'] = States.RUNNING + + # Update the RunningByCondition + if self._dbusservice['/RunningByCondition'] != condition: + self.log_info('Generator previously running by %s condition is now running by %s condition' + % (self._dbusservice['/RunningByCondition'], condition)) +#### end GuiMods warm-up / cool-down + + + self._dbusservice['/RunningByCondition'] = condition + self._dbusservice['/RunningByConditionCode'] = RunningConditions.lookup(condition) + + + def _stop_generator(self): + state = self._dbusservice['/State'] + remote_running = self._get_remote_switch_state() + running = state in (States.WARMUP, States.COOLDOWN, States.STOPPING, States.RUNNING) + + if running or remote_running: +#### GuiMods warm-up / cool-down + if state == States.RUNNING: + state = States.COOLDOWN + if self._currentTime < self._coolDownEndTime: + self.log_info ("starting cool-down") + elif self._settings['cooldowntime'] != 0: + self.log_info ("skipping cool-down -- no AC load on generator") + + # warm-up should also transition to stopping + # cool-down time will have expired since it's set to 0 when starting + # and there has not yet been a load on the generator + if state in (States.WARMUP, States.COOLDOWN): + # cool down complete + if self._currentTime > self._coolDownEndTime: + state = States.STOPPING + self.log_info('Stopping generator that was running by %s condition' % + str(self._dbusservice['/RunningByCondition'])) + self._update_remote_switch() # Stop engine + self._stoptime = self._currentTime + self._settings['generatorstoptime'] + if self._currentTime < self._stoptime: + self.log_info ("waiting for generator so stop") + + if state == States.STOPPING: + # wait for stop period expired - finish up transition to STOPPED + if self._currentTime > self._stoptime: + if self._settings['generatorstoptime'] != 0: + self.log_info ("generator stop time reached - OK to reconnect AC") + state = States.STOPPED + self._update_remote_switch() + self._dbusservice['/RunningByCondition'] = '' + self._dbusservice['/RunningByConditionCode'] = RunningConditions.Stopped + self._update_accumulated_time() + self._starttime = 0 + self._dbusservice['/Runtime'] = 0 + self._dbusservice['/ManualStartTimer'] = 0 + self._manualstarttimer = 0 + self._last_runtime_update = 0 + + self._dbusservice['/State'] = state +#### end GuiMods warm-up / cool-down + + + # This is here so the Multi/Quattro can be told to disconnect AC-in, + # so that we can do warm-up and cool-down. +#### GuiMods warm-up / cool-down + # there may be two AC inputs (Quattro). process both + + def _ignore_ac (self, state): + self._activeAcInIsIgnored = state + state1 = False + state2 = False + if self._generatorAcInput == 1: + state1 = state + elif self._generatorAcInput == 2: + state2 = state + + if state1 != self._ac1isIgnored: + if state1: + self.log_info ("shedding load - AC input 1") + else: + self.log_info ("restoring load - AC input 1") + self._set_ignore_ac1 (state1) + self._ac1isIgnored = state1 + + if state2 != self._ac2isIgnored: + if state2: + self.log_info ("shedding load - AC input 2") + else: + self.log_info ("restoring load - AC input 2") + self._set_ignore_ac2 (state2) + self._ac2isIgnored = state2 + + + def _set_ignore_ac1(self, ignore): + # This is here so the Multi/Quattro can be told to disconnect AC-in, + # so that we can do warm-up and cool-down. + if self._vebusservice is not None: + self._dbusmonitor.set_value_async(self._vebusservice, '/Ac/Control/IgnoreAcIn1', dbus.Int32(ignore, variant_level=1)) + + def _set_ignore_ac2(self, ignore): + if self._vebusservice is not None: + self._dbusmonitor.set_value_async(self._vebusservice, '/Ac/Control/IgnoreAcIn2', dbus.Int32(ignore, variant_level=1)) + + def _update_remote_switch(self): + # Engine should be started in these states + v = self._dbusservice['/State'] in (States.RUNNING, States.WARMUP, States.COOLDOWN) + self._set_remote_switch_state(dbus.Int32(v, variant_level=1)) +#### GuiMods + if v == True: + self.log_info ("updating remote switch to running") + else: + self.log_info ("updating remote switch to stopped") + + def _get_remote_switch_state(self): + raise Exception('This function should be overridden') + + def _set_remote_switch_state(self, value): + raise Exception('This function should be overridden') + + # Check the remote status, for example errors + def _check_remote_status(self): + raise Exception('This function should be overridden') + + def _remote_setup(self): + raise Exception('This function should be overridden') + + def _create_dbus_monitor(self, *args, **kwargs): + raise Exception('This function should be overridden') + + def _create_settings(self, *args, **kwargs): + raise Exception('This function should be overridden') + + def _create_dbus_service(self): + return create_dbus_service(self._instance) + + +#### GuiMods + +# this function connects the generator digital input (if any) +# OR the generator AC input detection +# to the generator /ManualStart and updates dbus paths used by the GUI +# +# if the generator digital input changes from stopped to running +# AND no run conditions are active, a manual start is innitiated +# +# if the generator digital input changes from running to stopped +# AND a manual start is active, a manual stop is innitiated +# +# /GeneratorRunningState provides the input running state from the digital input to the GUI +# R = running +# S = stopped +# ? = unknown (no digital input found) +# +# /ExternalOverride is used by the GUI to alert the user when there is a conflict +# between the generator running state and the state Venus +# /ExternalOverride is True if /GeneratorRunningState is S +# AND the /RunningCondition is not stopped (which includes a manual run) +# activation is delayed 5 seconds to allow transitions to settle +# +# we must first find the geneator digital input, if it exists at all +# we serche all dBus services looking for a digital input with type generator (9) +# the search only occurs every 10 seconds +# + + def _processGeneratorRunDetection (self): + TheBus = dbus.SystemBus() + generatorState = self._dbusservice['/State'] + try: + # current input service is no longer valid + # search for a new one only every 10 seconds to avoid unnecessary processing + if (self._digitalInputTypeObject == None or self._digitalInputTypeObject.GetValue() != 9) and self._searchDelay > 10: + newInputService = "" + for service in TheBus.list_names(): + # found a digital input servic, now check the type + if service.startswith ("com.victronenergy.digitalinput"): + self._digitalInputTypeObject = TheBus.get_object (service, '/Type') + # found it! + if self._digitalInputTypeObject.GetValue() == 9: + newInputService = service + break + + # found new service - get objects for use later + if newInputService != "": + self.log_info ("Found generator digital input service at %s" % newInputService) + self._generatorInputStateObject = TheBus.get_object(newInputService, '/State') + else: + if self._generatorInputStateObject != None: + self.log_info ("Generator digital input service NOT found") + self._generatorInputStateObject = None + self._digitalInputTypeObject = None + self._searchDelay = 0 # start delay timer + + # if serch delay timer is active, increment it now + if self._searchDelay <= 10: + self._searchDelay += 1 + + + # collect generator input states + inputState = '?' + # if generator digital input is present, use that + if self._generatorInputStateObject != None: + inputState = self._generatorInputStateObject.GetValue () + if inputState == 10: + inputState = 'R' + elif inputState == 11: + inputState = 'S' + # otherwise use generator AC input to determine running state + else: + # use frequency as the test for generator running + if self._generatorAcInput > 0: + try: + if self._dbusmonitor.get_value (SYSTEM_SERVICE, '/Ac/Genset/Frequency') > 20: + inputState = 'R' + else: + inputState = 'S' + except: + inputState = '?' + + # update /GeneratorRunningState + if inputState != self._lastState: + self._dbusservice['/GeneratorRunningState'] = inputState + + # forward input state changes to /ManualStart + if self._linkToExternalState: + if inputState == "R" and generatorState == States.STOPPED: + self.log_info ("generator was started externally - syncing ManualStart state") + self._dbusservice['/ManualStart'] = 1 + elif inputState == "S" and self._dbusservice['/ManualStart'] == 1 \ + and generatorState in (States.RUNNING, States.WARMUP, States.COOLDOWN): + self.log_info ("generator was stopped externally - syncing ManualStart state") + self._dbusservice['/ManualStart'] = 0 + + # update /ExternalOverride + if inputState == "S" and self._linkToExternalState and generatorState == States.RUNNING: + if self._externalOverrideDelay > 5: + self._externalOverride = True + else: + self._externalOverrideDelay += 1 + else: + self._externalOverride = False + self._externalOverrideDelay = 0 + + if self._externalOverride != self._lastExternalOverride: + self._dbusservice['/ExternalOverride'] = self._externalOverride + self._lastExternalOverride = self._externalOverride + + except dbus.DBusException: + self.log_info ("dbus exception - generator digital input no longer valid") + self._generatorInputStateObject = None + self._digitalInputTypeObject = None + inputState = 0 + + self._lastState = inputState + + +# +# control the accumulaiton of run time based on generator input Running state +# if the internal state is RUNNING run time is accumulated in self._accumulatedRunTime +# run time is accumulated if the generator's running state is known to be running or +# if the generator running state can't be determined +# the accumulated time dBus parameter and daily and total time accumulators are updated +# only once everh 60 seconds to minimize processor load +# if the internal state is STOPPED, one last dBus, daily and total time updates are done +# then the current time accumulator is cleared + + def _accumulateRunTime (self): + + # grab running state from dBus once, use it many timed below + + if self._dbusservice['/State'] in (States.RUNNING, States.WARMUP, States.COOLDOWN, States.STOPPING): ########## + internalRun = True + else: + internalRun = False + + # if internal state is running, accumulate time if generator is running + if internalRun: + accumuateTime = True + # start new accumulation if not done prevously + if self._last_accumulate_time == 0: + self._last_accumulate_time = self._currentTime + + # if link to external state is enabled, don't accumulate time if running state is stopped + # (accumulate if R or ?) + if self._linkToExternalState: + try: + if self._dbusservice['/GeneratorRunningState'] == 'S': + accumuateTime = False + + # if no Forwarder service, allow accumulation + except dbus.DBusException: + self.log_info ("dBus exception in startstop.py") + + # internal state STOPPED so don't add new time to the accumulation + # but there may be time already accumulated that needs to be added to daily and total accumulations + else: + accumuateTime = False + + # accumulate run time if we passed all the tests above + if accumuateTime: + self._accumulatedRunTime += self._currentTime - self._last_accumulate_time + self._last_accumulate_time = self._currentTime + + # dbus and settings updates trigger time-intensive processing so only do this once every 60 seconds + doUpdate = False + if internalRun: + if self._currentTime - self._last_update_mtime >= 60: + doUpdate = True + self._last_update_mtime = self._currentTime + # it is also done one last time when state is no longer RUNNING + elif self._last_update_mtime != 0: + doUpdate = True + + if doUpdate: + self._update_accumulated_time() + + # stopped - clear the current time accumulator + if internalRun == False: + self._last_update_mtime = 0 + self._accumulatedRunTime = 0 + self._last_accumulate_time = 0 + + self._dbusservice['/Runtime'] = int(self._accumulatedRunTime) +#### end GuiMods diff --git a/FileSets/v3.30~1/startstop.py.orig b/FileSets/v3.30~1/startstop.py.orig new file mode 100644 index 00000000..0977763a --- /dev/null +++ b/FileSets/v3.30~1/startstop.py.orig @@ -0,0 +1,1216 @@ +#!/usr/bin/python -u +# -*- coding: utf-8 -*- + +# Function +# dbus_generator monitors the dbus for batteries (com.victronenergy.battery.*) and +# vebus com.victronenergy.vebus.* +# Battery and vebus monitors can be configured through the gui. +# It then monitors SOC, AC loads, battery current and battery voltage,to auto start/stop the generator based +# on the configuration settings. Generator can be started manually or periodically setting a tes trun period. +# Time zones function allows to use different values for the conditions along the day depending on time + +import dbus +import datetime +import calendar +import time +import sys +import json +import os +import logging +from collections import OrderedDict +import monotonic_time +from gen_utils import SettingsPrefix, Errors, States, enum +from gen_utils import create_dbus_service +# Victron packages +sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python')) +from ve_utils import exit_on_error +from settingsdevice import SettingsDevice + +RunningConditions = enum( + Stopped = 0, + Manual = 1, + TestRun = 2, + LossOfCommunication = 3, + Soc = 4, + Acload = 5, + BatteryCurrent = 6, + BatteryVoltage = 7, + InverterHighTemp = 8, + InverterOverload = 9, + StopOnAc1 = 10, + StopOnAc2 = 11) + +Capabilities = enum( + WarmupCooldown = 1 +) + +SYSTEM_SERVICE = 'com.victronenergy.system' +BATTERY_PREFIX = '/Dc/Battery' +HISTORY_DAYS = 30 + +def safe_max(args): + try: + return max(x for x in args if x is not None) + except ValueError: + return None + +class Condition(object): + def __init__(self, parent): + self.parent = parent + self.reached = False + self.start_timer = 0 + self.stop_timer = 0 + self.valid = True + self.enabled = False + self.retries = 0 + + def __getitem__(self, key): + try: + return getattr(self, key) + except AttributeError: + raise KeyError(key) + + def __setitem__(self, key, value): + setattr(self, key, value) + + def get_value(self): + raise NotImplementedError("get_value") + + @property + def vebus_service(self): + return self.parent._vebusservice if self.parent._vebusservice else '' + + @property + def monitor(self): + return self.parent._dbusmonitor + +class SocCondition(Condition): + name = 'soc' + monitoring = 'battery' + boolean = False + timed = True + + def get_value(self): + return self.parent._get_battery().soc + +class AcLoadCondition(Condition): + name = 'acload' + monitoring = 'vebus' + boolean = False + timed = True + + def get_value(self): + loadOnAcOut = [] + totalConsumption = [] + + for phase in ['L1', 'L2', 'L3']: + # Get the values directly from the inverter, systemcalc doesn't provide raw inverted power + loadOnAcOut.append(self.monitor.get_value(self.vebus_service, ('/Ac/Out/%s/P' % phase))) + + # Calculate total consumption, '/Ac/Consumption/%s/Power' is deprecated + c_i = self.monitor.get_value(SYSTEM_SERVICE, ('/Ac/ConsumptionOnInput/%s/Power' % phase)) + c_o = self.monitor.get_value(SYSTEM_SERVICE, ('/Ac/ConsumptionOnOutput/%s/Power' % phase)) + totalConsumption.append(sum(filter(None, (c_i, c_o)))) + + # Invalidate if vebus is not available + if loadOnAcOut[0] == None: + return None + + # Total consumption + if self.parent._settings['acloadmeasurement'] == 0: + return sum(filter(None, totalConsumption)) + + # Load on inverter AC out + if self.parent._settings['acloadmeasurement'] == 1: + return sum(filter(None, loadOnAcOut)) + + # Highest phase load + if self.parent._settings['acloadmeasurement'] == 2: + return safe_max(loadOnAcOut) + +class BatteryCurrentCondition(Condition): + name = 'batterycurrent' + monitoring = 'battery' + boolean = False + timed = True + + def get_value(self): + c = self.parent._get_battery().current + if c is not None: + c *= -1 + return c + +class BatteryVoltageCondition(Condition): + name = 'batteryvoltage' + monitoring = 'battery' + boolean = False + timed = True + + def get_value(self): + return self.parent._get_battery().voltage + +class InverterTempCondition(Condition): + name = 'inverterhightemp' + monitoring = 'vebus' + boolean = True + timed = True + + def get_value(self): + v = self.monitor.get_value(self.vebus_service, + '/Alarms/HighTemperature') + + # When multi is connected to CAN-bus, alarms are published to + # /Alarms/HighTemperature... but when connected to vebus alarms are + # splitted in three phases and published to /Alarms/LX/HighTemperature... + if v is None: + inverterHighTemp = [] + for phase in ['L1', 'L2', 'L3']: + # Inverter alarms must be fetched directly from the inverter service + inverterHighTemp.append(self.monitor.get_value(self.vebus_service, ('/Alarms/%s/HighTemperature' % phase))) + return safe_max(inverterHighTemp) + return v + +class InverterOverloadCondition(Condition): + name = 'inverteroverload' + monitoring = 'vebus' + boolean = True + timed = True + + def get_value(self): + v = self.monitor.get_value(self.vebus_service, + '/Alarms/Overload') + + # When multi is connected to CAN-bus, alarms are published to + # /Alarms/Overload... but when connected to vebus alarms are + # splitted in three phases and published to /Alarms/LX/Overload... + if v is None: + inverterOverload = [] + for phase in ['L1', 'L2', 'L3']: + # Inverter alarms must be fetched directly from the inverter service + inverterOverload.append(self.monitor.get_value(self.vebus_service, ('/Alarms/%s/Overload' % phase))) + return safe_max(inverterOverload) + return v + +class StopOnAc1Condition(Condition): + name = 'stoponac1' + monitoring = 'vebus' + boolean = True + timed = False + + def get_value(self): + # AC input 1 + available = self.monitor.get_value(self.vebus_service, + '/Ac/State/AcIn1Available') + if available is None: + # Not supported in firmware, fall back to old behaviour + activein = self.monitor.get_value(self.vebus_service, + '/Ac/ActiveIn/ActiveInput') + + # Active input is connected + connected = self.monitor.get_value(self.vebus_service, + '/Ac/ActiveIn/Connected') + if None not in (activein, connected): + return activein == 0 and connected == 1 + return None + + return bool(available) + +class StopOnAc2Condition(Condition): + name = 'stoponac2' + monitoring = 'vebus' + boolean = True + timed = False + + def get_value(self): + # AC input 2 available (used when grid is on AC-in-2) + available = self.monitor.get_value(self.vebus_service, + '/Ac/State/AcIn2Available') + + return None if available is None else bool(available) + +class Battery(object): + def __init__(self, monitor, service, prefix): + self.monitor = monitor + self.service = service + self.prefix = prefix + + @property + def voltage(self): + return self.monitor.get_value(self.service, self.prefix + '/Voltage') + + @property + def current(self): + return self.monitor.get_value(self.service, self.prefix + '/Current') + + @property + def soc(self): + # Soc from the device doesn't have the '/Dc/0' prefix like the current and voltage do, but it does + # have the same prefix on systemcalc + return self.monitor.get_value(self.service, (BATTERY_PREFIX if self.prefix == BATTERY_PREFIX else '') + '/Soc') + +class StartStop(object): + _driver = None + def __init__(self, instance): + self._dbusservice = None + self._settings = None + self._dbusmonitor = None + self._remoteservice = None + self._name = None + self._enabled = False + self._instance = instance + + # One second per retry + self.RETRIES_ON_ERROR = 300 + self._testrun_soc_retries = 0 + self._last_counters_check = 0 + + self._starttime = 0 + self._stoptime = 0 # Used for cooldown + self._manualstarttimer = 0 + self._last_runtime_update = 0 + self._timer_runnning = 0 + + # The installer left autostart disabled + self.AUTOSTART_DISABLED_ALARM_TIME = 600 + self._autostart_last_time = self._get_monotonic_seconds() + + + # Manual battery service selection is deprecated in favour + # of getting the values directly from systemcalc, we keep + # manual selected services handling for compatibility reasons. + self._vebusservice = None + self._errorstate = 0 + self._battery_service = None + self._battery_prefix = None + + self._acpower_inverter_input = { + 'timeout': 0, + 'unabletostart': False + } + + # Order is important. Conditions are evaluated in the order listed. + self._condition_stack = OrderedDict({ + SocCondition.name: SocCondition(self), + AcLoadCondition.name: AcLoadCondition(self), + BatteryCurrentCondition.name: BatteryCurrentCondition(self), + BatteryVoltageCondition.name: BatteryVoltageCondition(self), + InverterTempCondition.name: InverterTempCondition(self), + InverterOverloadCondition.name: InverterOverloadCondition(self), + StopOnAc1Condition.name: StopOnAc1Condition(self), + StopOnAc2Condition.name: StopOnAc2Condition(self) + }) + + def set_sources(self, dbusmonitor, settings, name, remoteservice): + self._settings = SettingsPrefix(settings, name) + self._dbusmonitor = dbusmonitor + self._remoteservice = remoteservice + self._name = name + + self.log_info('Start/stop instance created for %s.' % self._remoteservice) + self._remote_setup() + + def _create_service(self): + self._dbusservice = self._create_dbus_service() + + # The driver used for this start/stop service + self._dbusservice.add_path('/Type', value=self._driver) + # State: None = invalid, 0 = stopped, 1 = running, 2=Warm-up, 3=Cool-down + self._dbusservice.add_path('/State', value=None, gettextcallback=lambda p, v: States.get_description(v)) + # RunningByConditionCode: Numeric Companion to /RunningByCondition below, but + # also encompassing a Stopped state. + self._dbusservice.add_path('/RunningByConditionCode', value=None) + # Error + self._dbusservice.add_path('/Error', value=None, gettextcallback=lambda p, v: Errors.get_description(v)) + # Condition that made the generator start + self._dbusservice.add_path('/RunningByCondition', value=None) + # Runtime + self._dbusservice.add_path('/Runtime', value=None, gettextcallback=self._seconds_to_text) + # Today runtime + self._dbusservice.add_path('/TodayRuntime', value=None, gettextcallback=self._seconds_to_text) + # Test run runtime + self._dbusservice.add_path('/TestRunIntervalRuntime', value=None , gettextcallback=self._seconds_to_text) + # Next test run date, values is 0 for test run disabled + self._dbusservice.add_path('/NextTestRun', value=None, gettextcallback=lambda p, v: datetime.datetime.fromtimestamp(v).strftime('%c')) + # Next test run is needed 1, not needed 0 + self._dbusservice.add_path('/SkipTestRun', value=None) + # Manual start + self._dbusservice.add_path('/ManualStart', value=None, writeable=True) + # Manual start timer + self._dbusservice.add_path('/ManualStartTimer', value=None, writeable=True) + # Silent mode active + self._dbusservice.add_path('/QuietHours', value=None) + # Alarms + self._dbusservice.add_path('/Alarms/NoGeneratorAtAcIn', value=None) + self._dbusservice.add_path('/Alarms/ServiceIntervalExceeded', value=None) + self._dbusservice.add_path('/Alarms/AutoStartDisabled', value=None) + # Autostart + self._dbusservice.add_path('/AutoStartEnabled', value=None, writeable=True, onchangecallback=self._set_autostart) + # Accumulated runtime + self._dbusservice.add_path('/AccumulatedRuntime', value=None) + # Service interval + self._dbusservice.add_path('/ServiceInterval', value=None) + # Capabilities, where we can add bits + self._dbusservice.add_path('/Capabilities', value=0) + # Service countdown, calculated by running time and service interval + self._dbusservice.add_path('/ServiceCounter', value=None) + self._dbusservice.add_path('/ServiceCounterReset', value=None, writeable=True, onchangecallback=self._reset_service_counter) + # Publish what service we're controlling, and the productid + self._dbusservice.add_path('/GensetService', value=self._remoteservice) + self._dbusservice.add_path('/GensetInstance', + value=self._dbusmonitor.get_value(self._remoteservice, '/DeviceInstance')) + self._dbusservice.add_path('/GensetProductId', + value=self._dbusmonitor.get_value(self._remoteservice, '/ProductId')) + + # We need to set the values after creating the paths to trigger the 'onValueChanged' event for the gui + # otherwise the gui will report the paths as invalid if we remove and recreate the paths without + # restarting the dbusservice. + self._dbusservice['/State'] = 0 + self._dbusservice['/RunningByConditionCode'] = RunningConditions.Stopped + self._dbusservice['/Error'] = 0 + self._dbusservice['/RunningByCondition'] = '' + self._dbusservice['/Runtime'] = 0 + self._dbusservice['/TodayRuntime'] = 0 + self._dbusservice['/TestRunIntervalRuntime'] = self._interval_runtime(self._settings['testruninterval']) + self._dbusservice['/NextTestRun'] = None + self._dbusservice['/SkipTestRun'] = None + self._dbusservice['/ProductName'] = "Generator start/stop" + self._dbusservice['/ManualStart'] = 0 + self._dbusservice['/ManualStartTimer'] = 0 + self._dbusservice['/QuietHours'] = 0 + self._dbusservice['/Alarms/NoGeneratorAtAcIn'] = 0 + self._dbusservice['/Alarms/ServiceIntervalExceeded'] = 0 + self._dbusservice['/Alarms/AutoStartDisabled'] = 0 + self._dbusservice['/AutoStartEnabled'] = self._settings['autostart'] + self._dbusservice['/AccumulatedRuntime'] = int(self._settings['accumulatedtotal']) + self._dbusservice['/ServiceInterval'] = int(self._settings['serviceinterval']) + self._dbusservice['/ServiceCounter'] = None + self._dbusservice['/ServiceCounterReset'] = 0 + + @property + def capabilities(self): + return self._dbusservice['/Capabilities'] + + def _set_autostart(self, path, value): + if 0 <= value <= 1: + self._settings['autostart'] = int(value) + return True + return False + + def enable(self): + if self._enabled: + return + self.log_info('Enabling auto start/stop and taking control of remote switch') + self._create_service() + self._determineservices() + self._update_remote_switch() + # If cooldown or warmup is enabled, the Quattro may be left in a bad + # state if there is an unfortunate crash or a reboot. Set the ignore_ac + # flag to a sane value on startup. + if self._settings['cooldowntime'] > 0 or \ + self._settings['warmuptime'] > 0: + self._set_ignore_ac1(False) + self._set_ignore_ac2(False) + self._enabled = True + + def disable(self): + if not self._enabled: + return + self.log_info('Disabling auto start/stop, releasing control of remote switch') + self._remove_service() + self._enabled = False + + def remove(self): + self.disable() + self.log_info('Removed from start/stop instances') + + def _remove_service(self): + self._dbusservice.__del__() + self._dbusservice = None + + def device_added(self, dbusservicename, instance): + self._determineservices() + + def device_removed(self, dbusservicename, instance): + self._determineservices() + + def get_error(self): + return self._dbusservice['/Error'] + + def set_error(self, errorn): + self._dbusservice['/Error'] = errorn + + def clear_error(self): + self._dbusservice['/Error'] = Errors.NONE + + def dbus_value_changed(self, dbusServiceName, dbusPath, options, changes, deviceInstance): + if self._dbusservice is None: + return + + # AcIn1Available is needed to determine capabilities, but may + # only show up later. So we have to wait for it here. + if self._vebusservice is not None and \ + dbusServiceName == self._vebusservice and \ + dbusPath == '/Ac/State/AcIn1Available': + self._set_capabilities() + + if dbusServiceName != 'com.victronenergy.system': + return + if dbusPath == '/AutoSelectedBatteryMeasurement' and self._settings['batterymeasurement'] == 'default': + self._determineservices() + + if dbusPath == '/VebusService': + self._determineservices() + + def handlechangedsetting(self, setting, oldvalue, newvalue): + if self._dbusservice is None: + return + if self._name not in setting: + # Not our setting + return + + s = self._settings.removeprefix(setting) + + if s == 'batterymeasurement': + self._determineservices() + # Reset retries and valid if service changes + for condition in self._condition_stack.values(): + if condition['monitoring'] == 'battery': + condition['valid'] = True + condition['retries'] = 0 + + if s == 'autostart': + self.log_info('Autostart function %s.' % ('enabled' if newvalue == 1 else 'disabled')) + self._dbusservice['/AutoStartEnabled'] = self._settings['autostart'] + + if self._dbusservice is not None and s == 'testruninterval': + self._dbusservice['/TestRunIntervalRuntime'] = self._interval_runtime( + self._settings['testruninterval']) + + if s == 'serviceinterval': + try: + self._dbusservice['/ServiceInterval'] = int(newvalue) + except TypeError: + pass + if newvalue == 0: + self._dbusservice['/ServiceCounter'] = None + else: + self._update_accumulated_time() + if s == 'lastservicereset': + self._update_accumulated_time() + + def _reset_service_counter(self, path, value): + if (path == '/ServiceCounterReset' and value == int(1) and self._dbusservice['/AccumulatedRuntime']): + self._settings['lastservicereset'] = self._dbusservice['/AccumulatedRuntime'] + self._update_accumulated_time() + self.log_info('Service counter reset triggered.') + + return True + + def _seconds_to_text(self, path, value): + m, s = divmod(value, 60) + h, m = divmod(m, 60) + return '%dh, %dm, %ds' % (h, m, s) + + def log_info(self, msg): + logging.info(self._name + ': %s' % msg) + + def tick(self): + if not self._enabled: + return + self._check_remote_status() + self._evaluate_startstop_conditions() + self._evaluate_autostart_disabled_alarm() + self._detect_generator_at_acinput() + if self._dbusservice['/ServiceCounterReset'] == 1: + self._dbusservice['/ServiceCounterReset'] = 0 + + def _evaluate_startstop_conditions(self): + if self.get_error() != Errors.NONE: + # First evaluation after an error, log it + if self._errorstate == 0: + self._errorstate = 1 + self._dbusservice['/State'] = States.ERROR + self.log_info('Error: #%i - %s, stop controlling remote.' % + (self.get_error(), + Errors.get_description(self.get_error()))) + elif self._errorstate == 1: + # Error cleared + self._errorstate = 0 + self._dbusservice['/State'] = States.STOPPED + self.log_info('Error state cleared, taking control of remote switch.') + + start = False + startbycondition = None + activecondition = self._dbusservice['/RunningByCondition'] + today = calendar.timegm(datetime.date.today().timetuple()) + self._timer_runnning = False + connection_lost = False + running = self._dbusservice['/State'] in (States.RUNNING, States.WARMUP) + + self._check_quiet_hours() + + # New day, register it + if self._last_counters_check < today and self._dbusservice['/State'] == States.STOPPED: + self._last_counters_check = today + self._update_accumulated_time() + + # Update current and accumulated runtime. + # By performance reasons, accumulated runtime is only updated + # once per 60s. When the generator stops is also updated. + if self._dbusservice['/State'] in (States.RUNNING, States.WARMUP, States.COOLDOWN, States.STOPPING): + mtime = monotonic_time.monotonic_time().to_seconds_double() + if (mtime - self._starttime) - self._last_runtime_update >= 60: + self._dbusservice['/Runtime'] = int(mtime - self._starttime) + self._update_accumulated_time() + elif self._last_runtime_update == 0: + self._dbusservice['/Runtime'] = int(mtime - self._starttime) + + + if self._evaluate_manual_start(): + startbycondition = 'manual' + start = True + + # Conditions will only be evaluated if the autostart functionality is enabled + if self._settings['autostart'] == 1: + + if self._evaluate_testrun_condition(): + startbycondition = 'testrun' + start = True + + # Evaluate stop on AC IN conditions first, when this conditions are enabled and reached the generator + # will stop as soon as AC IN in active. Manual and testrun conditions will make the generator start + # or keep it running. + stop_on_ac_reached = (self._evaluate_condition(self._condition_stack[StopOnAc1Condition.name]) or + self._evaluate_condition(self._condition_stack[StopOnAc2Condition.name])) + stop_by_ac1_ac2 = startbycondition not in ['manual', 'testrun'] and stop_on_ac_reached + + if stop_by_ac1_ac2 and running and activecondition not in ['manual', 'testrun']: + self.log_info('AC input available, stopping') + + # Evaluate value conditions + for condition, data in self._condition_stack.items(): + # Do not evaluate rest of conditions if generator is configured to stop + # when AC IN is available + if stop_by_ac1_ac2: + start = False + if running: + self._reset_condition(data) + continue + else: + break + + # Don't short-circuit this, _evaluate_condition sets .reached + start = self._evaluate_condition(data) or start + startbycondition = condition if start and startbycondition is None else startbycondition + # Connection lost is set to true if the number of retries of one or more enabled conditions + # >= RETRIES_ON_ERROR + if data.enabled: + connection_lost = data.retries >= self.RETRIES_ON_ERROR + + # If none condition is reached check if connection is lost and start/keep running the generator + # depending on '/OnLossCommunication' setting + if not start and connection_lost: + # Start always + if self._settings['onlosscommunication'] == 1: + start = True + startbycondition = 'lossofcommunication' + # Keep running if generator already started + if running and self._settings['onlosscommunication'] == 2: + start = True + startbycondition = 'lossofcommunication' + + if not start and self._errorstate: + self._stop_generator() + + if self._errorstate: + return + + if start: + self._start_generator(startbycondition) + elif (self._dbusservice['/Runtime'] >= self._settings['minimumruntime'] * 60 + or activecondition == 'manual'): + self._stop_generator() + + def _evaluate_autostart_disabled_alarm(self): + + if self._settings['autostart'] == 0 or \ + self.get_error() != Errors.REMOTEDISABLED or \ + self._settings['autostartdisabledalarm'] == 0: + self._autostart_last_time = self._get_monotonic_seconds() + if self._dbusservice['/Alarms/AutoStartDisabled'] != 0: + self._dbusservice['/Alarms/AutoStartDisabled'] = 0 + return + + timedisabled = self._get_monotonic_seconds() - self._autostart_last_time + if timedisabled > self.AUTOSTART_DISABLED_ALARM_TIME and self._dbusservice['/Alarms/AutoStartDisabled'] != 2: + self.log_info("Autostart was left for more than %i seconds, triggering alarm." % int(timedisabled)) + self._dbusservice['/Alarms/AutoStartDisabled'] = 2 + + + def _detect_generator_at_acinput(self): + state = self._dbusservice['/State'] + + if state in [States.STOPPED, States.COOLDOWN, States.WARMUP]: + self._reset_acpower_inverter_input() + return + + if self._settings['nogeneratoratacinalarm'] == 0: + self._reset_acpower_inverter_input() + return + + vebus_service = self._vebusservice if self._vebusservice else '' + activein_state = self._dbusmonitor.get_value( + vebus_service, '/Ac/ActiveIn/Connected') + + # Path not supported, skip evaluation + if activein_state == None: + return + + # Sources 0 = Not available, 1 = Grid, 2 = Generator, 3 = Shore + generator_acsource = self._dbusmonitor.get_value( + SYSTEM_SERVICE, '/Ac/ActiveIn/Source') == 2 + # Not connected = 0, connected = 1 + activein_connected = activein_state == 1 + + if generator_acsource and activein_connected: + if self._acpower_inverter_input['unabletostart']: + self.log_info('Generator detected at inverter AC input, alarm removed') + self._reset_acpower_inverter_input() + elif self._acpower_inverter_input['timeout'] < self.RETRIES_ON_ERROR: + self._acpower_inverter_input['timeout'] += 1 + elif not self._acpower_inverter_input['unabletostart']: + self._acpower_inverter_input['unabletostart'] = True + self._dbusservice['/Alarms/NoGeneratorAtAcIn'] = 2 + self.log_info('Generator not detected at inverter AC input, triggering alarm') + + def _reset_acpower_inverter_input(self, clear_error=True): + if self._acpower_inverter_input['timeout'] != 0: + self._acpower_inverter_input['timeout'] = 0 + + if self._acpower_inverter_input['unabletostart'] != 0: + self._acpower_inverter_input['unabletostart'] = 0 + + self._dbusservice['/Alarms/NoGeneratorAtAcIn'] = 0 + + def _reset_condition(self, condition): + condition['reached'] = False + if condition['timed']: + condition['start_timer'] = 0 + condition['stop_timer'] = 0 + + def _check_condition(self, condition, value): + name = condition['name'] + + if self._settings[name + 'enabled'] == 0: + if condition['enabled']: + condition['enabled'] = False + self.log_info('Disabling (%s) condition' % name) + condition['retries'] = 0 + condition['valid'] = True + self._reset_condition(condition) + return False + + elif not condition['enabled']: + condition['enabled'] = True + self.log_info('Enabling (%s) condition' % name) + + if (condition['monitoring'] == 'battery') and (self._settings['batterymeasurement'] == 'nobattery'): + # If no battery monitor is selected reset the condition + self._reset_condition(condition) + return False + + if value is None and condition['valid']: + if condition['retries'] >= self.RETRIES_ON_ERROR: + logging.info('Error getting (%s) value, skipping evaluation till get a valid value' % name) + self._reset_condition(condition) + self._comunnication_lost = True + condition['valid'] = False + else: + condition['retries'] += 1 + if condition['retries'] == 1 or (condition['retries'] % 10) == 0: + self.log_info('Error getting (%s) value, retrying(#%i)' % (name, condition['retries'])) + return False + + elif value is not None and not condition['valid']: + self.log_info('Success getting (%s) value, resuming evaluation' % name) + condition['valid'] = True + condition['retries'] = 0 + + # Reset retries if value is valid + if value is not None and condition['retries'] > 0: + self.log_info('Success getting (%s) value, resuming evaluation' % name) + condition['retries'] = 0 + + return condition['valid'] + + def _evaluate_condition(self, condition): + name = condition['name'] + value = condition.get_value() + setting = ('qh_' if self._dbusservice['/QuietHours'] == 1 else '') + name + startvalue = self._settings[setting + 'start'] if not condition['boolean'] else 1 + stopvalue = self._settings[setting + 'stop'] if not condition['boolean'] else 0 + + # Check if the condition has to be evaluated + if not self._check_condition(condition, value): + # If generator is started by this condition and value is invalid + # wait till RETRIES_ON_ERROR to skip the condition + if condition['reached'] and condition['retries'] <= self.RETRIES_ON_ERROR: + if condition['retries'] > 0: + return True + + return False + + # As this is a generic evaluation method, we need to know how to compare the values + # first check if start value should be greater than stop value and then compare + start_is_greater = startvalue > stopvalue + + # When the condition is already reached only the stop value can set it to False + start = condition['reached'] or (value >= startvalue if start_is_greater else value <= startvalue) + stop = value <= stopvalue if start_is_greater else value >= stopvalue + + # Timed conditions must start/stop after the condition has been reached for a minimum + # time. + if condition['timed']: + if not condition['reached'] and start: + condition['start_timer'] += time.time() if condition['start_timer'] == 0 else 0 + start = time.time() - condition['start_timer'] >= self._settings[name + 'starttimer'] + condition['stop_timer'] *= int(not start) + self._timer_runnning = True + else: + condition['start_timer'] = 0 + + if condition['reached'] and stop: + condition['stop_timer'] += time.time() if condition['stop_timer'] == 0 else 0 + stop = time.time() - condition['stop_timer'] >= self._settings[name + 'stoptimer'] + condition['stop_timer'] *= int(not stop) + self._timer_runnning = True + else: + condition['stop_timer'] = 0 + + condition['reached'] = start and not stop + return condition['reached'] + + def _evaluate_manual_start(self): + if self._dbusservice['/ManualStart'] == 0: + if self._dbusservice['/RunningByCondition'] == 'manual': + self._dbusservice['/ManualStartTimer'] = 0 + return False + + start = True + # If /ManualStartTimer has a value greater than zero will use it to set a stop timer. + # If no timer is set, the generator will not stop until the user stops it manually. + # Once started by manual start, each evaluation the timer is decreased + if self._dbusservice['/ManualStartTimer'] != 0: + self._manualstarttimer += time.time() if self._manualstarttimer == 0 else 0 + self._dbusservice['/ManualStartTimer'] -= int(time.time()) - int(self._manualstarttimer) + self._manualstarttimer = time.time() + start = self._dbusservice['/ManualStartTimer'] > 0 + self._dbusservice['/ManualStart'] = int(start) + # Reset if timer is finished + self._manualstarttimer *= int(start) + self._dbusservice['/ManualStartTimer'] *= int(start) + + return start + + def _evaluate_testrun_condition(self): + if self._settings['testrunenabled'] == 0: + self._dbusservice['/SkipTestRun'] = None + self._dbusservice['/NextTestRun'] = None + return False + + today = datetime.date.today() + yesterday = today - datetime.timedelta(days=1) # Should deal well with DST + now = time.time() + runtillbatteryfull = self._settings['testruntillbatteryfull'] == 1 + soc = self._condition_stack['soc'].get_value() + batteryisfull = runtillbatteryfull and soc == 100 + duration = 60 if runtillbatteryfull else self._settings['testrunruntime'] + + try: + startdate = datetime.date.fromtimestamp(self._settings['testrunstartdate']) + _starttime = time.mktime(yesterday.timetuple()) + self._settings['testrunstarttimer'] + + # today might in fact still be yesterday, if this test run started + # before midnight and finishes after. If `now` still falls in + # yesterday's window, then by the temporal anthropic principle, + # which I just made up but loosely states that time must have + # these properties for observers to exist, it must be yesterday + # because we are here to observe it. + if _starttime <= now <= _starttime + duration: + today = yesterday + starttime = _starttime + else: + starttime = time.mktime(today.timetuple()) + self._settings['testrunstarttimer'] + except ValueError: + logging.debug('Invalid dates, skipping testrun') + return False + + # If start date is in the future set as NextTestRun and stop evaluating + if startdate > today: + self._dbusservice['/NextTestRun'] = time.mktime(startdate.timetuple()) + return False + + start = False + # If the accumulated runtime during the tes trun interval is greater than '/TestRunIntervalRuntime' + # the tes trun must be skipped + needed = (self._settings['testrunskipruntime'] > self._dbusservice['/TestRunIntervalRuntime'] + or self._settings['testrunskipruntime'] == 0) + self._dbusservice['/SkipTestRun'] = int(not needed) + + interval = self._settings['testruninterval'] + stoptime = starttime + duration + elapseddays = (today - startdate).days + mod = elapseddays % interval + + start = not bool(mod) and starttime <= now <= stoptime + + if runtillbatteryfull: + if soc is not None: + self._testrun_soc_retries = 0 + start = (start or self._dbusservice['/RunningByCondition'] == 'testrun') and not batteryisfull + elif self._dbusservice['/RunningByCondition'] == 'testrun': + if self._testrun_soc_retries < self.RETRIES_ON_ERROR: + self._testrun_soc_retries += 1 + start = True + if (self._testrun_soc_retries % 10) == 0: + self.log_info('Test run failed to get SOC value, retrying(#%i)' % self._testrun_soc_retries) + else: + self.log_info('Failed to get SOC after %i retries, terminating test run condition' % self._testrun_soc_retries) + start = False + else: + start = False + + if not bool(mod) and (now <= stoptime): + self._dbusservice['/NextTestRun'] = starttime + else: + self._dbusservice['/NextTestRun'] = (time.mktime((today + datetime.timedelta(days=interval - mod)).timetuple()) + + self._settings['testrunstarttimer']) + return start and needed + + def _check_quiet_hours(self): + active = False + if self._settings['quiethoursenabled'] == 1: + # Seconds after today 00:00 + timeinseconds = time.time() - time.mktime(datetime.date.today().timetuple()) + quiethoursstart = self._settings['quiethoursstarttime'] + quiethoursend = self._settings['quiethoursendtime'] + + # Check if the current time is between the start time and end time + if quiethoursstart < quiethoursend: + active = quiethoursstart <= timeinseconds and timeinseconds < quiethoursend + else: # End time is lower than start time, example Start: 21:00, end: 08:00 + active = not (quiethoursend < timeinseconds and timeinseconds < quiethoursstart) + + if self._dbusservice['/QuietHours'] == 0 and active: + self.log_info('Entering to quiet mode') + + elif self._dbusservice['/QuietHours'] == 1 and not active: + self.log_info('Leaving quiet mode') + + self._dbusservice['/QuietHours'] = int(active) + + return active + + def _update_accumulated_time(self): + seconds = self._dbusservice['/Runtime'] + accumulated = seconds - self._last_runtime_update + + self._settings['accumulatedtotal'] = accumulatedtotal = int(self._settings['accumulatedtotal']) + accumulated + # Using calendar to get timestamp in UTC, not local time + today_date = str(calendar.timegm(datetime.date.today().timetuple())) + + # If something goes wrong getting the json string create a new one + try: + accumulated_days = json.loads(self._settings['accumulateddaily']) + except ValueError: + accumulated_days = {today_date: 0} + + if (today_date in accumulated_days): + accumulated_days[today_date] += accumulated + else: + accumulated_days[today_date] = accumulated + + self._last_runtime_update = seconds + + # Keep the historical with a maximum of HISTORY_DAYS + while len(accumulated_days) > HISTORY_DAYS: + accumulated_days.pop(min(accumulated_days.keys()), None) + + # Upadate settings + self._settings['accumulateddaily'] = json.dumps(accumulated_days, sort_keys=True) + self._dbusservice['/TodayRuntime'] = self._interval_runtime(0) + self._dbusservice['/TestRunIntervalRuntime'] = self._interval_runtime(self._settings['testruninterval']) + self._dbusservice['/AccumulatedRuntime'] = accumulatedtotal + + # Service counter + serviceinterval = self._settings['serviceinterval'] + lastservicereset = self._settings['lastservicereset'] + if serviceinterval > 0: + servicecountdown = (lastservicereset + serviceinterval) - accumulatedtotal + self._dbusservice['/ServiceCounter'] = servicecountdown + if servicecountdown <= 0: + self._dbusservice['/Alarms/ServiceIntervalExceeded'] = 1 + elif self._dbusservice['/Alarms/ServiceIntervalExceeded'] != 0: + self._dbusservice['/Alarms/ServiceIntervalExceeded'] = 0 + + + + def _interval_runtime(self, days): + summ = 0 + try: + daily_record = json.loads(self._settings['accumulateddaily']) + except ValueError: + return 0 + + for i in range(days + 1): + previous_day = calendar.timegm((datetime.date.today() - datetime.timedelta(days=i)).timetuple()) + if str(previous_day) in daily_record.keys(): + summ += daily_record[str(previous_day)] if str(previous_day) in daily_record.keys() else 0 + + return summ + + def _get_battery(self): + if self._settings['batterymeasurement'] == 'default': + return Battery(self._dbusmonitor, SYSTEM_SERVICE, BATTERY_PREFIX) + + return Battery(self._dbusmonitor, + self._battery_service if self._battery_service else '', + self._battery_prefix if self._battery_prefix else '') + + def _set_capabilities(self): + # Update capabilities + # The ability to ignore AC1/AC2 came in at the same time as + # AC availability and is used to detect it here. + readout_supported = self._dbusmonitor.get_value(self._vebusservice, + '/Ac/State/AcIn1Available') is not None + self._dbusservice['/Capabilities'] |= ( + Capabilities.WarmupCooldown if readout_supported else 0) + + def _determineservices(self): + # batterymeasurement is either 'default' or 'com_victronenergy_battery_288/Dc/0'. + # In case it is set to default, we use the AutoSelected battery + # measurement, given by SystemCalc. + batterymeasurement = None + newbatteryservice = None + batteryprefix = '' + selectedbattery = self._settings['batterymeasurement'] + vebusservice = None + + if selectedbattery == 'default': + batterymeasurement = 'default' + elif len(selectedbattery.split('/', 1)) == 2: # Only very basic sanity checking.. + batterymeasurement = self._settings['batterymeasurement'] + elif selectedbattery == 'nobattery': + batterymeasurement = None + else: + # Exception: unexpected value for batterymeasurement + pass + + if batterymeasurement and batterymeasurement != 'default': + batteryprefix = '/' + batterymeasurement.split('/', 1)[1] + + # Get the current battery servicename + if self._battery_service: + oldservice = self._battery_service + else: + oldservice = None + + if batterymeasurement != 'default': + battery_instance = int(batterymeasurement.split('_', 3)[3].split('/')[0]) + service_type = None + + if 'vebus' in batterymeasurement: + service_type = 'vebus' + elif 'battery' in batterymeasurement: + service_type = 'battery' + + newbatteryservice = self._get_servicename_by_instance(battery_instance, service_type) + elif batterymeasurement == 'default': + newbatteryservice = 'default' + + if newbatteryservice and newbatteryservice != oldservice: + if selectedbattery == 'default': + self.log_info('Getting battery values from systemcalc.') + if selectedbattery == 'nobattery': + self.log_info('Battery monitoring disabled! Stop evaluating related conditions') + self._battery_service = None + self._battery_prefix = None + self.log_info('Battery service we need (%s) found! Using it for generator start/stop' % batterymeasurement) + self._battery_service = newbatteryservice + self._battery_prefix = batteryprefix + elif not newbatteryservice and newbatteryservice != oldservice: + self.log_info('Error getting battery service!') + self._battery_service = newbatteryservice + self._battery_prefix = batteryprefix + + # Get the default VE.Bus service + vebusservice = self._dbusmonitor.get_value('com.victronenergy.system', '/VebusService') + if vebusservice: + if self._vebusservice != vebusservice: + self._vebusservice = vebusservice + self._set_capabilities() + self.log_info('Vebus service (%s) found! Using it for generator start/stop' % vebusservice) + else: + if self._vebusservice is not None: + self.log_info('Vebus service (%s) dissapeared! Stop evaluating related conditions' % self._vebusservice) + else: + self.log_info('Error getting Vebus service!') + self._vebusservice = None + + def _get_servicename_by_instance(self, instance, service_type=None): + sv = None + services = self._dbusmonitor.get_service_list() + + for service in services: + if service_type and service_type not in service: + continue + + if services[service] == instance: + sv = service + break + + return sv + + def _get_monotonic_seconds(self): + return monotonic_time.monotonic_time().to_seconds_double() + + def _start_generator(self, condition): + state = self._dbusservice['/State'] + remote_running = self._get_remote_switch_state() + + # This function will start the generator in the case generator not + # already running. When differs, the RunningByCondition is updated + running = state in (States.WARMUP, States.COOLDOWN, States.STOPPING, States.RUNNING) + if not (running and remote_running): # STOPPED, ERROR + if self._settings['warmuptime'] > 0: + # Remove load while warming up + if self._ac1_is_generator: + self._set_ignore_ac1(True) + if self._ac2_is_generator: + self._set_ignore_ac2(True) + self._dbusservice['/State'] = States.WARMUP + else: + self._dbusservice['/State'] = States.RUNNING + + self._update_remote_switch() + self._starttime = monotonic_time.monotonic_time().to_seconds_double() + self.log_info('Starting generator by %s condition' % condition) + else: # WARMUP, COOLDOWN, RUNNING, STOPPING + if state == States.WARMUP: + if monotonic_time.monotonic_time().to_seconds_double() - self._starttime > self._settings['warmuptime']: + self._set_ignore_ac1(False) # Release load onto Generator + self._set_ignore_ac2(False) + self._dbusservice['/State'] = States.RUNNING + elif state in (States.COOLDOWN, States.STOPPING): + # Start request during cool-down run, go back to RUNNING + self._set_ignore_ac1(False) # Put load back onto Generator + self._set_ignore_ac2(False) + self._dbusservice['/State'] = States.RUNNING + + # Update the RunningByCondition + if self._dbusservice['/RunningByCondition'] != condition: + self.log_info('Generator previously running by %s condition is now running by %s condition' + % (self._dbusservice['/RunningByCondition'], condition)) + + self._dbusservice['/RunningByCondition'] = condition + self._dbusservice['/RunningByConditionCode'] = RunningConditions.lookup(condition) + + def _stop_generator(self): + state = self._dbusservice['/State'] + remote_running = self._get_remote_switch_state() + running = state in (States.WARMUP, States.COOLDOWN, States.STOPPING, States.RUNNING) + + if running or remote_running: + if self._settings['cooldowntime'] > 0: + if state == States.RUNNING: + self._dbusservice['/State'] = States.COOLDOWN + self._stoptime = monotonic_time.monotonic_time().to_seconds_double() + + # Remove load from Generator + if self._ac1_is_generator: + self._set_ignore_ac1(True) + if self._ac2_is_generator: + self._set_ignore_ac2(True) + + return + elif state == States.COOLDOWN: + if monotonic_time.monotonic_time().to_seconds_double() - \ + self._stoptime <= self._settings['cooldowntime']: + return # Don't stop engine yet + + # When we arrive here, a stop command was given during warmup, the + # cooldown timer expired, or no cooldown was configured. Stop + # the engine, but if we're coming from cooldown, delay another + # while in the STOPPING state before reactivating AC-in. + if state == States.COOLDOWN: + self._dbusservice['/State'] = States.STOPPING + self._update_remote_switch() # Stop engine + return + elif state == States.STOPPING: + if monotonic_time.monotonic_time().to_seconds_double() - \ + self._stoptime <= self._settings['cooldowntime'] + self._settings['generatorstoptime']: + return # Wait for engine stop + + # All other possibilities are handled now. Cooldown is over or not + # configured and we waited for the generator to shut down. + self._dbusservice['/State'] = States.STOPPED + self._update_remote_switch() + self._set_ignore_ac1(False) + self._set_ignore_ac2(False) + self.log_info('Stopping generator that was running by %s condition' % + str(self._dbusservice['/RunningByCondition'])) + self._dbusservice['/RunningByCondition'] = '' + self._dbusservice['/RunningByConditionCode'] = RunningConditions.Stopped + self._update_accumulated_time() + self._starttime = 0 + self._dbusservice['/Runtime'] = 0 + self._dbusservice['/ManualStartTimer'] = 0 + self._manualstarttimer = 0 + self._last_runtime_update = 0 + + @property + def _ac1_is_generator(self): + return self._dbusmonitor.get_value('com.victronenergy.settings', + '/Settings/SystemSetup/AcInput1') == 2 + + @property + def _ac2_is_generator(self): + return self._dbusmonitor.get_value('com.victronenergy.settings', + '/Settings/SystemSetup/AcInput2') == 2 + + def _set_ignore_ac1(self, ignore): + # This is here so the Multi/Quattro can be told to disconnect AC-in, + # so that we can do warm-up and cool-down. + if self._vebusservice is not None: + self._dbusmonitor.set_value_async(self._vebusservice, '/Ac/Control/IgnoreAcIn1', dbus.Int32(ignore, variant_level=1)) + + def _set_ignore_ac2(self, ignore): + if self._vebusservice is not None: + self._dbusmonitor.set_value_async(self._vebusservice, '/Ac/Control/IgnoreAcIn2', dbus.Int32(ignore, variant_level=1)) + + def _update_remote_switch(self): + # Engine should be started in these states + v = self._dbusservice['/State'] in (States.RUNNING, States.WARMUP, States.COOLDOWN) + self._set_remote_switch_state(dbus.Int32(v, variant_level=1)) + + def _get_remote_switch_state(self): + raise Exception('This function should be overridden') + + def _set_remote_switch_state(self, value): + raise Exception('This function should be overridden') + + # Check the remote status, for example errors + def _check_remote_status(self): + raise Exception('This function should be overridden') + + def _remote_setup(self): + raise Exception('This function should be overridden') + + def _create_dbus_monitor(self, *args, **kwargs): + raise Exception('This function should be overridden') + + def _create_settings(self, *args, **kwargs): + raise Exception('This function should be overridden') + + def _create_dbus_service(self): + return create_dbus_service(self._instance) diff --git a/FileSets/v3.20~42/styles.css b/FileSets/v3.30~1/styles.css similarity index 100% rename from FileSets/v3.20~42/styles.css rename to FileSets/v3.30~1/styles.css diff --git a/FileSets/v3.20~42/styles.css.orig b/FileSets/v3.30~1/styles.css.orig similarity index 100% rename from FileSets/v3.20~42/styles.css.orig rename to FileSets/v3.30~1/styles.css.orig diff --git a/HelperResources/CommonResources b/HelperResources/CommonResources index 8976c8f3..c478ddbd 100755 --- a/HelperResources/CommonResources +++ b/HelperResources/CommonResources @@ -1263,7 +1263,7 @@ fi # prevent installing Raspberry Pi packages on other platforms if [ -f "$scriptDir/raspberryPiOnly" ]; then if [[ $machine != *"raspberrypi"* ]]; then - setInstallFailed $EXIT_INCOMPATIBLE_PLATFOM "$packageName not compatible with $machine" + setInstallFailed $EXIT_INCOMPATIBLE_PLATFORM "$packageName not compatible with $machine" fi fi diff --git a/HelperResources/EssentialResources b/HelperResources/EssentialResources index a5eaff65..24dd56b4 100755 --- a/HelperResources/EssentialResources +++ b/HelperResources/EssentialResources @@ -55,7 +55,7 @@ EXIT_REBOOT=123 EXIT_RESTART_GUI=124 EXIT_ERROR=255 # unknown error EXIT_INCOMPATIBLE_VERSION=254 -EXIT_INCOMPATIBLE_PLATFOM=253 +EXIT_INCOMPATIBLE_PLATFORM=253 EXIT_FILE_SET_ERROR=252 EXIT_OPTIONS_NOT_SET=251 EXIT_RUN_AGAIN=250 diff --git a/HelperResources/version b/HelperResources/version index d6c24904..1e4497a0 100644 --- a/HelperResources/version +++ b/HelperResources/version @@ -1 +1 @@ -v6.1 +v6.2 diff --git a/ReadMe b/ReadMe index 706f1eb0..edc17064 100644 --- a/ReadMe +++ b/ReadMe @@ -1,32 +1,9 @@ Recent changes: - Replace Multi LEDs with text describing the indicator's funciton - - Added conrol over grid/renewable energy priority to inverter detail - - Added dark mode - - Added support for generator warm-up and cool-down when using ExtTransferSwitch - - Add generator AC input detection to running/stoped display and link to manual start - Add switch to enable/disable external generator state to manual start/stop - Added generator start manually / stop automatically mode - - The AC input detal now shows voltage and frequency for grid/shore and generator AC inputs - in addition to the active input - Incorporte voltage, current and frequency from grid meters - addresses systems that have no AC output for example (all loads on inverter input) - also allows the actual current to be displayed in all details and overview tiles - previously, currents were calculated: I - P / V which isn't accurate due to power factor - Treat an alternator as a "generator" source - for cases where an AC generator or the grid is not avalable + ExtTransferSwitch functionality has been merged into GuiMods + ExtTransferSwitch is now obsolete and will be uninstalled by GuiMods GuiMods has been revived with combined functionality of the original GuiMods and GuiMods2 -GuiMods2 has been decommissioned - - -The following components have NOT been tested: - Multi-phase(leg) systems This package provides the following modifications to the VenusOS GUI: A "dark mode" for all overviews and menu pages @@ -154,7 +131,6 @@ This package provides the following modifications to the VenusOS GUI: The Generator overview includes "Running" or "Stopped" in the generator icon if a digital input has been configured for generator run status input. - each of these enhancements/modifications can be selected individually any time (while system is running) via the Settings Display GuiMods menu @@ -484,6 +460,61 @@ Generator enhancements: Note that if all automatic stop conditions are currently satisfied, the generat will not be started. That is, if the battery is at 95% in the above example, the generator will NOT start. +External transfer switch: + This supports an external transfer switch ahead of a MultiPlus AC input + changing the AC input current limit and and AC source type based on on grid/on generator + + ExtTransferSwitch includes support for "renewable energy" prioritizaiton added in Venus OS 3.10. + This also requires Multi firmware 506. + Renewable energy priority shuts down the Multi/Quattro charger allowing solar, wind and other charging sources + to charge the battery. Grid power is reneabled at a low SOC (battery voltage) set in the Multi configuration. + In addition, switching the AC source to generator reenables Multi AC input charging. + + Note: changes added in Venus OS v3.00 and changes added to Multi/Quattro in fimware 502, + support a generator on AC 2 in. + These are required for this package to work on a Quattro's AC 2 input + + A GX device digital input is connected to the external transfer switch to indicate + if the grid or generator is routed to the Multi's AC input + This service then makes changed to the AC input current limit and AC source(type) + grid/shore or generator + + External transfer switch configuration: + + Program a digital input for External transfer switch + + For Quattros, select if the transfer switch is connected to AC 1 in or AC 2 in. + (for Multis, this selection does not exist since there is only one AC input.) + + Connect an output from the transfer switch to the GX device digital input to indicate + if the grid or generator source is being routed to the AC 1 input of the Multi. + + The best signal to use is a grid power detection circuit. + A simle relay across the grid is probably fine for this. + This same signal would typically switch the transfer switch to the grid position. + + The transfer switch may change state based on generator power being present. + If this is the case, the generator might not ever start when using this to feed the digital input. + Install a separate grid power detection circuit to insure proper behavior. + + Verify that the On Grid / On Generator state shown in the Device List tracks the actual state + of the transfer switch. If it is backwards, change Inverted swich in the device's setup menu. + + While On grid, set the grid input current limit and grid type (grid or shore). + + Cause the transfer switch to change state and while On Generator, set the input current limit again, + this time for the generator values. + + Now the input current limit will switch between the grid and generator settings. + + If you make changes to the input current limit, those changes will be remembered and restored when the transfer switch + returns to that position again. + + If you wish to prevent the generator from running when On Grid, make sure the system is not On Generator and + turn on the Do not run generator when AC1 is in use in: + Device List / Settings / Generator start/stop settings /Settings / Conditions + The transfer switch logic will turn this off when switching to On Generator and restore it when switching to On Grid. + Installation: GuiMods requires that SetupHelper is installed first. diff --git a/changes b/changes index 16ad0803..c048a805 100644 --- a/changes +++ b/changes @@ -1,3 +1,7 @@ +v10.0: + incoporate ExtTransferSwitch + add support for v3.20~45 adn v3.30~1 + v9.2: add support for v3.20~42 diff --git a/services/ExtTransferSwitch/log/run b/services/ExtTransferSwitch/log/run new file mode 100755 index 00000000..cf9efa2a --- /dev/null +++ b/services/ExtTransferSwitch/log/run @@ -0,0 +1,3 @@ +#!/bin/sh +exec multilog t s25000 n4 /var/log/ExtTransferSwitch + diff --git a/services/ExtTransferSwitch/run b/services/ExtTransferSwitch/run new file mode 100755 index 00000000..ddeb1d8b --- /dev/null +++ b/services/ExtTransferSwitch/run @@ -0,0 +1,4 @@ +#!/bin/sh +exec 2>&1 +exec /data/GuiMods/ExtTransferSwitch.py + diff --git a/setup b/setup index 0e4f74f8..f4288519 100755 --- a/setup +++ b/setup @@ -42,6 +42,20 @@ fi #### installing if [ $scriptAction == 'INSTALL' ] ; then + # insure ExtTransferSwitch is uninstalled since its functionalty is now part of GuiMods + if [ -f "$installedVersionPrefix""ExtTransferSwitch" ] || [ -f "$installedFlagPrefix""ExtTransferSwitch" ]; then + logMessage "uninstalling the ExtTransferSwitch - GuiMods incorporates all it's" + if [ -e "/data/ExtTransferSwitch/setup" ]; then + "/data/ExtTransferSwitch/setup" "uninstall" "auto" "deferReboot" "deferGuiRestart" + else + logMessage "WARNING can't uninstall ExtTransferSwitch - no package or no setup script" + fi + if [ -e "/data/settupOptions/ExtTransferSwitch" ]; then + touch "/data/settupOptions/ExtTransferSwitch/DO_NOT_AUTO_INSTALL" + touch "/data/settupOptions/ExtTransferSwitch/DO_NOT_AUTO_ADD" + touch "/data/settupOptions/ExtTransferSwitch/FORCE_REMOVE" + fi + fi # insure GeneratorConnector is uninstalled since its functionalty is now part of GuiMods if [ -f "$installedVersionPrefix""GeneratorConnector" ] || [ -f "$installedFlagPrefix""GeneratorConnector" ]; then logMessage "uninstalling the GeneratorConnector - GuiMods incorporates all it's features and more" @@ -62,4 +76,4 @@ fi # endScript will install or uninstall all files and dBus settings (package has no services) # thats all folks - SCRIPT EXITS INSIDE THE FUNCTION -endScript 'INSTALL_FILES' 'ADD_DBUS_SETTINGS' +endScript 'INSTALL_FILES' 'INSTALL_SERVICES' 'ADD_DBUS_SETTINGS' diff --git a/version b/version index eaba0d35..f0531ee5 100644 --- a/version +++ b/version @@ -1 +1 @@ -v9.2 +v10.0