Skip to main content

sunspec/models/
model101.rs

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