1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
/// Inverter (Split Phase) FLOAT
///
/// Include this model for split phase inverter monitoring using float values
#[derive(Debug)]
pub struct Model112 {
    /// Amps
    ///
    /// AC Current
    pub a: f32,
    /// Amps PhaseA
    ///
    /// Phase A Current
    ///
    /// Notes: Connected Phase
    pub apha: f32,
    /// Amps PhaseB
    ///
    /// Phase B Current
    ///
    /// Notes: Connected Phase
    pub aphb: f32,
    /// Amps PhaseC
    ///
    /// Phase C Current
    pub aphc: Option<f32>,
    /// Phase Voltage AB
    ///
    /// Phase Voltage AB
    pub ppvphab: Option<f32>,
    /// Phase Voltage BC
    ///
    /// Phase Voltage BC
    pub ppvphbc: Option<f32>,
    /// Phase Voltage CA
    ///
    /// Phase Voltage CA
    pub ppvphca: Option<f32>,
    /// Phase Voltage AN
    ///
    /// Phase Voltage AN
    pub phvpha: f32,
    /// Phase Voltage BN
    ///
    /// Phase Voltage BN
    pub phvphb: f32,
    /// Phase Voltage CN
    ///
    /// Phase Voltage CN
    pub phvphc: Option<f32>,
    /// Watts
    ///
    /// AC Power
    pub w: f32,
    /// Hz
    ///
    /// Line Frequency
    pub hz: f32,
    /// VA
    ///
    /// AC Apparent Power
    pub va: Option<f32>,
    /// VAr
    ///
    /// AC Reactive Power
    pub var: Option<f32>,
    /// PF
    ///
    /// AC Power Factor
    pub pf: Option<f32>,
    /// WattHours
    ///
    /// AC Energy
    pub wh: f32,
    /// DC Amps
    ///
    /// DC Current
    pub dca: Option<f32>,
    /// DC Voltage
    ///
    /// DC Voltage
    pub dcv: Option<f32>,
    /// DC Watts
    ///
    /// DC Power
    pub dcw: Option<f32>,
    /// Cabinet Temperature
    ///
    /// Cabinet Temperature
    pub tmpcab: f32,
    /// Heat Sink Temperature
    ///
    /// Heat Sink Temperature
    pub tmpsnk: Option<f32>,
    /// Transformer Temperature
    ///
    /// Transformer Temperature
    pub tmptrns: Option<f32>,
    /// Other Temperature
    ///
    /// Other Temperature
    pub tmpot: Option<f32>,
    /// Operating State
    ///
    /// Enumerated value.  Operating state
    pub st: u16,
    /// Vendor Operating State
    ///
    /// Vendor specific operating state code
    pub stvnd: Option<u16>,
    /// Event1
    ///
    /// Bitmask value. Event fields
    pub evt1: u32,
    /// Event Bitfield 2
    ///
    /// Reserved for future use
    pub evt2: u32,
    /// Vendor Event Bitfield 1
    ///
    /// Vendor defined events
    pub evtvnd1: Option<u32>,
    /// Vendor Event Bitfield 2
    ///
    /// Vendor defined events
    pub evtvnd2: Option<u32>,
    /// Vendor Event Bitfield 3
    ///
    /// Vendor defined events
    pub evtvnd3: Option<u32>,
    /// Vendor Event Bitfield 4
    ///
    /// Vendor defined events
    pub evtvnd4: Option<u32>,
}

#[allow(missing_docs)]

