Skip to main content

sunspec/models/
model111.rs

1//! Inverter (Single Phase) FLOAT
2/// Type alias for [`InverterSinglePhaseFloat`].
3pub type Model111 = InverterSinglePhaseFloat;
4/// Inverter (Single Phase) FLOAT
5///
6/// Include this model for single phase inverter monitoring using float values
7#[derive(Debug)]
8#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
9pub struct InverterSinglePhaseFloat {
10    /// Amps
11    ///
12    /// AC Current
13    pub a: f32,
14    /// Amps PhaseA
15    ///
16    /// Phase A Current
17    ///
18    /// Detail: Connected Phase
19    pub aph_a: f32,
20    /// Amps PhaseB
21    ///
22    /// Phase B Current
23    pub aph_b: Option<f32>,
24    /// Amps PhaseC
25    ///
26    /// Phase C Current
27    pub aph_c: Option<f32>,
28    /// Phase Voltage AB
29    ///
30    /// Phase Voltage AB
31    pub pp_vph_ab: Option<f32>,
32    /// Phase Voltage BC
33    ///
34    /// Phase Voltage BC
35    pub pp_vph_bc: Option<f32>,
36    /// Phase Voltage CA
37    ///
38    /// Phase Voltage CA
39    pub pp_vph_ca: Option<f32>,
40    /// Phase Voltage AN
41    ///
42    /// Phase Voltage AN
43    pub ph_vph_a: f32,
44    /// Phase Voltage BN
45    ///
46    /// Phase Voltage BN
47    pub ph_vph_b: Option<f32>,
48    /// Phase Voltage CN
49    ///
50    /// Phase Voltage CN
51    pub ph_vph_c: Option<f32>,
52    /// Watts
53    ///
54    /// AC Power
55    pub w: f32,
56    /// Hz
57    ///
58    /// Line Frequency
59    pub hz: f32,
60    /// VA
61    ///
62    /// AC Apparent Power
63    pub va: Option<f32>,
64    /// VAr
65    ///
66    /// AC Reactive Power
67    pub v_ar: Option<f32>,
68    /// PF
69    ///
70    /// AC Power Factor
71    pub pf: Option<f32>,
72    /// WattHours
73    ///
74    /// AC Energy
75    pub wh: f32,
76    /// DC Amps
77    ///
78    /// DC Current
79    pub dca: Option<f32>,
80    /// DC Voltage
81    ///
82    /// DC Voltage
83    pub dcv: Option<f32>,
84    /// DC Watts
85    ///
86    /// DC Power
87    pub dcw: Option<f32>,
88    /// Cabinet Temperature
89    ///
90    /// Cabinet Temperature
91    pub tmp_cab: f32,
92    /// Heat Sink Temperature
93    ///
94    /// Heat Sink Temperature
95    pub tmp_snk: Option<f32>,
96    /// Transformer Temperature
97    ///
98    /// Transformer Temperature
99    pub tmp_trns: Option<f32>,
100    /// Other Temperature
101    ///
102    /// Other Temperature
103    pub tmp_ot: Option<f32>,
104    /// Operating State
105    ///
106    /// Enumerated value.  Operating state
107    pub st: St,
108    /// Vendor Operating State
109    ///
110    /// Vendor specific operating state code
111    pub st_vnd: Option<u16>,
112    /// Event1
113    ///
114    /// Bitmask value. Event fields
115    pub evt1: Evt1,
116    /// Event Bitfield 2
117    ///
118    /// Reserved for future use
119    pub evt2: Evt2,
120    /// Vendor Event Bitfield 1
121    ///
122    /// Vendor defined events
123    pub evt_vnd1: Option<EvtVnd1>,
124    /// Vendor Event Bitfield 2
125    ///
126    /// Vendor defined events
127    pub evt_vnd2: Option<EvtVnd2>,
128    /// Vendor Event Bitfield 3
129    ///
130    /// Vendor defined events
131    pub evt_vnd3: Option<EvtVnd3>,
132    /// Vendor Event Bitfield 4
133    ///
134    /// Vendor defined events
135    pub evt_vnd4: Option<EvtVnd4>,
136}
137#[allow(missing_docs)]
138impl InverterSinglePhaseFloat {
139    pub const A: crate::Point<Self, f32> = crate::Point::new(0, 2, false);
140    pub const APH_A: crate::Point<Self, f32> = crate::Point::new(2, 2, false);
141    pub const APH_B: crate::Point<Self, Option<f32>> = crate::Point::new(4, 2, false);
142    pub const APH_C: crate::Point<Self, Option<f32>> = crate::Point::new(6, 2, false);
143    pub const PP_VPH_AB: crate::Point<Self, Option<f32>> = crate::Point::new(8, 2, false);
144    pub const PP_VPH_BC: crate::Point<Self, Option<f32>> = crate::Point::new(10, 2, false);
145    pub const PP_VPH_CA: crate::Point<Self, Option<f32>> = crate::Point::new(12, 2, false);
146    pub const PH_VPH_A: crate::Point<Self, f32> = crate::Point::new(14, 2, false);
147    pub const PH_VPH_B: crate::Point<Self, Option<f32>> = crate::Point::new(16, 2, false);
148    pub const PH_VPH_C: crate::Point<Self, Option<f32>> = crate::Point::new(18, 2, false);
149    pub const W: crate::Point<Self, f32> = crate::Point::new(20, 2, false);
150    pub const HZ: crate::Point<Self, f32> = crate::Point::new(22, 2, false);
151    pub const VA: crate::Point<Self, Option<f32>> = crate::Point::new(24, 2, false);
152    pub const V_AR: crate::Point<Self, Option<f32>> = crate::Point::new(26, 2, false);
153    pub const PF: crate::Point<Self, Option<f32>> = crate::Point::new(28, 2, false);
154    pub const WH: crate::Point<Self, f32> = crate::Point::new(30, 2, false);
155    pub const DCA: crate::Point<Self, Option<f32>> = crate::Point::new(32, 2, false);
156    pub const DCV: crate::Point<Self, Option<f32>> = crate::Point::new(34, 2, false);
157    pub const DCW: crate::Point<Self, Option<f32>> = crate::Point::new(36, 2, false);
158    pub const TMP_CAB: crate::Point<Self, f32> = crate::Point::new(38, 2, false);
159    pub const TMP_SNK: crate::Point<Self, Option<f32>> = crate::Point::new(40, 2, false);
160    pub const TMP_TRNS: crate::Point<Self, Option<f32>> = crate::Point::new(42, 2, false);
161    pub const TMP_OT: crate::Point<Self, Option<f32>> = crate::Point::new(44, 2, false);
162    pub const ST: crate::Point<Self, St> = crate::Point::new(46, 1, false);
163    pub const ST_VND: crate::Point<Self, Option<u16>> = crate::Point::new(47, 1, false);
164    pub const EVT1: crate::Point<Self, Evt1> = crate::Point::new(48, 2, false);
165    pub const EVT2: crate::Point<Self, Evt2> = crate::Point::new(50, 2, false);
166    pub const EVT_VND1: crate::Point<Self, Option<EvtVnd1>> = crate::Point::new(52, 2, false);
167    pub const EVT_VND2: crate::Point<Self, Option<EvtVnd2>> = crate::Point::new(54, 2, false);
168    pub const EVT_VND3: crate::Point<Self, Option<EvtVnd3>> = crate::Point::new(56, 2, false);
169    pub const EVT_VND4: crate::Point<Self, Option<EvtVnd4>> = crate::Point::new(58, 2, false);
170}
171impl crate::Group for InverterSinglePhaseFloat {
172    const LEN: u16 = 60;
173}
174impl InverterSinglePhaseFloat {
175    fn parse_group(data: &[u16]) -> Result<(&[u16], Self), crate::DecodeError> {
176        let nested_data = data
177            .get(usize::from(<Self as crate::Group>::LEN)..)
178            .unwrap_or(&[]);
179        Ok((
180            nested_data,
181            Self {
182                a: Self::A.from_data(data)?,
183                aph_a: Self::APH_A.from_data(data)?,
184                aph_b: Self::APH_B.from_data(data)?,
185                aph_c: Self::APH_C.from_data(data)?,
186                pp_vph_ab: Self::PP_VPH_AB.from_data(data)?,
187                pp_vph_bc: Self::PP_VPH_BC.from_data(data)?,
188                pp_vph_ca: Self::PP_VPH_CA.from_data(data)?,
189                ph_vph_a: Self::PH_VPH_A.from_data(data)?,
190                ph_vph_b: Self::PH_VPH_B.from_data(data)?,
191                ph_vph_c: Self::PH_VPH_C.from_data(data)?,
192                w: Self::W.from_data(data)?,
193                hz: Self::HZ.from_data(data)?,
194                va: Self::VA.from_data(data)?,
195                v_ar: Self::V_AR.from_data(data)?,
196                pf: Self::PF.from_data(data)?,
197                wh: Self::WH.from_data(data)?,
198                dca: Self::DCA.from_data(data)?,
199                dcv: Self::DCV.from_data(data)?,
200                dcw: Self::DCW.from_data(data)?,
201                tmp_cab: Self::TMP_CAB.from_data(data)?,
202                tmp_snk: Self::TMP_SNK.from_data(data)?,
203                tmp_trns: Self::TMP_TRNS.from_data(data)?,
204                tmp_ot: Self::TMP_OT.from_data(data)?,
205                st: Self::ST.from_data(data)?,
206                st_vnd: Self::ST_VND.from_data(data)?,
207                evt1: Self::EVT1.from_data(data)?,
208                evt2: Self::EVT2.from_data(data)?,
209                evt_vnd1: Self::EVT_VND1.from_data(data)?,
210                evt_vnd2: Self::EVT_VND2.from_data(data)?,
211                evt_vnd3: Self::EVT_VND3.from_data(data)?,
212                evt_vnd4: Self::EVT_VND4.from_data(data)?,
213            },
214        ))
215    }
216}
217/// Operating State
218///
219/// Enumerated value.  Operating state
220#[derive(Copy, Clone, Debug, Eq, PartialEq)]
221#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
222pub enum St {
223    #[allow(missing_docs)]
224    GgOff,
225    #[allow(missing_docs)]
226    GgSleeping,
227    #[allow(missing_docs)]
228    GgStarting,
229    #[allow(missing_docs)]
230    GgMppt,
231    #[allow(missing_docs)]
232    GgThrottled,
233    #[allow(missing_docs)]
234    GgShuttingDown,
235    #[allow(missing_docs)]
236    GgFault,
237    #[allow(missing_docs)]
238    GgStandby,
239    /// Raw enum value not defined by the SunSpec model.
240    Invalid(u16),
241}
242impl crate::EnumValue for St {
243    type Repr = u16;
244    const INVALID: Self::Repr = 65535;
245    fn from_repr(value: Self::Repr) -> Self {
246        match value {
247            1 => Self::GgOff,
248            2 => Self::GgSleeping,
249            3 => Self::GgStarting,
250            4 => Self::GgMppt,
251            5 => Self::GgThrottled,
252            6 => Self::GgShuttingDown,
253            7 => Self::GgFault,
254            8 => Self::GgStandby,
255            value => Self::Invalid(value),
256        }
257    }
258    fn to_repr(self) -> Self::Repr {
259        match self {
260            Self::GgOff => 1,
261            Self::GgSleeping => 2,
262            Self::GgStarting => 3,
263            Self::GgMppt => 4,
264            Self::GgThrottled => 5,
265            Self::GgShuttingDown => 6,
266            Self::GgFault => 7,
267            Self::GgStandby => 8,
268            Self::Invalid(value) => value,
269        }
270    }
271}
272impl crate::FixedSize for St {
273    const SIZE: u16 = 1u16;
274    const INVALID: Self = Self::Invalid(65535);
275    fn is_invalid(&self) -> bool {
276        matches!(self, Self::Invalid(_))
277    }
278}
279bitflags::bitflags! {
280    #[doc = " Event1"] #[doc = " "] #[doc = " Bitmask value. Event fields"]
281    #[derive(Copy, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde",
282    derive(::serde::Serialize, ::serde::Deserialize))] pub struct Evt1 : u32 {
283    #[allow(missing_docs)] const GroundFault = 1; #[allow(missing_docs)] const DcOverVolt
284    = 2; #[allow(missing_docs)] const AcDisconnect = 4; #[allow(missing_docs)] const
285    DcDisconnect = 8; #[allow(missing_docs)] const GridDisconnect = 16;
286    #[allow(missing_docs)] const CabinetOpen = 32; #[allow(missing_docs)] const
287    ManualShutdown = 64; #[allow(missing_docs)] const OverTemp = 128;
288    #[allow(missing_docs)] const OverFrequency = 256; #[allow(missing_docs)] const
289    UnderFrequency = 512; #[allow(missing_docs)] const AcOverVolt = 1024;
290    #[allow(missing_docs)] const AcUnderVolt = 2048; #[allow(missing_docs)] const
291    BlownStringFuse = 4096; #[allow(missing_docs)] const UnderTemp = 8192;
292    #[allow(missing_docs)] const MemoryLoss = 16384; #[allow(missing_docs)] const
293    HwTestFailure = 32768; }
294}
295impl crate::Value for Evt1 {
296    fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
297        let value = u32::decode(data)?;
298        Ok(Self::from_bits_retain(value))
299    }
300    fn encode(self) -> Box<[u16]> {
301        self.bits().encode()
302    }
303}
304impl crate::FixedSize for Evt1 {
305    const SIZE: u16 = 2u16;
306    const INVALID: Self = Self::from_bits_retain(4294967295u32);
307    fn is_invalid(&self) -> bool {
308        self.bits() == 4294967295u32
309    }
310}
311bitflags::bitflags! {
312    #[doc = " Event Bitfield 2"] #[doc = " "] #[doc = " Reserved for future use"]
313    #[derive(Copy, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde",
314    derive(::serde::Serialize, ::serde::Deserialize))] pub struct Evt2 : u32 {}
315}
316impl crate::Value for Evt2 {
317    fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
318        let value = u32::decode(data)?;
319        Ok(Self::from_bits_retain(value))
320    }
321    fn encode(self) -> Box<[u16]> {
322        self.bits().encode()
323    }
324}
325impl crate::FixedSize for Evt2 {
326    const SIZE: u16 = 2u16;
327    const INVALID: Self = Self::from_bits_retain(4294967295u32);
328    fn is_invalid(&self) -> bool {
329        self.bits() == 4294967295u32
330    }
331}
332bitflags::bitflags! {
333    #[doc = " Vendor Event Bitfield 1"] #[doc = " "] #[doc = " Vendor defined events"]
334    #[derive(Copy, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde",
335    derive(::serde::Serialize, ::serde::Deserialize))] pub struct EvtVnd1 : u32 {}
336}
337impl crate::Value for EvtVnd1 {
338    fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
339        let value = u32::decode(data)?;
340        Ok(Self::from_bits_retain(value))
341    }
342    fn encode(self) -> Box<[u16]> {
343        self.bits().encode()
344    }
345}
346impl crate::FixedSize for EvtVnd1 {
347    const SIZE: u16 = 2u16;
348    const INVALID: Self = Self::from_bits_retain(4294967295u32);
349    fn is_invalid(&self) -> bool {
350        self.bits() == 4294967295u32
351    }
352}
353bitflags::bitflags! {
354    #[doc = " Vendor Event Bitfield 2"] #[doc = " "] #[doc = " Vendor defined events"]
355    #[derive(Copy, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde",
356    derive(::serde::Serialize, ::serde::Deserialize))] pub struct EvtVnd2 : u32 {}
357}
358impl crate::Value for EvtVnd2 {
359    fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
360        let value = u32::decode(data)?;
361        Ok(Self::from_bits_retain(value))
362    }
363    fn encode(self) -> Box<[u16]> {
364        self.bits().encode()
365    }
366}
367impl crate::FixedSize for EvtVnd2 {
368    const SIZE: u16 = 2u16;
369    const INVALID: Self = Self::from_bits_retain(4294967295u32);
370    fn is_invalid(&self) -> bool {
371        self.bits() == 4294967295u32
372    }
373}
374bitflags::bitflags! {
375    #[doc = " Vendor Event Bitfield 3"] #[doc = " "] #[doc = " Vendor defined events"]
376    #[derive(Copy, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde",
377    derive(::serde::Serialize, ::serde::Deserialize))] pub struct EvtVnd3 : u32 {}
378}
379impl crate::Value for EvtVnd3 {
380    fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
381        let value = u32::decode(data)?;
382        Ok(Self::from_bits_retain(value))
383    }
384    fn encode(self) -> Box<[u16]> {
385        self.bits().encode()
386    }
387}
388impl crate::FixedSize for EvtVnd3 {
389    const SIZE: u16 = 2u16;
390    const INVALID: Self = Self::from_bits_retain(4294967295u32);
391    fn is_invalid(&self) -> bool {
392        self.bits() == 4294967295u32
393    }
394}
395bitflags::bitflags! {
396    #[doc = " Vendor Event Bitfield 4"] #[doc = " "] #[doc = " Vendor defined events"]
397    #[derive(Copy, Clone, Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde",
398    derive(::serde::Serialize, ::serde::Deserialize))] pub struct EvtVnd4 : u32 {}
399}
400impl crate::Value for EvtVnd4 {
401    fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
402        let value = u32::decode(data)?;
403        Ok(Self::from_bits_retain(value))
404    }
405    fn encode(self) -> Box<[u16]> {
406        self.bits().encode()
407    }
408}
409impl crate::FixedSize for EvtVnd4 {
410    const SIZE: u16 = 2u16;
411    const INVALID: Self = Self::from_bits_retain(4294967295u32);
412    fn is_invalid(&self) -> bool {
413        self.bits() == 4294967295u32
414    }
415}
416impl crate::Model for InverterSinglePhaseFloat {
417    const ID: u16 = 111;
418    fn addr(models: &crate::Models) -> crate::ModelAddr<Self> {
419        models.m111
420    }
421    fn parse(data: &[u16]) -> Result<Self, crate::ParseError<Self>> {
422        let (_, model) = Self::parse_group(data)?;
423        Ok(model)
424    }
425}