1 #pragma once
2 
3 #include <cereal/cereal.hpp>
4 //#include "../cereal/types/string.hpp"
5 //#include "../cereal/types/utility.hpp"
6 //#include "../cereal/types/memory.hpp"
7 //#include "../cereal/types/complex.hpp"
8 //#include "../cereal/types/base_class.hpp"
9 //#include "../cereal/types/array.hpp"
10 //#include "../cereal/types/vector.hpp"
11 //#include "../cereal/types/map.hpp"
12 
13 #include "ColorSwitch.h"
14 
15 #define sTypeTHBFloat 0x10   //Weather Station
16 #define sTypeWINDNoTemp 0x30    //Weather Station
17 #define sTypeWINDNoTempNoChill 0x31    //Weather Station
18 
19 #define sTypeDomoticzSecurity 0x83
20 #define sTypeSmartwaresSwitchRadiator 0x84
21 
22 #define sTypeRAINWU 0x70	 //Weather Underground (Total rain reported, no counter)
23 #define sTypeRAINByRate 0x71	 //DarkSky for example (Only rate, no total, no counter) rate in mm/hour x 10000, so all decimals will fit
24 
25 #define sTypeTH_LC_TC 0xA0			//La Cross Temp_Hum combined
26 #define sTypeTEMP_SYSTEM 0xA0		//Internal sensor
27 
28 #define wsbaroforecast_heavy_snow 0x01
29 #define wsbaroforecast_snow 0x01
30 #define wsbaroforecast_heavy_rain 0x02
31 #define wsbaroforecast_rain 0x03
32 #define wsbaroforecast_cloudy 0x04
33 #define wsbaroforecast_some_clouds 0x05
34 #define wsbaroforecast_sunny 0x06
35 #define wsbaroforecast_unknown 0x07
36 #define wsbaroforecast_unstable 0x08
37 #define wsbaroforecast_stable 0x09
38 
39 #define bmpbaroforecast_stable			0x00
40 #define bmpbaroforecast_sunny			0x01
41 #define bmpbaroforecast_cloudy			0x02
42 #define bmpbaroforecast_unstable		0x03
43 #define bmpbaroforecast_thunderstorm	0x04
44 #define bmpbaroforecast_unknown			0x05
45 #define bmpbaroforecast_rain			0x06 //when forecast was cloudy and pressure is below 1010 we have 50%+ change of rain
46 
47 #define pTypeThermostat			0xF2
48 #define sTypeThermSetpoint		0x01
49 #define sTypeThermTemperature	0x02
50 
51 
52 #define pTypeGeneral				0xF3
53 #define sTypeVisibility				0x01
54 #define sTypeSolarRadiation			0x02
55 #define sTypeSoilMoisture			0x03
56 #define sTypeLeafWetness			0x04
57 #define sTypeSystemTemp				0x05
58 #define sTypePercentage				0x06
59 #define sTypeFan					0x07
60 #define sTypeVoltage				0x08
61 #define sTypePressure				0x09
62 #define sTypeSetPoint				0x10
63 #define sTypeTemperature			0x11
64 #define sTypeZWaveClock				0x12
65 #define sTypeTextStatus				0x13
66 #define sTypeZWaveThermostatMode	0x14
67 #define sTypeZWaveThermostatFanMode	0x15
68 #define sTypeAlert					0x16
69 #define sTypeCurrent				0x17
70 #define sTypeSoundLevel				0x18
71 #define sTypeUV						0x19
72 #define sTypeBaro					0x1A
73 #define sTypeDistance				0x1B
74 #define sTypeCounterIncremental		0x1C
75 #define sTypeKwh					0x1D
76 #define sTypeWaterflow				0x1E
77 #define sTypeCustom					0x1F
78 #define sTypeZWaveAlarm				0x20
79 #define sTypeManagedCounter			0x21
80 #define sTypeZWaveThermostatOperatingState	0x23
81 
82 //General Switch
83 #define pTypeGeneralSwitch			0xF4
84 #define sSwitchTypeX10				0x00
85 #define sSwitchTypeARC				0x01
86 #define sSwitchTypeAB400D			0x02
87 #define sSwitchTypeWaveman			0x03
88 #define sSwitchTypeEMW200			0x04
89 #define sSwitchTypeIMPULS			0x05
90 #define sSwitchTypeRisingSun		0x06
91 #define sSwitchTypePhilips			0x07
92 #define sSwitchTypeEnergenie		0x08
93 #define sSwitchTypeEnergenie5		0x09
94 #define sSwitchTypeGDR2				0x0A
95 #define sSwitchTypeAC				0x0B
96 #define sSwitchTypeHEU				0x0C
97 #define sSwitchTypeANSLUT			0x0D
98 #define sSwitchTypeKambrook			0x0E
99 #define sSwitchTypeKoppla			0x0F
100 #define sSwitchTypePT2262			0x10
101 #define sSwitchTypeLightwaveRF		0x11
102 #define sSwitchTypeEMW100			0x12
103 #define sSwitchTypeBBSB				0x13
104 #define sSwitchTypeMDREMOTE			0x14
105 #define sSwitchTypeRSL				0x15
106 #define sSwitchTypeLivolo			0x16
107 #define sSwitchTypeTRC02			0x17
108 #define sSwitchTypeAoke				0x18
109 #define sSwitchTypeTRC02_2			0x19
110 #define sSwitchTypeEurodomest		0x1A
111 #define sSwitchTypeLivoloAppliance	0x1B
112 #define sSwitchTypeBlyss			0x1C
113 #define sSwitchTypeByronSX			0x1D
114 #define sSwitchTypeByronMP001		0x1E
115 #define sSwitchTypeSelectPlus		0x1F
116 #define sSwitchTypeSelectPlus3		0x20
117 #define sSwitchTypeFA20				0x21
118 #define sSwitchTypeChuango			0x22
119 #define sSwitchTypePlieger			0x23
120 #define sSwitchTypeSilvercrest		0x24
121 #define sSwitchTypeMertik			0x25
122 #define sSwitchTypeHomeConfort		0x26
123 #define sSwitchTypePowerfix			0x27
124 #define sSwitchTypeTriState			0x28
125 #define sSwitchTypeDeltronic		0x29
126 #define sSwitchTypeFA500			0x30
127 #define sSwitchTypeHT12E			0x31
128 #define sSwitchTypeEV1527			0x32
129 #define sSwitchTypeElmes			0x33
130 #define sSwitchTypeAster			0x34
131 #define sSwitchTypeSartano			0x35
132 #define sSwitchTypeEurope			0x36
133 #define sSwitchTypeAvidsen			0x37
134 #define sSwitchTypeBofu				0x38
135 #define sSwitchTypeBrel				0x39
136 #define sSwitchTypeRTS   			0x3a
137 #define sSwitchTypeElroDB			0x3b
138 #define sSwitchTypeDooya			0x3c
139 #define sSwitchTypeUnitec			0x3d
140 #define sSwitchTypeSelector			0x3e
141 #define sSwitchTypeMaclean			0x3f
142 #define sSwitchTypeR546				0x40
143 #define sSwitchTypeDiya				0x41
144 #define sSwitchTypeX10secu			0x42
145 #define sSwitchTypeAtlantic			0x43
146 #define sSwitchTypeSilvercrestDB	0x44
147 #define sSwitchTypeMedionDB			0x45
148 #define sSwitchTypeVMC				0x46
149 #define sSwitchTypeKeeloq			0x47
150 #define sSwitchCustomSwitch			0x48
151 #define sSwitchGeneralSwitch		0x49
152 #define sSwitchTypeKoch				0x4a
153 #define sSwitchTypeKingpin			0x4b
154 #define sSwitchTypeFunkbus			0x4c
155 #define sSwitchTypeNice				0x4d
156 #define sSwitchTypeForest			0x4e
157 #define sSwitchBlindsT1				0x4f
158 #define sSwitchMC145026				0x50
159 #define sSwitchLobeco				0x51
160 #define sSwitchFriedland			0x52
161 #define sSwitchBFT					0x53
162 #define sSwitchNovatys				0x54
163 #define sSwitchHalemeier			0x55
164 #define sSwitchGaposa				0x56
165 #define sSwitchMiLightv1			0x57
166 #define sSwitchMiLightv2			0x58
167 #define sSwitchHT6P20				0x59
168 #define sSwitchTypeDoitrand			0x5a
169 #define sSwitchTypeWarema			0x5b
170 #define sSwitchTypeAnsluta			0x5c
171 #define sSwitchTypeLivcol			0x5d
172 #define sSwitchTypeBosch			0x5e
173 #define sSwitchTypeNingbo			0x5f
174 #define sSwitchTypeDitec			0x60
175 #define sSwitchTypeSteffen			0x61
176 #define sSwitchTypeAlectoSA			0x62
177 #define sSwitchTypeGPIOset			0x63
178 #define sSwitchLightT1				0x64
179 #define sSwitchTypeKonigSec			0x65
180 #define sSwitchTypeRM174RF			0x66
181 #define sSwitchTypeLiwin			0x67
182 #define sSwitchAuxiliaryT1			0x68
183 #define sSwitchBlindsT2				0x69
184 #define sSwitchLightT2				0x70
185 #define sSwitchContactT1			0x71
186 #define sSwitchTypeYW_Secu			0x6a
187 #define sSwitchTypeMertik_GV60		0x6b
188 #define sSwitchTypeNingbo64			0x6c
189 #define sSwitchTypeX2D				0x6d
190 #define sSwitchTypeHRCMotor			0x6e
191 #define sSwitchTypeVelleman			0x6f
192 #define sSwitchTypeRFCustom			0x72
193 #define sSwitchTypeYW_Sensor		0x73
194 #define sSwitchTypeLegrandcad		0x74
195 #define sSwitchTypeSysfsGpio		0x75
196 #define sSwitchTypeHager			0x76
197 #define sSwitchTypeFaber			0x77
198 #define sSwitchTypeDrayton			0x78
199 #define sSwitchTypeV2Phoenix		0x79
200 
201 //Switch commands
202 #define gswitch_sOff				0x00
203 #define gswitch_sOn					0x01
204 #define gswitch_sSetLevel			0x02
205 #define gswitch_sGroupOff			0x03
206 #define gswitch_sGroupOn			0x04
207 #define gswitch_sSetGroupLevel		0x05
208 #define gswitch_sDim				0x06
209 #define gswitch_sBright				0x07
210 #define gswitch_sSound0				0x08
211 #define gswitch_sSound1				0x09
212 #define gswitch_sSound2				0x0A
213 #define gswitch_sSound3				0x0B
214 #define gswitch_sSound4				0x0C
215 #define gswitch_sSound5				0x0D
216 #define gswitch_sSound6				0x0E
217 #define gswitch_sSound7				0x0F
218 #define gswitch_sSound8				0x10
219 #define gswitch_sStop				0x11
220 #define gswitch_sProgram			0x12
221 #define gswitch_sPause				0x13
222 #define gswitch_sPlay				0x14
223 #define gswitch_sSetVolume			0x15
224 #define gswitch_sPlayPlaylist		0x16
225 #define gswitch_sPlayFavorites		0x17
226 #define gswitch_sExecute			0x18
227 #define gswitch_sColor				0x19
228 #define gswitch_sDiscop				0x1a
229 #define gswitch_sDiscom				0x1b
230 
231 //--------------
232 
233 #define pTypeLux		0xF6
234 #define sTypeLux		0x01
235 
236 #define pTypeTEMP_BARO	0xF7
237 #define sTypeBMP085		0x01
238 
239 #define pTypeUsage		0xF8
240 #define sTypeElectric	0x01
241 
242 #define pTypeAirQuality	0xF9
243 #define sTypeVoltcraft	0x01
244 
245 #define pTypeP1Power	0xFA
246 #define sTypeP1Power	0x01
247 #define mModeP1Norm		0x00
248 #define mModeP1Double	0x01
249 
250 #define pTypeP1Gas		0xFB
251 #define sTypeP1Gas		0x02
252 
253 #define pTypeYouLess	0xFC
254 #define sTypeYouLess	0x01
255 
256 #define pTypeRego6XXTemp    0xFD
257 #define sTypeRego6XXTemp    0x01
258 
259 #define pTypeRego6XXValue    0xFE
260 #define sTypeRego6XXStatus   0x02
261 #define sTypeRego6XXCounter  0x03
262 
263 //RFY2 (protocol v2)
264 #define sTypeRFY2			0xFE
265 
266 //types for evohome
267 #define pTypeEvohome 0x45
268 #define sTypeEvohome 0x00 //Controller
269 
270 #define pTypeEvohomeZone 0x46 //Seems easier to define a new type here
271 #define sTypeEvohomeZone 0x00 //Actual temp zone
272 
273 #define pTypeEvohomeWater 0x47 //Seems easier to define a new type here
274 #define sTypeEvohomeWater 0x00 //Hot water (Ideally this would just be a zone but for whatever reason evohome treats this differently)
275 
276 #define pTypeEvohomeRelay 0x44 //Relay
277 #define sTypeEvohomeRelay 0x00
278 
279 //#define sTypeEvohomeOutside 0x30 //If connected
280 //#define sTypeEvohomeStatus 0x40 //Not sure if we can do this in 1 sensor would be for things like zone valve status, boiler relay status (maybe OT values too) and comms errors (maybe seperature sensor or switch for each is easiest)
281 
282 typedef struct _tThermostat {
283 	uint8_t len;
284 	uint8_t type;
285 	uint8_t subtype;
286 	uint8_t	id1;
287 	uint8_t	id2;
288 	uint8_t	id3;
289 	uint8_t	id4;
290 	uint8_t dunit;
291 	uint8_t battery_level;
292 	float temp;
293 	float temp1;
294 	float temp2;
295 	float temp3;
296 	uint8_t utemp1;
297 	uint8_t utemp2;
298 	uint8_t utemp3;
299 
300 	template <class Archive>
serialize_tThermostat301 	void serialize(Archive & ar)
302 	{
303 		ar & cereal::make_nvp("len", len);
304 		ar & cereal::make_nvp("type", type);
305 		ar & cereal::make_nvp("subtype", subtype);
306 		ar & cereal::make_nvp("id1", id1);
307 		ar & cereal::make_nvp("id2", id2);
308 		ar & cereal::make_nvp("id3", id3);
309 		ar & cereal::make_nvp("id4", id4);
310 		ar & cereal::make_nvp("dunit", dunit);
311 		ar & cereal::make_nvp("battery_level", battery_level);
312 		ar & cereal::make_nvp("temp", temp);
313 		ar & cereal::make_nvp("temp1", temp1);
314 		ar & cereal::make_nvp("temp2", temp2);
315 		ar & cereal::make_nvp("temp3", temp3);
316 		ar & cereal::make_nvp("utemp1", utemp1);
317 		ar & cereal::make_nvp("utemp2", utemp2);
318 		ar & cereal::make_nvp("utemp3", utemp3);
319 	}
320 
_tThermostat_tThermostat321 	_tThermostat()
322 	{
323 		len = sizeof(_tThermostat) - 1;
324 		type = pTypeThermostat;
325 		subtype = sTypeThermTemperature;
326 		battery_level = 255;
327 		id1 = 1;
328 		id2 = 0;
329 		id3 = 0;
330 		id4 = 0;
331 		dunit = 0;
332 		temp = 0;
333 		temp1 = 0;
334 		temp2 = 0;
335 		temp3 = 0;
336 		utemp1 = 0;
337 		utemp2 = 0;
338 		utemp3 = 0;
339 	}
340 } tThermostat;
341 
342 typedef struct _tTempBaro {
343 	uint8_t len;
344 	uint8_t type;
345 	uint8_t subtype;
346 	uint8_t	id1;
347 	float temp;
348 	float baro;
349 	float altitude;
350 	uint8_t forecast;
351 
352 	template <class Archive>
serialize_tTempBaro353 	void serialize(Archive & ar)
354 	{
355 		ar & cereal::make_nvp("len", len);
356 		ar & cereal::make_nvp("type", type);
357 		ar & cereal::make_nvp("subtype", subtype);
358 		ar & cereal::make_nvp("id1", id1);
359 		ar & cereal::make_nvp("temp", temp);
360 		ar & cereal::make_nvp("baro", baro);
361 		ar & cereal::make_nvp("altitude", altitude);
362 		ar & cereal::make_nvp("forecast", forecast);
363 	}
364 
_tTempBaro_tTempBaro365 	_tTempBaro()
366 	{
367 		len = sizeof(_tTempBaro) - 1;
368 		type = pTypeTEMP_BARO;
369 		subtype = sTypeBMP085;
370 		id1 = 1;
371 		temp = 0;
372 		baro = 0;
373 		altitude = 0;
374 		forecast = 0;
375 	}
376 } _tTempBaro;
377 
378 typedef struct _tAirQualityMeter {
379 	uint8_t len;
380 	uint8_t type;
381 	uint8_t subtype;
382 	uint8_t	id1;
383 	uint8_t	id2;
384 	int32_t airquality;
385 
386 	template <class Archive>
serialize_tAirQualityMeter387 	void serialize(Archive & ar)
388 	{
389 		ar & cereal::make_nvp("len", len);
390 		ar & cereal::make_nvp("type", type);
391 		ar & cereal::make_nvp("subtype", subtype);
392 		ar & cereal::make_nvp("id1", id1);
393 		ar & cereal::make_nvp("id2", id2);
394 		ar & cereal::make_nvp("airquality", airquality);
395 	}
396 
_tAirQualityMeter_tAirQualityMeter397 	_tAirQualityMeter()
398 	{
399 		len = sizeof(_tAirQualityMeter) - 1;
400 		type = pTypeAirQuality;
401 		subtype = sTypeVoltcraft;
402 		id1 = 0;
403 		id2 = 1;
404 		airquality = 0;
405 	}
406 } AirQualityMeter;
407 
408 typedef struct _tUsageMeter {
409 	uint8_t len;
410 	uint8_t type;
411 	uint8_t subtype;
412 	uint8_t	id1;
413 	uint8_t	id2;
414 	uint8_t	id3;
415 	uint8_t	id4;
416 	uint8_t dunit;
417 	float fusage;
418 
419 	template <class Archive>
serialize_tUsageMeter420 	void serialize(Archive & ar)
421 	{
422 		ar & cereal::make_nvp("len", len);
423 		ar & cereal::make_nvp("type", type);
424 		ar & cereal::make_nvp("subtype", subtype);
425 		ar & cereal::make_nvp("id1", id1);
426 		ar & cereal::make_nvp("id2", id2);
427 		ar & cereal::make_nvp("id3", id3);
428 		ar & cereal::make_nvp("id4", id4);
429 		ar & cereal::make_nvp("dunit", dunit);
430 		ar & cereal::make_nvp("fusage", fusage);
431 	}
432 
_tUsageMeter_tUsageMeter433 	_tUsageMeter()
434 	{
435 		len = sizeof(_tUsageMeter) - 1;
436 		type = pTypeUsage;
437 		subtype = sTypeElectric;
438 		id1 = 0;
439 		id2 = 0;
440 		id3 = 0;
441 		id4 = 0;
442 		dunit = 0;
443 		fusage = 0;
444 	}
445 } UsageMeter;
446 
447 typedef struct _tLightMeter {
448 	uint8_t len;
449 	uint8_t type;
450 	uint8_t subtype;
451 	uint8_t	id1;
452 	uint8_t	id2;
453 	uint8_t	id3;
454 	uint8_t	id4;
455 	uint8_t dunit;
456 	uint8_t battery_level;
457 	float fLux;
458 
459 	template <class Archive>
serialize_tLightMeter460 	void serialize(Archive & ar)
461 	{
462 		ar & cereal::make_nvp("len", len);
463 		ar & cereal::make_nvp("type", type);
464 		ar & cereal::make_nvp("subtype", subtype);
465 		ar & cereal::make_nvp("id1", id1);
466 		ar & cereal::make_nvp("id2", id2);
467 		ar & cereal::make_nvp("id3", id3);
468 		ar & cereal::make_nvp("id4", id4);
469 		ar & cereal::make_nvp("dunit", dunit);
470 		ar & cereal::make_nvp("battery_level", battery_level);
471 		ar & cereal::make_nvp("fLux", fLux);
472 	}
473 
_tLightMeter_tLightMeter474 	_tLightMeter()
475 	{
476 		len = sizeof(_tLightMeter) - 1;
477 		type = pTypeLux;
478 		subtype = sTypeLux;
479 		id1 = 0;
480 		id2 = 0;
481 		id3 = 0;
482 		id4 = 0;
483 		battery_level = 255;
484 		dunit = 0;
485 		fLux = 0;
486 	}
487 } LightMeter;
488 
489 typedef struct _tGeneralDevice {
490 	uint8_t len;
491 	uint8_t type;
492 	uint8_t subtype;
493 	uint8_t id;
494 	float floatval1;
495 	float floatval2;
496 	int32_t intval1;
497 	int32_t intval2;
498 	char text[64];
499 
500 	template <class Archive>
serialize_tGeneralDevice501 	void serialize(Archive & ar)
502 	{
503 		ar & cereal::make_nvp("len", len);
504 		ar & cereal::make_nvp("type", type);
505 		ar & cereal::make_nvp("subtype", subtype);
506 		ar & cereal::make_nvp("id", id);
507 		ar & cereal::make_nvp("floatval1", floatval1);
508 		ar & cereal::make_nvp("floatval2", floatval2);
509 		ar & cereal::make_nvp("intval1", intval1);
510 		ar & cereal::make_nvp("intval2", intval2);
511 		ar & cereal::make_nvp("text", text);
512 	}
513 
_tGeneralDevice_tGeneralDevice514 	_tGeneralDevice()
515 	{
516 		len = sizeof(_tGeneralDevice) - 1;
517 		type = pTypeGeneral;
518 		subtype = sTypeVisibility;
519 		id = 0;
520 		floatval1 = 0;
521 		floatval2 = 0;
522 		intval1 = 0;
523 		intval2 = 0;
524 		text[0] = 0;
525 	}
526 } GeneralDevice;
527 
528 typedef struct _tGeneralSwitch {
529 	uint8_t len;
530 	uint8_t type;
531 	uint8_t subtype;
532 	int32_t id;
533 	int32_t unitcode;
534 	uint8_t cmnd;
535 	uint8_t level;
536 	uint8_t rssi;
537 	uint8_t battery_level;
538 	uint8_t seqnbr;
539 	int32_t reserved_int;
540 	float	reserved_float;
541 
542 	template <class Archive>
serialize_tGeneralSwitch543 	void serialize(Archive & ar)
544 	{
545 		ar & cereal::make_nvp("len", len);
546 		ar & cereal::make_nvp("type", type);
547 		ar & cereal::make_nvp("subtype", subtype);
548 		ar & cereal::make_nvp("id", id);
549 		ar & cereal::make_nvp("unitcode", unitcode);
550 		ar & cereal::make_nvp("cmnd", cmnd);
551 		ar & cereal::make_nvp("level", level);
552 		ar & cereal::make_nvp("rssi", rssi);
553 		ar & cereal::make_nvp("battery_level", battery_level);
554 		ar & cereal::make_nvp("seqnbr", seqnbr);
555 		ar & cereal::make_nvp("reserved_int", reserved_int);
556 		ar & cereal::make_nvp("reserved_float", reserved_float);
557 	}
558 
_tGeneralSwitch_tGeneralSwitch559 	_tGeneralSwitch()
560 	{
561 		len = sizeof(_tGeneralSwitch) - 1;
562 		type = pTypeGeneralSwitch;
563 		subtype = sSwitchTypeAC;
564 		id = 1;
565 		unitcode = 1;
566 		seqnbr = 0;
567 		reserved_int = 0;
568 		reserved_float = 0;
569 		level = 0;
570 		battery_level = 255;
571 		rssi = 12;
572 		cmnd = 0;
573 	}
574 } GeneralSwitch;
575 
576 typedef struct _tP1Power {
577 	uint8_t len = sizeof(_tP1Power) - 1;
578 	uint8_t type = pTypeP1Power;
579 	uint8_t subtype = sTypeP1Power;
580 	uint32_t powerusage1 = 0;
581 	uint32_t powerusage2 = 0;
582 	uint32_t powerdeliv1 = 0;
583 	uint32_t powerdeliv2 = 0;
584 	uint32_t usagecurrent = 0;
585 	uint32_t delivcurrent = 0;
586 	int32_t ID = 1;
587 
588 	template <class Archive>
serialize_tP1Power589 	void serialize(Archive & ar)
590 	{
591 		ar & cereal::make_nvp("len", len);
592 		ar & cereal::make_nvp("type", type);
593 		ar & cereal::make_nvp("subtype", subtype);
594 		ar & cereal::make_nvp("powerusage1", powerusage1);
595 		ar & cereal::make_nvp("powerusage2", powerusage2);
596 		ar & cereal::make_nvp("powerdeliv1", powerdeliv1);
597 		ar & cereal::make_nvp("powerdeliv2", powerdeliv2);
598 		ar & cereal::make_nvp("usagecurrent", usagecurrent);
599 		ar & cereal::make_nvp("delivcurrent", delivcurrent);
600 		ar & cereal::make_nvp("ID", ID);
601 	}
602 } P1Power;
603 
604 typedef struct _tP1Gas {
605 	uint8_t len = sizeof(_tP1Gas) - 1;
606 	uint8_t type = pTypeP1Gas;
607 	uint8_t subtype = sTypeP1Gas;
608 	uint32_t gasusage = 0;
609 	int32_t ID = 1;
610 
611 	template <class Archive>
serialize_tP1Gas612 	void serialize(Archive & ar)
613 	{
614 		ar & cereal::make_nvp("len", len);
615 		ar & cereal::make_nvp("type", type);
616 		ar & cereal::make_nvp("subtype", subtype);
617 		ar & cereal::make_nvp("gasusage", gasusage);
618 		ar & cereal::make_nvp("ID", ID);
619 	}
620 } P1Gas;
621 
622 typedef struct _tEVOHOME1 {
623 	uint8_t len;
624 	uint8_t type;
625 	uint8_t subtype;
626 	uint8_t	id1;
627 	uint8_t	id2;
628 	uint8_t	id3;
629 	uint8_t	status;
630 	uint8_t	mode;
631 	uint16_t year;
632 	uint8_t	month;
633 	uint8_t	day;
634 	uint8_t	hrs;
635 	uint8_t	mins;
636 	uint8_t	action;
637 
638 	template <class Archive>
serialize_tEVOHOME1639 	void serialize(Archive & ar)
640 	{
641 		ar & cereal::make_nvp("len", len);
642 		ar & cereal::make_nvp("type", type);
643 		ar & cereal::make_nvp("subtype", subtype);
644 		ar & cereal::make_nvp("id1", id1);
645 		ar & cereal::make_nvp("id2", id2);
646 		ar & cereal::make_nvp("id3", id3);
647 		ar & cereal::make_nvp("status", status);
648 		ar & cereal::make_nvp("mode", mode);
649 		ar & cereal::make_nvp("year", year);
650 		ar & cereal::make_nvp("month", month);
651 		ar & cereal::make_nvp("day", day);
652 		ar & cereal::make_nvp("hrs", hrs);
653 		ar & cereal::make_nvp("mins", mins);
654 		ar & cereal::make_nvp("action", action);
655 	}
656 } EVOHOME1;
657 
658 typedef struct _tEVOHOME2 {
659 	uint8_t len;
660 	uint8_t type;
661 	uint8_t subtype;
662 	uint8_t	id1;
663 	uint8_t	id2;
664 	uint8_t	id3;
665 	uint8_t	zone;
666 	uint8_t	updatetype;
667 	int16_t	temperature;
668 	uint8_t	mode;
669 	uint8_t	controllermode;
670 	uint16_t year;
671 	uint8_t	month;
672 	uint8_t	day;
673 	uint8_t	hrs;
674 	uint8_t	mins;
675 	uint8_t	battery_level;
676 
677 	template <class Archive>
serialize_tEVOHOME2678 	void serialize(Archive & ar)
679 	{
680 		ar & cereal::make_nvp("len", len);
681 		ar & cereal::make_nvp("type", type);
682 		ar & cereal::make_nvp("subtype", subtype);
683 		ar & cereal::make_nvp("id1", id1);
684 		ar & cereal::make_nvp("id2", id2);
685 		ar & cereal::make_nvp("id3", id3);
686 		ar & cereal::make_nvp("zone", zone);
687 		ar & cereal::make_nvp("updatetype", updatetype);
688 		ar & cereal::make_nvp("temperature", temperature);
689 		ar & cereal::make_nvp("mode", mode);
690 		ar & cereal::make_nvp("controllermode", controllermode);
691 		ar & cereal::make_nvp("year", year);
692 		ar & cereal::make_nvp("month", month);
693 		ar & cereal::make_nvp("day", day);
694 		ar & cereal::make_nvp("hrs", hrs);
695 		ar & cereal::make_nvp("mins", mins);
696 		ar & cereal::make_nvp("battery_level", battery_level);
697 	}
698 } EVOHOME2;
699 
700 typedef struct _tEVOHOME3 {
701 	uint8_t len;
702 	uint8_t type;
703 	uint8_t subtype;
704 	uint8_t	id1;
705 	uint8_t	id2;
706 	uint8_t	id3;
707 	uint8_t	devno;
708 	uint8_t	demand;
709 	uint8_t	updatetype;
710 	uint8_t	battery_level;
711 
712 	template <class Archive>
serialize_tEVOHOME3713 	void serialize(Archive & ar)
714 	{
715 		ar & cereal::make_nvp("len", len);
716 		ar & cereal::make_nvp("type", type);
717 		ar & cereal::make_nvp("subtype", subtype);
718 		ar & cereal::make_nvp("id1", id1);
719 		ar & cereal::make_nvp("id2", id2);
720 		ar & cereal::make_nvp("id3", id3);
721 		ar & cereal::make_nvp("devno", devno);
722 		ar & cereal::make_nvp("demand", demand);
723 		ar & cereal::make_nvp("updatetype", updatetype);
724 		ar & cereal::make_nvp("battery_level", battery_level);
725 	}
726 } EVOHOME3;
727