impl Model112 {
    pub const A: crate::PointDef<Self, f32> = crate::PointDef::new(0, 2, false);
    pub const APHA: crate::PointDef<Self, f32> = crate::PointDef::new(2, 2, false);
    pub const APHB: crate::PointDef<Self, f32> = crate::PointDef::new(4, 2, false);
    pub const APHC: crate::PointDef<Self, f32> = crate::PointDef::new(6, 2, false);
    pub const PPVPHAB: crate::PointDef<Self, f32> = crate::PointDef::new(8, 2, false);
    pub const PPVPHBC: crate::PointDef<Self, f32> = crate::PointDef::new(10, 2, false);
    pub const PPVPHCA: crate::PointDef<Self, f32> = crate::PointDef::new(12, 2, false);
    pub const PHVPHA: crate::PointDef<Self, f32> = crate::PointDef::new(14, 2, false);
    pub const PHVPHB: crate::PointDef<Self, f32> = crate::PointDef::new(16, 2, false);
    pub const PHVPHC: crate::PointDef<Self, f32> = crate::PointDef::new(18, 2, false);
    pub const W: crate::PointDef<Self, f32> = crate::PointDef::new(20, 2, false);
    pub const HZ: crate::PointDef<Self, f32> = crate::PointDef::new(22, 2, false);
    pub const VA: crate::PointDef<Self, f32> = crate::PointDef::new(24, 2, false);
    pub const VAR: crate::PointDef<Self, f32> = crate::PointDef::new(26, 2, false);
    pub const PF: crate::PointDef<Self, f32> = crate::PointDef::new(28, 2, false);
    pub const WH: crate::PointDef<Self, f32> = crate::PointDef::new(30, 2, false);
    pub const DCA: crate::PointDef<Self, f32> = crate::PointDef::new(32, 2, false);
    pub const DCV: crate::PointDef<Self, f32> = crate::PointDef::new(34, 2, false);
    pub const DCW: crate::PointDef<Self, f32> = crate::PointDef::new(36, 2, false);
    pub const TMPCAB: crate::PointDef<Self, f32> = crate::PointDef::new(38, 2, false);
    pub const TMPSNK: crate::PointDef<Self, f32> = crate::PointDef::new(40, 2, false);
    pub const TMPTRNS: crate::PointDef<Self, f32> = crate::PointDef::new(42, 2, false);
    pub const TMPOT: crate::PointDef<Self, f32> = crate::PointDef::new(44, 2, false);
    pub const ST: crate::PointDef<Self, u16> = crate::PointDef::new(46, 1, false);
    pub const STVND: crate::PointDef<Self, u16> = crate::PointDef::new(47, 1, false);
    pub const EVT1: crate::PointDef<Self, u32> = crate::PointDef::new(48, 2, false);
    pub const EVT2: crate::PointDef<Self, u32> = crate::PointDef::new(50, 2, false);
    pub const EVTVND1: crate::PointDef<Self, u32> = crate::PointDef::new(52, 2, false);
    pub const EVTVND2: crate::PointDef<Self, u32> = crate::PointDef::new(54, 2, false);
    pub const EVTVND3: crate::PointDef<Self, u32> = crate::PointDef::new(56, 2, false);
    pub const EVTVND4: crate::PointDef<Self, u32> = crate::PointDef::new(58, 2, false);
}

impl crate::Model for Model112 {
    const ID: u16 = 112;
    fn from_data(data: &[u16]) -> Result<Self, crate::ReadModelError> {
        Ok(Self {
            a: Self::A
                .from_data(data)?
                .ok_or(crate::ReadPointError::MissingMandatoryValue)?,
            apha: Self::APHA
                .from_data(data)?
                .ok_or(crate::ReadPointError::MissingMandatoryValue)?,
            aphb: Self::APHB
                .from_data(data)?
                .ok_or(crate::ReadPointError::MissingMandatoryValue)?,
            aphc: Self::APHC.from_data(data)?,
            ppvphab: Self::PPVPHAB.from_data(data)?,
            ppvphbc: Self::PPVPHBC.from_data(data)?,
            ppvphca: Self::PPVPHCA.from_data(data)?,
            phvpha: Self::PHVPHA
                .from_data(data)?
                .ok_or(crate::ReadPointError::MissingMandatoryValue)?,
            phvphb: Self::PHVPHB
                .from_data(data)?
                .ok_or(crate::ReadPointError::MissingMandatoryValue)?,
            phvphc: Self::PHVPHC.from_data(data)?,
            w: Self::W
                .from_data(data)?
                .ok_or(crate::ReadPointError::MissingMandatoryValue)?,
            hz: Self::HZ
                .from_data(data)?
                .ok_or(crate::ReadPointError::MissingMandatoryValue)?,
            va: Self::VA.from_data(data)?,
            var: Self::VAR.from_data(data)?,
            pf: Self::PF.from_data(data)?,
            wh: Self::WH
                .from_data(data)?
                .ok_or(crate::ReadPointError::MissingMandatoryValue)?,
            dca: Self::DCA.from_data(data)?,
            dcv: Self::DCV.from_data(data)?,
            dcw: Self::DCW.from_data(data)?,
            tmpcab: Self::TMPCAB
                .from_data(data)?
                .ok_or(crate::ReadPointError::MissingMandatoryValue)?,
            tmpsnk: Self::TMPSNK.from_data(data)?,
            tmptrns: Self::TMPTRNS.from_data(data)?,
            tmpot: Self::TMPOT.from_data(data)?,
            st: Self::ST
                .from_data(data)?
                .ok_or(crate::ReadPointError::MissingMandatoryValue)?,
            stvnd: Self::STVND.from_data(data)?,
            evt1: Self::EVT1
                .from_data(data)?
                .ok_or(crate::ReadPointError::MissingMandatoryValue)?,
            evt2: Self::EVT2
                .from_data(data)?
                .ok_or(crate::ReadPointError::MissingMandatoryValue)?,
            evtvnd1: Self::EVTVND1.from_data(data)?,
            evtvnd2: Self::EVTVND2.from_data(data)?,
            evtvnd3: Self::EVTVND3.from_data(data)?,
            evtvnd4: Self::EVTVND4.from_data(data)?,
        })
    }
}