tristar: add gauges and fix negative temperatures
This commit is contained in:
parent
1552a10518
commit
8a48645b53
2 changed files with 86 additions and 4 deletions
|
@ -41,6 +41,8 @@ lazy_static! {
|
||||||
&[PL_LABEL]
|
&[PL_LABEL]
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
pub static ref HEATSINK_TEMP: GaugeVec =
|
||||||
|
register_gauge_vec!("heatsink_temp", "Heatsink temperature", &[TRISTAR_LABEL]).unwrap();
|
||||||
pub static ref TRISTAR_INPUT_VOLTAGE: GaugeVec =
|
pub static ref TRISTAR_INPUT_VOLTAGE: GaugeVec =
|
||||||
register_gauge_vec!("tristar_input_voltage", "Input voltage", &[TRISTAR_LABEL]).unwrap();
|
register_gauge_vec!("tristar_input_voltage", "Input voltage", &[TRISTAR_LABEL]).unwrap();
|
||||||
pub static ref TRISTAR_CHARGE_CURRENT: GaugeVec =
|
pub static ref TRISTAR_CHARGE_CURRENT: GaugeVec =
|
||||||
|
@ -67,4 +69,16 @@ lazy_static! {
|
||||||
&[TRISTAR_LABEL]
|
&[TRISTAR_LABEL]
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
pub static ref TRISTAR_TOTAL_AH_CHARGE_DAILY: GaugeVec = register_gauge_vec!(
|
||||||
|
"tristar_total_ah_charge_daily",
|
||||||
|
"Total charge daily (Ah)",
|
||||||
|
&[TRISTAR_LABEL]
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
pub static ref TRISTAR_TOTAL_WH_CHARGE_DAILY: GaugeVec = register_gauge_vec!(
|
||||||
|
"tristar_total_wh_charge_daily",
|
||||||
|
"Total charge daily (Wh)",
|
||||||
|
&[TRISTAR_LABEL]
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,9 +2,10 @@ use prometheus::core::{AtomicI64, GenericGauge};
|
||||||
use tokio_modbus::client::Reader;
|
use tokio_modbus::client::Reader;
|
||||||
|
|
||||||
use crate::gauges::{
|
use crate::gauges::{
|
||||||
BATTERY_TEMP, BATTERY_VOLTAGE, CHARGE_STATE, INPUT_CURRENT, TARGET_VOLTAGE,
|
BATTERY_TEMP, BATTERY_VOLTAGE, CHARGE_STATE, HEATSINK_TEMP, INPUT_CURRENT, TARGET_VOLTAGE,
|
||||||
TRISTAR_CHARGE_CURRENT, TRISTAR_INPUT_VOLTAGE, TRISTAR_MAX_ARRAY_POWER,
|
TRISTAR_CHARGE_CURRENT, TRISTAR_INPUT_VOLTAGE, TRISTAR_MAX_ARRAY_POWER,
|
||||||
TRISTAR_MAX_ARRAY_VOLTAGE, TRISTAR_OPEN_CIRCUIT_VOLTAGE, TRISTAR_POWER_IN, TRISTAR_POWER_OUT,
|
TRISTAR_MAX_ARRAY_VOLTAGE, TRISTAR_OPEN_CIRCUIT_VOLTAGE, TRISTAR_POWER_IN, TRISTAR_POWER_OUT,
|
||||||
|
TRISTAR_TOTAL_AH_CHARGE_DAILY, TRISTAR_TOTAL_WH_CHARGE_DAILY,
|
||||||
};
|
};
|
||||||
|
|
||||||
const DEVICE_ID: u8 = 0x01;
|
const DEVICE_ID: u8 = 0x01;
|
||||||
|
@ -53,7 +54,8 @@ pub struct TristarState {
|
||||||
battery_voltage: f64,
|
battery_voltage: f64,
|
||||||
target_voltage: f64,
|
target_voltage: f64,
|
||||||
input_current: f64,
|
input_current: f64,
|
||||||
battery_temp: u16,
|
battery_temp: i16,
|
||||||
|
heatsink_temp: i16,
|
||||||
charge_state: ChargeState,
|
charge_state: ChargeState,
|
||||||
tristar_input_voltage: f64,
|
tristar_input_voltage: f64,
|
||||||
tristar_charge_current: f64,
|
tristar_charge_current: f64,
|
||||||
|
@ -62,6 +64,15 @@ pub struct TristarState {
|
||||||
tristar_max_array_power: f64,
|
tristar_max_array_power: f64,
|
||||||
tristar_max_array_voltage: f64,
|
tristar_max_array_voltage: f64,
|
||||||
tristar_open_circuit_voltage: f64,
|
tristar_open_circuit_voltage: f64,
|
||||||
|
daily_charge_amp_hours: f64,
|
||||||
|
daily_charge_watt_hours: f64,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn signed(val: u16) -> i16 {
|
||||||
|
match i16::try_from(val) {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(_) => -i16::try_from(val % 128).unwrap(),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TristarState {
|
impl TristarState {
|
||||||
|
@ -71,7 +82,8 @@ impl TristarState {
|
||||||
battery_voltage: scaling.get_voltage(ram[TristarRamAddress::AdcVbFMed]),
|
battery_voltage: scaling.get_voltage(ram[TristarRamAddress::AdcVbFMed]),
|
||||||
target_voltage: scaling.get_voltage(ram[TristarRamAddress::VbRef]),
|
target_voltage: scaling.get_voltage(ram[TristarRamAddress::VbRef]),
|
||||||
input_current: scaling.get_current(ram[TristarRamAddress::AdcIaFShadow]),
|
input_current: scaling.get_current(ram[TristarRamAddress::AdcIaFShadow]),
|
||||||
battery_temp: ram[TristarRamAddress::Tbatt],
|
battery_temp: signed(ram[TristarRamAddress::Tbatt]),
|
||||||
|
heatsink_temp: signed(ram[TristarRamAddress::THs]),
|
||||||
charge_state: ChargeState::from(ram[TristarRamAddress::ChargeState]),
|
charge_state: ChargeState::from(ram[TristarRamAddress::ChargeState]),
|
||||||
tristar_input_voltage: scaling.get_voltage(ram[TristarRamAddress::AdcVaF]),
|
tristar_input_voltage: scaling.get_voltage(ram[TristarRamAddress::AdcVaF]),
|
||||||
tristar_charge_current: scaling.get_current(ram[TristarRamAddress::AdcIbFShadow]),
|
tristar_charge_current: scaling.get_current(ram[TristarRamAddress::AdcIbFShadow]),
|
||||||
|
@ -80,6 +92,8 @@ impl TristarState {
|
||||||
tristar_max_array_power: scaling.get_power(ram[TristarRamAddress::SweepPinMax]),
|
tristar_max_array_power: scaling.get_power(ram[TristarRamAddress::SweepPinMax]),
|
||||||
tristar_max_array_voltage: scaling.get_voltage(ram[TristarRamAddress::SweepVmp]),
|
tristar_max_array_voltage: scaling.get_voltage(ram[TristarRamAddress::SweepVmp]),
|
||||||
tristar_open_circuit_voltage: scaling.get_voltage(ram[TristarRamAddress::SweepVoc]),
|
tristar_open_circuit_voltage: scaling.get_voltage(ram[TristarRamAddress::SweepVoc]),
|
||||||
|
daily_charge_amp_hours: f64::from(ram[TristarRamAddress::AhcDaily]) * 0.1,
|
||||||
|
daily_charge_watt_hours: f64::from(ram[TristarRamAddress::WhcDaily]),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -262,6 +276,9 @@ impl Tristar {
|
||||||
BATTERY_TEMP
|
BATTERY_TEMP
|
||||||
.with_label_values(&[&self.friendly_name])
|
.with_label_values(&[&self.friendly_name])
|
||||||
.set(new_state.battery_temp.into());
|
.set(new_state.battery_temp.into());
|
||||||
|
HEATSINK_TEMP
|
||||||
|
.with_label_values(&[&self.friendly_name])
|
||||||
|
.set(new_state.heatsink_temp.into());
|
||||||
TRISTAR_INPUT_VOLTAGE
|
TRISTAR_INPUT_VOLTAGE
|
||||||
.with_label_values(&[&self.friendly_name])
|
.with_label_values(&[&self.friendly_name])
|
||||||
.set(new_state.tristar_input_voltage);
|
.set(new_state.tristar_input_voltage);
|
||||||
|
@ -283,6 +300,12 @@ impl Tristar {
|
||||||
TRISTAR_OPEN_CIRCUIT_VOLTAGE
|
TRISTAR_OPEN_CIRCUIT_VOLTAGE
|
||||||
.with_label_values(&[&self.friendly_name])
|
.with_label_values(&[&self.friendly_name])
|
||||||
.set(new_state.tristar_open_circuit_voltage);
|
.set(new_state.tristar_open_circuit_voltage);
|
||||||
|
TRISTAR_TOTAL_AH_CHARGE_DAILY
|
||||||
|
.with_label_values(&[&self.friendly_name])
|
||||||
|
.set(new_state.daily_charge_amp_hours);
|
||||||
|
TRISTAR_TOTAL_WH_CHARGE_DAILY
|
||||||
|
.with_label_values(&[&self.friendly_name])
|
||||||
|
.set(new_state.daily_charge_watt_hours);
|
||||||
|
|
||||||
self.charge_state_gauges.set(new_state.charge_state);
|
self.charge_state_gauges.set(new_state.charge_state);
|
||||||
|
|
||||||
|
@ -302,19 +325,64 @@ impl Tristar {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum TristarRamAddress {
|
pub enum TristarRamAddress {
|
||||||
AdcVbFMed = 0x0018,
|
AdcVbFMed = 0x0018,
|
||||||
|
AdcVbtermF = 0x0019,
|
||||||
|
AdcVbsF = 0x001A,
|
||||||
AdcVaF = 0x001B,
|
AdcVaF = 0x001B,
|
||||||
AdcIbFShadow = 0x001C,
|
AdcIbFShadow = 0x001C,
|
||||||
AdcIaFShadow = 0x001D,
|
AdcIaFShadow = 0x001D,
|
||||||
|
AdcP12F = 0x001E,
|
||||||
|
AdcP3F = 0x001F,
|
||||||
|
AdcPmeterF = 0x0020,
|
||||||
|
AdcP18F = 0x0021,
|
||||||
|
AdcVRef = 0x0022,
|
||||||
|
THs = 0x0023,
|
||||||
|
TRts = 0x0024,
|
||||||
Tbatt = 0x0025,
|
Tbatt = 0x0025,
|
||||||
|
AdcVbF1m = 0x0026,
|
||||||
|
AdcIbF1m = 0x0027,
|
||||||
|
VbMin = 0x0028,
|
||||||
|
VbMax = 0x0029,
|
||||||
|
HourmeterHi = 0x002A,
|
||||||
|
HourmeterLo = 0x002B,
|
||||||
|
Fault = 0x002C,
|
||||||
|
AlarmHi = 0x002E,
|
||||||
|
AlarmLo = 0x002F,
|
||||||
|
Dip = 0x0030,
|
||||||
|
Led = 0x0031,
|
||||||
ChargeState = 0x0032,
|
ChargeState = 0x0032,
|
||||||
VbRef = 0x0033,
|
VbRef = 0x0033,
|
||||||
|
AhcRHi = 0x0034,
|
||||||
|
AhcRLo = 0x0035,
|
||||||
|
AhcTHi = 0x0036,
|
||||||
|
AhcTLo = 0x0037,
|
||||||
|
KwhcR = 0x0038,
|
||||||
|
KwhcT = 0x0039,
|
||||||
PowerOutShadow = 0x003A,
|
PowerOutShadow = 0x003A,
|
||||||
PowerInShadow = 0x003B,
|
PowerInShadow = 0x003B,
|
||||||
SweepPinMax = 0x003C,
|
SweepPinMax = 0x003C,
|
||||||
SweepVmp = 0x003D,
|
SweepVmp = 0x003D,
|
||||||
SweepVoc = 0x003E,
|
SweepVoc = 0x003E,
|
||||||
|
VbMinDaily = 0x0040,
|
||||||
|
VbMaxDaily = 0x0041,
|
||||||
|
VaMaxDaily = 0x0042,
|
||||||
|
AhcDaily = 0x0043,
|
||||||
|
WhcDaily = 0x0044,
|
||||||
|
FlagsDaily = 0x0045,
|
||||||
|
PoutMaxDaily = 0x0046,
|
||||||
|
TbMinDaily = 0x0047,
|
||||||
|
TbMaxDaily = 0x0048,
|
||||||
|
FaultDaily = 0x0049,
|
||||||
|
AlarmDailyHi = 0x004B,
|
||||||
|
AlarmDailyLo = 0x004C,
|
||||||
|
TimeAbDaily = 0x004D,
|
||||||
|
TimeEqDaily = 0x004E,
|
||||||
|
TimeFlDaily = 0x004F,
|
||||||
|
IbRefSlave = 0x0058,
|
||||||
|
VbRefSlave = 0x0059,
|
||||||
|
VaRefFixed = 0x005A,
|
||||||
|
VaRefFixedPc = 0x005B,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl std::ops::Index<TristarRamAddress> for [u16] {
|
impl std::ops::Index<TristarRamAddress> for [u16] {
|
||||||
|
|
Loading…
Add table
Reference in a new issue