1use crate::data::deserialize::deserialize_macaddr;
2use crate::data::serialize::serialize_macaddr;
3use crate::data::serialize::serialize_power;
4use crate::data::serialize::serialize_temperature;
5use std::{net::IpAddr, time::Duration};
6
7use super::{
8 board::BoardData, device::DeviceInfo, fan::FanData, hashrate::HashRate, message::MinerMessage,
9 pool::PoolData,
10};
11use crate::data::device::MinerControlBoard;
12use macaddr::MacAddr;
13use measurements::{Power, Temperature};
14use serde::{Deserialize, Serialize};
15
16#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
17pub struct MinerData {
18 pub schema_version: String,
20 pub timestamp: u64,
22 pub ip: IpAddr,
24 #[serde(
26 serialize_with = "serialize_macaddr",
27 deserialize_with = "deserialize_macaddr"
28 )]
29 pub mac: Option<MacAddr>,
30 pub device_info: DeviceInfo,
32 pub serial_number: Option<String>,
34 pub hostname: Option<String>,
36 pub api_version: Option<String>,
38 pub firmware_version: Option<String>,
40 pub control_board_version: Option<MinerControlBoard>,
42 pub expected_hashboards: Option<u8>,
44 pub hashboards: Vec<BoardData>,
46 pub hashrate: Option<HashRate>,
48 pub expected_hashrate: Option<HashRate>,
50 pub expected_chips: Option<u16>,
52 pub total_chips: Option<u16>,
54 pub expected_fans: Option<u8>,
56 pub fans: Vec<FanData>,
58 pub psu_fans: Vec<FanData>,
60 #[serde(serialize_with = "serialize_temperature")]
62 pub average_temperature: Option<Temperature>,
63 #[serde(serialize_with = "serialize_temperature")]
65 pub fluid_temperature: Option<Temperature>,
66 #[serde(serialize_with = "serialize_power")]
68 pub wattage: Option<Power>,
69 #[serde(serialize_with = "serialize_power")]
71 pub wattage_limit: Option<Power>,
72 pub efficiency: Option<f64>,
74 pub light_flashing: Option<bool>,
76 pub messages: Vec<MinerMessage>,
78 pub uptime: Option<Duration>,
80 pub is_mining: bool,
82 pub pools: Vec<PoolData>,
84}