Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
9 changes: 2 additions & 7 deletions manifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,6 @@
<url>http://</url>
<logo>http://</logo>
<depend package="base/cmake" />
<!--
To add any dependencies use the depend tag
<depend package="dummy-dependency-0" />
...
<depend package="dummy-dependency-n-1" />
<depend package="dummy-dependency-n" />
-->
<depend package="drivers/modbus" />
<test_depend package="google-test" />
</package>
385 changes: 385 additions & 0 deletions src/BatteryData.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,385 @@
#ifndef POWER_VICTRON_BATTERY_DATA_HPP
#define POWER_VICTRON_BATTERY_DATA_HPP

#include "BatteryRegisters.hpp"
#include <base/Temperature.hpp>
#include <base/Time.hpp>
#include <cstdint>
#include <string>
#include <vector>

namespace power_victron {

/**
* Struct representing com.victronenergy.battery data
*/
struct BatteryData {
enum Alarm {
NONE = 0,
LOW_VOLTAGE_ALARM = 1 << 0,
HIGH_VOLTAGE_ALARM = 1 << 1,
LOW_STARTER_VOLTAGE_ALARM = 1 << 2,
HIGH_STARTER_VOLTAGE_ALARM = 1 << 3,
LOW_STATE_OF_CHARGE_ALARM = 1 << 4,
LOW_TEMPERATURE_ALARM = 1 << 5,
HIGH_TEMPERATURE_ALARM = 1 << 6,
MID_VOLTAGE_ALARM = 1 << 7,
LOW_FUSED_VOLTAGE_ALARM = 1 << 8,
HIGH_FUSED_VOLTAGE_ALARM = 1 << 9,
FUSE_BLOWN_ALARM = 1 << 10,
HIGH_INTERNAL_TEMPERATURE_ALARM = 1 << 11,
HIGH_CHARGE_CURRENT_ALARM = 1 << 12,
HIGH_DISCHARGE_CURRENT_ALARM = 1 << 13,
CELL_IMBALANCE_ALARM = 1 << 14,
INTERNAL_FAILURE_ALARM = 1 << 15,
HIGH_CHARGE_TEMPERATURE_ALARM = 1 << 16,
LOW_CHARGE_TEMPERATURE_ALARM = 1 << 17,
LOW_CELL_VOLTAGE_ALARM = 1 << 18,
BMS_CABLE_ALARM = 1 << 19,
BMS_CONTACTOR_RESISTANCE_ALARM = 1 << 20,
BMS_HIGH_CURRENT_ALARM = 1 << 21,
};

enum DiagnosticError {
NO_ERROR = 0,
BATTERY_INITIALIZATION_ERROR = 1,
NO_BATTERIES_CONNECTED = 2,
UNKNOWN_BATTERY_CONNECTED = 3,
DIFFERENT_BATTERY_TYPE = 4,
NUMBER_OF_BATTERIES_INCORRECT = 5,
LYNX_SHUNT_NOT_FOUND = 6,
BATTERY_MEASURE_ERROR = 7,
INTERNAL_CALCULATION_ERROR = 8,
BATTERIES_IN_SERIES_NOT_OK = 9,
NUMBER_OF_BATTERIES_INCORRECT_10 = 10,
HARDWARE_ERROR = 11,
WATCHDOG_ERROR = 12,
OVER_VOLTAGE = 13,
UNDER_VOLTAGE = 14,
OVER_TEMPERATURE = 15,
UNDER_TEMPERATURE = 16,
HARDWARE_FAULT = 17,
STANDBY_SHUTDOWN = 18,
PRE_CHARGE_CHARGE_ERROR = 19,
SAFETY_CONTACTOR_CHECK_ERROR = 20,
PRE_CHARGE_DISCHARGE_ERROR = 21,
ADC_ERROR = 22,
SLAVE_ERROR = 23,
SLAVE_WARNING = 24,
PRE_CHARGE_ERROR = 25,
SAFETY_CONTACTOR_ERROR = 26,
OVER_CURRENT = 27,
SLAVE_UPDATE_FAILED = 28,
SLAVE_UPDATE_UNAVAILABLE = 29,
CALIBRATION_DATA_LOST = 30,
SETTINGS_INVALID = 31,
BMS_CABLE = 32,
REFERENCE_FAILURE = 33,
WRONG_SYSTEM_VOLTAGE = 34,
PRE_CHARGE_TIMEOUT = 35
};

struct DiagnosticEvent {
base::Time time;
DiagnosticError error;
};

enum Mode {
ON = 3,
STANDBY = 252
};

enum BalancerStatus {
UNKNOWN = 0,
BALANCED = 1,
BALANCING = 2,
CELL_IMBALANCE = 3
};

enum State {
INITIALIZING_WAIT_START = 0,
INITIALIZING_BEFORE_BOOT = 1,
INITIALIZING_BEFORE_BOOT_DELAY = 2,
INITIALIZING_WAIT_BOOT = 3,
INITIALIZING = 4,
INITIALIZING_MEASURE_BATTERY_VOLTAGE = 5,
INITIALIZING_CALCULATE_BATTERY_VOLTAGE = 6,
INITIALIZING_WAIT_BUS_VOLTAGE = 7,
INITIALIZING_WAIT_FOR_LYNX_SHUNT = 8,
RUNNING = 9,
ERROR_10 = 10,
UNUSED_11 = 11,
SHUTDOWN = 12,
SLAVE_UPDATING = 13,
STATE_STANDBY = 14,
GOING_TO_RUN = 15,
PRE_CHARGING = 16,
CONTACTOR_CHECK = 17
};

struct AlarmRegister {
Alarm alarm;
BatteryRegisters register_id;
};

static constexpr AlarmRegister alarm_register[] = {
{ LOW_VOLTAGE_ALARM,BatteryRegisters::LOW_VOLTAGE_ALARM },
{ HIGH_VOLTAGE_ALARM, BatteryRegisters::HIGH_VOLTAGE_ALARM},
{ LOW_STARTER_VOLTAGE_ALARM, BatteryRegisters::LOW_STARTER_VOLTAGE_ALARM},
{ HIGH_STARTER_VOLTAGE_ALARM, BatteryRegisters::HIGH_STARTER_VOLTAGE_ALARM},
{ LOW_STATE_OF_CHARGE_ALARM, BatteryRegisters::LOW_STATE_OF_CHARGE_ALARM},
{ LOW_TEMPERATURE_ALARM, BatteryRegisters::LOW_TEMPERATURE_ALARM},
{ HIGH_TEMPERATURE_ALARM, BatteryRegisters::HIGH_TEMPERATURE_ALARM},
{ MID_VOLTAGE_ALARM, BatteryRegisters::MID_VOLTAGE_ALARM},
{ LOW_FUSED_VOLTAGE_ALARM, BatteryRegisters::LOW_FUSED_VOLTAGE_ALARM},
{ HIGH_FUSED_VOLTAGE_ALARM, BatteryRegisters::HIGH_FUSED_VOLTAGE_ALARM},
{ FUSE_BLOWN_ALARM, BatteryRegisters::FUSE_BLOWN_ALARM},
{HIGH_INTERNAL_TEMPERATURE_ALARM,
BatteryRegisters::HIGH_INTERNAL_TEMPERATURE_ALARM },
{ HIGH_CHARGE_CURRENT_ALARM, BatteryRegisters::HIGH_CHARGE_CURRENT_ALARM},
{ HIGH_DISCHARGE_CURRENT_ALARM,
BatteryRegisters::HIGH_DISCHARGE_CURRENT_ALARM },
{ CELL_IMBALANCE_ALARM, BatteryRegisters::CELL_IMBALANCE_ALARM},
{ INTERNAL_FAILURE_ALARM, BatteryRegisters::INTERNAL_FAILURE_ALARM},
{ HIGH_CHARGE_TEMPERATURE_ALARM,
BatteryRegisters::HIGH_CHARGE_TEMPERATURE_ALARM },
{ LOW_CHARGE_TEMPERATURE_ALARM,
BatteryRegisters::LOW_CHARGE_TEMPERATURE_ALARM },
{ LOW_CELL_VOLTAGE_ALARM, BatteryRegisters::LOW_CELL_VOLTAGE_ALARM},
{ BMS_CABLE_ALARM, BatteryRegisters::BMS_CABLE_ALARM},
{ BMS_CONTACTOR_RESISTANCE_ALARM,
BatteryRegisters::BMS_CONTACTOR_RESISTANCE_ALARM },
{ BMS_HIGH_CURRENT_ALARM, BatteryRegisters::BMS_HIGH_CURRENT_ALARM}
};

/** @meta bitfield /power_victron/BatteryData/Alarm */
uint32_t alarms = 0;

/**
* @brief Battery power (W)
*/
int32_t battery_power;
/**
* @brief Battery voltage (V)
*/
double battery_voltage;
/**
* @brief Starter battery voltage (V)
*/
double starter_battery_voltage;
/**
* @brief Current (A)
*/
double current;
/**
* @brief Battery temperature
*/
base::Temperature battery_temperature;
/**
* @brief Mid-point voltage of the battery bank(V)
*/
double mid_point_voltage;
/**
* @brief Mid-point deviation of the battery bank (%)
*/
double mid_point_deviation;
/**
* @brief Consumed Amphours (Ah)
*/
double consumed_amphours;
/**
* @brief State of charge (%)
*/
double state_of_charge;
/**
* @brief Relay status
*/
uint32_t relay_status;
/**
* @brief Deepest discharge (Ah)
*/
double deepest_discharge;
/**
* @brief Last discharge (Ah)
*/
double last_discharge;
/**
* @brief Average discharge (Ah)
*/
double average_discharge;
/**
* @brief Charge cycles count
*/
uint32_t charge_cycles;
/**
* @brief Full discharges count
*/
uint32_t full_discharges;
/**
* @brief Total Ah drawn (Ah)
*/
double total_ah_drawn;
/**
* @brief Minimum voltage (V)
*/
double minimum_voltage;
/**
* @brief Maximum voltage (V)
*/
double maximum_voltage;
/**
* @brief Time since last full charge
*/
base::Time time_since_last_full_charge;
/**
* @brief Automatic syncs count
*/
uint32_t automatic_syncs;
/**
* @brief Low voltage alarms count
*/
uint32_t low_voltage_alarms;
/**
* @brief High voltage alarms count
*/
uint32_t high_voltage_alarms;
/**
* @brief Low starter voltage alarms count
*/
uint32_t low_starter_voltage_alarms;
/**
* @brief High starter voltage alarms count
*/
uint32_t high_starter_voltage_alarms;
/**
* @brief Minimum starter voltage (V)
*/
double minimum_starter_voltage;
/**
* @brief Maximum starter voltage (V)
*/
double maximum_starter_voltage;
/**
* @brief Low fused-voltage alarms count
*/
uint32_t low_fused_voltage_alarms;
/**
* @brief High fused-voltage alarms count
*/
uint32_t high_fused_voltage_alarms;
/**
* @brief Minimum fused voltage (V)
*/
double minimum_fused_voltage;
/**
* @brief Maximum fused voltage (V)
*/
double maximum_fused_voltage;
/**
* @brief Discharged Energy (kWh)
*/
double discharged_energy;
/**
* @brief Charged Energy (kWh)
*/
double charged_energy;
/**
* @brief Time to go
*/
base::Time time_to_go;
/**
* @brief State of health (%)
*/
double state_of_health;
/**
* @brief Max charge voltage (V)
*/
double max_charge_voltage;
/**
* @brief Min discharge voltage (V)
*/
double min_discharge_voltage;
/**
* @brief Max charge current (A)
*/
double max_charge_current;
/**
* @brief Max discharge current (A)
*/
double max_discharge_current;
/**
* @brief Capacity (Ah)
*/
double capacity;
/**
* @brief History of last diagnostic errors
*
* index 0 is the most recent (1st last error), while index 3 is the oldest (4th
* last error).
*/
std::vector<DiagnosticEvent> diagnostics_errors;
/**
* @brief Minimum cell temperature
*/
base::Temperature minimum_cell_temperature;
/**
* @brief Maximum cell temperature
*/
base::Temperature maximum_cell_temperature;
/**
* @brief Consumed Amphours (Ah)
*/
double consumed_amphours_1;
/**
* @brief State
*/
State state;
/**
* @brief Error
*/
DiagnosticError error_code;
/**
* @brief System-switch
*/
bool system_switch;
/**
* @brief Balancing
*/
bool balancing;
/**
* @brief System minimum cell voltage (V)
*/
double system_minimum_cell_voltage;
/**
* @brief System maximum cell voltage (V)
*/
double system_maximum_cell_voltage;
/**
* @brief Diagnostics shutdowns due to error count
*
*/
uint32_t diagnostics_shutdowns_due_to_error;
/**
* @brief Historical min cell-voltage (V)
*/
double historical_min_cell_voltage;
/**
* @brief Historical max cell-voltage (V)
*/
double historical_max_cell_voltage;
/**
* @brief Mode
*/
Mode mode;
/**
* @brief Balancer status
*/
BalancerStatus balancer_status;
/**
* @brief Connection information
*/
std::string connection_information;
};
}

#endif
Loading