diff --git a/Cargo.lock b/Cargo.lock
index 5370896..f1e5550 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -185,9 +185,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
 name = "bitflags"
-version = "2.6.0"
+version = "2.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
+checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be"
 dependencies = [
  "serde",
 ]
@@ -241,6 +241,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
 name = "charge-controller-supervisor"
 version = "1.9.9-pre-24"
 dependencies = [
+ "bitflags 2.7.0",
  "chrono",
  "clap",
  "env_logger",
@@ -381,7 +382,7 @@ version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b035a542cf7abf01f2e3c4d5a7acbaebfefe120ae4efc7bde3df98186e4b8af7"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "proc-macro2",
  "proc-macro2-diagnostics",
  "quote",
@@ -1169,7 +1170,7 @@ version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "libc",
  "redox_syscall",
 ]
@@ -1360,7 +1361,7 @@ version = "7.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "filetime",
  "fsevent-sys",
  "inotify",
@@ -1675,7 +1676,7 @@ version = "0.5.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
 ]
 
 [[package]]
@@ -1888,7 +1889,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
 dependencies = [
  "base64 0.21.7",
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "serde",
  "serde_derive",
 ]
@@ -1911,7 +1912,7 @@ version = "0.38.42"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "errno",
  "libc",
  "linux-raw-sys",
@@ -2053,7 +2054,7 @@ version = "4.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "779e2977f0cc2ff39708fef48f96f3768ac8ddd8c6caaaab82e83bd240ef99b2"
 dependencies = [
- "bitflags 2.6.0",
+ "bitflags 2.7.0",
  "cfg-if",
  "core-foundation",
  "core-foundation-sys",
diff --git a/charge-controller-supervisor/Cargo.toml b/charge-controller-supervisor/Cargo.toml
index b5ad6a4..1b83211 100644
--- a/charge-controller-supervisor/Cargo.toml
+++ b/charge-controller-supervisor/Cargo.toml
@@ -12,6 +12,7 @@ systemd-units = { enable = false }
 depends = ""
 
 [dependencies]
+bitflags = { version = "2.7.0", features = ["serde"] }
 chrono = "0.4.39"
 clap = { version = "4.5.23", features = ["derive"] }
 env_logger = "0.11.6"
diff --git a/charge-controller-supervisor/src/controller/tristar.rs b/charge-controller-supervisor/src/controller/tristar.rs
index cbbf234..2148da4 100644
--- a/charge-controller-supervisor/src/controller/tristar.rs
+++ b/charge-controller-supervisor/src/controller/tristar.rs
@@ -421,6 +421,11 @@ pub struct TristarState {
     pub tristar_open_circuit_voltage: f64,
     pub daily_charge_amp_hours: f64,
     pub daily_charge_watt_hours: f64,
+    pub alarms: Alarms,
+    pub faults: Faults,
+    pub alarms_daily: Alarms,
+    pub faults_daily: Faults,
+    pub flags_daily: DailyFlags,
 }
 
 fn signed(val: u16) -> i16 {
@@ -450,10 +455,87 @@ impl TristarState {
             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]),
+            alarms: Alarms::from_words(
+                ram[TristarRamAddress::AlarmLo],
+                ram[TristarRamAddress::AlarmHi],
+            ),
+            faults: Faults::from_bits_retain(ram[TristarRamAddress::Fault]),
+            alarms_daily: Alarms::from_words(
+                ram[TristarRamAddress::AlarmDailyLo],
+                ram[TristarRamAddress::AlarmDailyHi],
+            ),
+            faults_daily: Faults::from_bits_retain(ram[TristarRamAddress::FaultDaily]),
+            flags_daily: DailyFlags::from_bits_retain(ram[TristarRamAddress::FlagsDaily]),
         }
     }
 }
 
+bitflags::bitflags! {
+    #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+    pub struct Faults: u16 {
+        const Overcurrent = 1;
+        const FETsShorted = 1 << 1;
+        const SoftwareBug = 1 << 2;
+        const BatteryHVD = 1 << 3;
+        const ArrayHVD = 1 << 4;
+        const SettingsSwitchChanged = 1 << 5;
+        const CustomSettingsEdit = 1 << 6;
+        const RTSShorted = 1 << 7;
+        const RTSDisconnected = 1 << 8;
+        const EEPROMRetryLimit = 1 << 9;
+        const Reserved = 1 << 10;
+        const SlaveControlTimeout = 1 << 11;
+        const Fault13 = 1 << 12;
+        const Fault14 = 1 << 13;
+        const Fault15 = 1 << 14;
+        const Fault16 = 1 << 15;
+    }
+
+    #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+    pub struct Alarms: u32 {
+        const RTSOpen = 1;
+        const RTSShorted = 1 << 1;
+        const RTSDisconnected = 1 << 2;
+        const HeatsinkTempSensorOpen = 1 << 3;
+        const HeatsinkTempSensorShorted = 1 << 4;
+        const HighTemperatureCurrentLimit = 1 << 5;
+        const CurrentLimit = 1 << 6;
+        const CurrentOffset = 1 << 7;
+        const BatterySenseOutOfRange = 1 << 8;
+        const BatterySenseDisconnected = 1 << 9;
+        const Uncalibrated = 1 << 10;
+        const RTSMiswire = 1 << 11;
+        const HighVoltageDisconnect = 1 << 12;
+        const Undefined = 1 << 13;
+        const SystemMiswire = 1 << 14;
+        const MOSFETOpen = 1 << 15;
+        const P12VoltageOff = 1 << 16;
+        const HighInputVoltageCurrentLimit = 1 << 17;
+        const ADCInputMax = 1 << 18;
+        const ControllerWasReset = 1 << 19;
+        const Alarm21 = 1 << 20;
+        const Alarm22 = 1 << 21;
+        const Alarm23 = 1 << 22;
+        const Alarm24 = 1 << 23;
+    }
+
+    #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
+    pub struct DailyFlags: u16 {
+        const ResetDetected = 1;
+        const EqualizeTriggered = 1 << 1;
+        const EnteredFloat = 1 << 2;
+        const AlarmOccurred = 1 << 3;
+        const FaultOccurred = 1 << 4;
+    }
+}
+
+impl Alarms {
+    const fn from_words(low: u16, high: u16) -> Self {
+        let val = (low as u32) | ((high as u32) << 16);
+        Self::from_bits_retain(val)
+    }
+}
+
 #[derive(Debug, Clone, Copy, Serialize, Deserialize)]
 pub enum ChargeState {
     Start,