File: dpt_14.py

package info (click to toggle)
python-xknx 3.10.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,044 kB
  • sloc: python: 40,087; javascript: 8,556; makefile: 32; sh: 12
file content (802 lines) | stat: -rw-r--r-- 17,727 bytes parent folder | download | duplicates (2)
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
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
"""
Implementation of KNX 4 byte Float-values.

They correspond to the the following KDN DPT 14 class.
"""

from __future__ import annotations

from math import ceil, log10
import struct
from typing import cast

from xknx.exceptions import ConversionError

from .dpt import DPTNumeric
from .payload import DPTArray, DPTBinary


class DPT4ByteFloat(DPTNumeric):
    """
    Abstraction for KNX 4 Octet Floating Point Numbers, with a maximum usable range as specified in IEEE 754.

    The largest positive finite float literal is 3.40282347e+38f.
    The smallest positive finite non-zero literal of type float is 1.40239846e-45f.
    The negative minimum finite float literal is -3.40282347e+38f.
    No value range are defined for DPTs 14.000-079.

    DPT 14.***
    """

    dpt_main_number = 14
    dpt_sub_number: int | None = None
    value_type = "4byte_float"
    payload_length = 4

    value_min = float("-inf")
    value_max = float("inf")
    resolution = 0.0000001

    @classmethod
    def from_knx(cls, payload: DPTArray | DPTBinary) -> float:
        """Parse/deserialize from KNX/IP raw data (big endian)."""
        raw = cls.validate_payload(payload)
        try:
            raw_float = cast(float, struct.unpack(">f", bytes(raw))[0])
        except struct.error as err:
            raise ConversionError(f"Could not parse {cls.dpt_name()}", raw=raw) from err
        try:
            # round to 7 digit precision independent of exponent - same value as ETS 5.7 group monitor
            return round(raw_float, 7 - ceil(log10(abs(raw_float))))
        except (ValueError, OverflowError):
            # account for 0 and special values
            # ValueError: log10(0.0); ceil(float('nan'))
            # OverflowError: ceil(float('inf'))
            return raw_float

    @classmethod
    def to_knx(cls, value: float) -> DPTArray:
        """Serialize to KNX/IP raw data."""
        try:
            knx_value = float(value)
            return DPTArray(struct.pack(">f", knx_value))
        except (ValueError, struct.error) as err:
            raise ConversionError(
                f"Could not serialize {cls.dpt_name()}", value=value
            ) from err


class DPTAcceleration(DPT4ByteFloat):
    """DPT 14.000 DPT_Value_Acceleration (ms-2)."""

    dpt_main_number = 14
    dpt_sub_number = 0
    value_type = "acceleration"
    unit = "m/s²"


class DPTAccelerationAngular(DPT4ByteFloat):
    """DPT 14.001 DPT_Value_Acceleration_Angular (rad s-2)."""

    dpt_main_number = 14
    dpt_sub_number = 1
    value_type = "acceleration_angular"
    unit = "rad/s²"


class DPTActivationEnergy(DPT4ByteFloat):
    """DPT 14.002 DPT_Value_Activation_Energy (J mol-1)."""

    dpt_main_number = 14
    dpt_sub_number = 2
    value_type = "activation_energy"
    unit = "J/mol"


class DPTActivity(DPT4ByteFloat):
    """DPT 14.003 DPT_Value_Activity (s-1)."""

    dpt_main_number = 14
    dpt_sub_number = 3
    value_type = "activity"
    unit = "s⁻¹"


class DPTMol(DPT4ByteFloat):
    """DPT 14.004 DPT_Value_Mol (mol)."""

    dpt_main_number = 14
    dpt_sub_number = 4
    value_type = "mol"
    unit = "mol"


class DPTAmplitude(DPT4ByteFloat):
    """DPT 14.005 DPT_Value_Amplitude."""

    dpt_main_number = 14
    dpt_sub_number = 5
    value_type = "amplitude"


class DPTAngleRad(DPT4ByteFloat):
    """DPT 14.006 DPT_Value_AngleRad (rad)."""

    dpt_main_number = 14
    dpt_sub_number = 6
    value_type = "angle_rad"
    unit = "rad"


class DPTAngleDeg(DPT4ByteFloat):
    """DPT 14.007 DPT_Value_AngleDeg ((degree))."""

    dpt_main_number = 14
    dpt_sub_number = 7
    value_type = "angle_deg"
    unit = "°"


class DPTAngularMomentum(DPT4ByteFloat):
    """DPT 14.008 DPT_Value_Angular_Momentum (J s)."""

    dpt_main_number = 14
    dpt_sub_number = 8
    value_type = "angular_momentum"
    unit = "J s"


class DPTAngularVelocity(DPT4ByteFloat):
    """DPT 14.009 DPT_Value_Angular_Velocity."""

    dpt_main_number = 14
    dpt_sub_number = 9
    value_type = "angular_velocity"
    unit = "rad/s"


class DPTArea(DPT4ByteFloat):
    """DPT 14.010 DPT_Value_Area."""

    dpt_main_number = 14
    dpt_sub_number = 10
    value_type = "area"
    unit = "m²"


class DPTCapacitance(DPT4ByteFloat):
    """DPT 14.011 DPT_Value_Capacitance."""

    dpt_main_number = 14
    dpt_sub_number = 11
    value_type = "capacitance"
    unit = "F"


class DPTChargeDensitySurface(DPT4ByteFloat):
    """DPT 14.012 DPT_Value_Charge_DensitySurface."""

    dpt_main_number = 14
    dpt_sub_number = 12
    value_type = "charge_density_surface"
    unit = "C/m²"


class DPTChargeDensityVolume(DPT4ByteFloat):
    """DPT 14.013 DPT_Value_Charge_DensityVolume."""

    dpt_main_number = 14
    dpt_sub_number = 13
    value_type = "charge_density_volume"
    unit = "C/m³"


class DPTCompressibility(DPT4ByteFloat):
    """DPT 14.014 DPT_Value_Compressibility."""

    dpt_main_number = 14
    dpt_sub_number = 14
    value_type = "compressibility"
    unit = "m²/N"


class DPTConductance(DPT4ByteFloat):
    """DPT 14.015 DPT_Value_Conductance."""

    dpt_main_number = 14
    dpt_sub_number = 15
    value_type = "conductance"
    unit = "S"


class DPTElectricalConductivity(DPT4ByteFloat):
    """DPT 14.016 DPT_Value_Electrical_Conductivity."""

    dpt_main_number = 14
    dpt_sub_number = 16
    value_type = "electrical_conductivity"
    unit = "S/m"


class DPTDensity(DPT4ByteFloat):
    """DPT 14.017 DPT_Value_Density."""

    dpt_main_number = 14
    dpt_sub_number = 17
    value_type = "density"
    unit = "kg/m³"


class DPTElectricCharge(DPT4ByteFloat):
    """DPT 14.018 DPT_Value_Electric_Charge."""

    dpt_main_number = 14
    dpt_sub_number = 18
    value_type = "electric_charge"
    unit = "C"


class DPTElectricCurrent(DPT4ByteFloat):
    """DPT 14.019 DPT_Value_Electric_Current."""

    dpt_main_number = 14
    dpt_sub_number = 19
    value_type = "electric_current"
    unit = "A"
    ha_device_class = "current"


class DPTElectricCurrentDensity(DPT4ByteFloat):
    """DPT 14.020 DPT_Value_Electric_CurrentDensity."""

    dpt_main_number = 14
    dpt_sub_number = 20
    value_type = "electric_current_density"
    unit = "A/m²"


class DPTElectricDipoleMoment(DPT4ByteFloat):
    """DPT 14.021 DPT_Value_Electric_DipoleMoment."""

    dpt_main_number = 14
    dpt_sub_number = 21
    value_type = "electric_dipole_moment"
    unit = "C m"


class DPTElectricDisplacement(DPT4ByteFloat):
    """DPT 14.022 DPT_Value_Electric_Displacement."""

    dpt_main_number = 14
    dpt_sub_number = 22
    value_type = "electric_displacement"
    unit = "C/m²"


class DPTElectricFieldStrength(DPT4ByteFloat):
    """DPT 14.023 DPT_Value_Electric_FieldStrength."""

    dpt_main_number = 14
    dpt_sub_number = 23
    value_type = "electric_field_strength"
    unit = "V/m"


class DPTElectricFlux(DPT4ByteFloat):
    """DPT 14.024 DPT_Value_Electric_Flux."""

    dpt_main_number = 14
    dpt_sub_number = 24
    value_type = "electric_flux"
    unit = "c"


class DPTElectricFluxDensity(DPT4ByteFloat):
    """DPT 14.025 DPT_Value_Electric_FluxDensity."""

    dpt_main_number = 14
    dpt_sub_number = 25
    value_type = "electric_flux_density"
    unit = "C/m²"


class DPTElectricPolarization(DPT4ByteFloat):
    """DPT 14.026 DPT_Value_Electric_Polarization."""

    dpt_main_number = 14
    dpt_sub_number = 26
    value_type = "electric_polarization"
    unit = "C/m²"


class DPTElectricPotential(DPT4ByteFloat):
    """DPT 14.027 DPT_Value_Electric_Potential."""

    dpt_main_number = 14
    dpt_sub_number = 27
    value_type = "electric_potential"
    unit = "V"


class DPTElectricPotentialDifference(DPT4ByteFloat):
    """DPT 14.028 DPT_Value_Electric_PotentialDifference."""

    dpt_main_number = 14
    dpt_sub_number = 28
    value_type = "electric_potential_difference"
    unit = "V"


class DPTElectromagneticMoment(DPT4ByteFloat):
    """DPT 14.029 DPT_Value_ElectromagneticMoment."""

    dpt_main_number = 14
    dpt_sub_number = 29
    value_type = "electromagnetic_moment"
    unit = "A m²"


class DPTElectromotiveForce(DPT4ByteFloat):
    """DPT 14.030 DPT_Value_Electromotive_Force."""

    dpt_main_number = 14
    dpt_sub_number = 30
    value_type = "electromotive_force"
    unit = "V"


class DPTEnergy(DPT4ByteFloat):
    """DPT 14.031 DPT_Value_Energy."""

    dpt_main_number = 14
    dpt_sub_number = 31
    value_type = "energy"
    unit = "J"


class DPTForce(DPT4ByteFloat):
    """DPT 14.032 DPT_Value_Force."""

    dpt_main_number = 14
    dpt_sub_number = 32
    value_type = "force"
    unit = "N"


class DPTFrequency(DPT4ByteFloat):
    """DPT 14.033 DPT_Value_Frequency."""

    dpt_main_number = 14
    dpt_sub_number = 33
    value_type = "frequency"
    unit = "Hz"
    ha_device_class = "frequency"


class DPTAngularFrequency(DPT4ByteFloat):
    """DPT 14.034 DPT_Value_Angular_Frequency."""

    dpt_main_number = 14
    dpt_sub_number = 34
    value_type = "angular_frequency"
    unit = "rad/s"


class DPTHeatCapacity(DPT4ByteFloat):
    """DPT 14.035 DPT_Value_Heat_Capacity."""

    dpt_main_number = 14
    dpt_sub_number = 35
    value_type = "heatcapacity"
    unit = "J/K"


class DPTHeatFlowRate(DPT4ByteFloat):
    """DPT 14.036 DPT_Value_Heat_Flow_Rate."""

    dpt_main_number = 14
    dpt_sub_number = 36
    value_type = "heatflowrate"
    unit = "W"


class DPTHeatQuantity(DPT4ByteFloat):
    """DPT 14.037 DPT_Value_Heat_Quantity."""

    dpt_main_number = 14
    dpt_sub_number = 37
    value_type = "heat_quantity"
    unit = "J"


class DPTImpedance(DPT4ByteFloat):
    """DPT 14.038 DPT_Value_Impedance."""

    dpt_main_number = 14
    dpt_sub_number = 38
    value_type = "impedance"
    unit = "Ω"


class DPTLength(DPT4ByteFloat):
    """DPT 14.039 DPT_Value_Length."""

    dpt_main_number = 14
    dpt_sub_number = 39
    value_type = "length"
    unit = "m"
    ha_device_class = "distance"


class DPTLightQuantity(DPT4ByteFloat):
    """DPT 14.040 DPT_Value_Light_Quantity."""

    dpt_main_number = 14
    dpt_sub_number = 40
    value_type = "light_quantity"
    unit = "lm s"


class DPTLuminance(DPT4ByteFloat):
    """DPT 14.041 DPT_Value_Luminance."""

    dpt_main_number = 14
    dpt_sub_number = 41
    value_type = "luminance"
    unit = "cd/m²"


class DPTLuminousFlux(DPT4ByteFloat):
    """DPT 14.042 DPT_Value_Heat_Flow_Rate."""

    dpt_main_number = 14
    dpt_sub_number = 42
    value_type = "luminous_flux"
    unit = "lm"


class DPTLuminousIntensity(DPT4ByteFloat):
    """DPT 14.043 DPT_Value_Luminous_Intensity."""

    dpt_main_number = 14
    dpt_sub_number = 43
    value_type = "luminous_intensity"
    unit = "cd"


class DPTMagneticFieldStrength(DPT4ByteFloat):
    """DPT 14.044 DPT_Value_Magnetic_FieldStrength."""

    dpt_main_number = 14
    dpt_sub_number = 44
    value_type = "magnetic_field_strength"
    unit = "A/m"


class DPTMagneticFlux(DPT4ByteFloat):
    """DPT 14.045 DPT_Value_Magnetic_Flux."""

    dpt_main_number = 14
    dpt_sub_number = 45
    value_type = "magnetic_flux"
    unit = "Wb"


class DPTMagneticFluxDensity(DPT4ByteFloat):
    """DPT 14.046 DPT_Value_Magnetic_FluxDensity."""

    dpt_main_number = 14
    dpt_sub_number = 46
    value_type = "magnetic_flux_density"
    unit = "T"


class DPTMagneticMoment(DPT4ByteFloat):
    """DPT 14.047 DPT_Value_Magnetic_Moment."""

    dpt_main_number = 14
    dpt_sub_number = 47
    value_type = "magnetic_moment"
    unit = "A m²"


class DPTMagneticPolarization(DPT4ByteFloat):
    """DPT 14.048 DPT_Value_Magnetic_Polarization."""

    dpt_main_number = 14
    dpt_sub_number = 48
    value_type = "magnetic_polarization"
    unit = "T"


class DPTMagnetization(DPT4ByteFloat):
    """DPT 14.049 DPT_Value_Magnetization."""

    dpt_main_number = 14
    dpt_sub_number = 49
    value_type = "magnetization"
    unit = "A/m"


class DPTMagnetomotiveForce(DPT4ByteFloat):
    """DPT 14.050 DPT_Value_MagnetomotiveForce."""

    dpt_main_number = 14
    dpt_sub_number = 50
    value_type = "magnetomotive_force"
    unit = "A"


class DPTMass(DPT4ByteFloat):
    """DPT 14.051 DPT_Value_Mass."""

    dpt_main_number = 14
    dpt_sub_number = 51
    value_type = "mass"
    unit = "kg"
    ha_device_class = "weight"


class DPTMassFlux(DPT4ByteFloat):
    """DPT 14.052 DPT_Value_MassFlux."""

    dpt_main_number = 14
    dpt_sub_number = 52
    value_type = "mass_flux"
    unit = "kg/s"


class DPTMomentum(DPT4ByteFloat):
    """DPT 14.053 DPT_Value_Momentum."""

    dpt_main_number = 14
    dpt_sub_number = 53
    value_type = "momentum"
    unit = "N/s"


class DPTPhaseAngleRad(DPT4ByteFloat):
    """DPT 14.054 DPT_Value_Phase_Angle, Radiant."""

    dpt_main_number = 14
    dpt_sub_number = 54
    value_type = "phaseanglerad"
    unit = "rad"


class DPTPhaseAngleDeg(DPT4ByteFloat):
    """DPT 14.055 DPT_Value_Phase_Angle, Degree."""

    dpt_main_number = 14
    dpt_sub_number = 55
    value_type = "phaseangledeg"
    unit = "°"


class DPTPower(DPT4ByteFloat):
    """DPT 14.056 DPT_Value_Power."""

    dpt_main_number = 14
    dpt_sub_number = 56
    value_type = "power"
    unit = "W"
    ha_device_class = "power"


class DPTPowerFactor(DPT4ByteFloat):
    """DPT 14.057 DPT_Value_Power."""

    dpt_main_number = 14
    dpt_sub_number = 57
    value_type = "powerfactor"
    ha_device_class = "power_factor"


class DPTPressure(DPT4ByteFloat):
    """DPT 14.058 DPT_Value_Pressure."""

    dpt_main_number = 14
    dpt_sub_number = 58
    value_type = "pressure"
    unit = "Pa"
    ha_device_class = "pressure"


class DPTReactance(DPT4ByteFloat):
    """DPT 14.059 DPT_Value_Reactance."""

    dpt_main_number = 14
    dpt_sub_number = 59
    value_type = "reactance"
    unit = "Ω"


class DPTResistance(DPT4ByteFloat):
    """DPT 14.060 DPT_Value_Resistance."""

    dpt_main_number = 14
    dpt_sub_number = 60
    value_type = "resistance"
    unit = "Ω"


class DPTResistivity(DPT4ByteFloat):
    """DPT 14.061 DPT_Value_Resistivity."""

    dpt_main_number = 14
    dpt_sub_number = 61
    value_type = "resistivity"
    unit = "Ωm"


class DPTSelfInductance(DPT4ByteFloat):
    """DPT 14.062 DPT_Value_SelfInductance."""

    dpt_main_number = 14
    dpt_sub_number = 62
    value_type = "self_inductance"
    unit = "H"


class DPTSolidAngle(DPT4ByteFloat):
    """DPT 14.063 DPT_Value_SolidAngle."""

    dpt_main_number = 14
    dpt_sub_number = 63
    value_type = "solid_angle"
    unit = "sr"


class DPTSoundIntensity(DPT4ByteFloat):
    """DPT 14.064 DPT_Value_Sound_Intensity."""

    dpt_main_number = 14
    dpt_sub_number = 64
    value_type = "sound_intensity"
    unit = "W/m²"


class DPTSpeed(DPT4ByteFloat):
    """DPT 14.065 DPT_Value_Speed."""

    dpt_main_number = 14
    dpt_sub_number = 65
    value_type = "speed"
    unit = "m/s"
    ha_device_class = "speed"


class DPTStress(DPT4ByteFloat):
    """DPT 14.066 DPT_Value_Stress."""

    dpt_main_number = 14
    dpt_sub_number = 66
    value_type = "stress"
    unit = "Pa"


class DPTSurfaceTension(DPT4ByteFloat):
    """DPT 14.067 DPT_Value_Surface_Tension."""

    dpt_main_number = 14
    dpt_sub_number = 67
    value_type = "surface_tension"
    unit = "N/m"


class DPTCommonTemperature(DPT4ByteFloat):
    """DPT 14.068 DPT_Value_Common_Temperature."""

    dpt_main_number = 14
    dpt_sub_number = 68
    value_type = "common_temperature"
    unit = "°C"


class DPTAbsoluteTemperature(DPT4ByteFloat):
    """DPT 14.069 DPT_Value_Absolute_Temperature."""

    dpt_main_number = 14
    dpt_sub_number = 69
    value_type = "absolute_temperature"
    unit = "K"


class DPTTemperatureDifference(DPT4ByteFloat):
    """DPT 14.070 DPT_Value_TemperatureDifference."""

    dpt_main_number = 14
    dpt_sub_number = 70
    value_type = "temperature_difference"
    unit = "K"


class DPTThermalCapacity(DPT4ByteFloat):
    """DPT 14.071 DPT_Value_Thermal_Capacity."""

    dpt_main_number = 14
    dpt_sub_number = 71
    value_type = "thermal_capacity"
    unit = "J/K"


class DPTThermalConductivity(DPT4ByteFloat):
    """DPT 14.072 DPT_Value_Thermal_Conductivity."""

    dpt_main_number = 14
    dpt_sub_number = 72
    value_type = "thermal_conductivity"
    unit = "W/mK"


class DPTThermoelectricPower(DPT4ByteFloat):
    """DPT 14.073 DPT_Value_ThermoelectricPower."""

    dpt_main_number = 14
    dpt_sub_number = 73
    value_type = "thermoelectric_power"
    unit = "V/K"


class DPTTimeSeconds(DPT4ByteFloat):
    """DPT 14.074 DPT_Value_Time."""

    dpt_main_number = 14
    dpt_sub_number = 74
    value_type = "time_seconds"
    unit = "s"


class DPTTorque(DPT4ByteFloat):
    """DPT 14.075 DPT_Value_Torque."""

    dpt_main_number = 14
    dpt_sub_number = 75
    value_type = "torque"
    unit = "Nm"


class DPTVolume(DPT4ByteFloat):
    """DPT 14.076 DPT_Value_Volume."""

    dpt_main_number = 14
    dpt_sub_number = 76
    value_type = "volume"
    unit = "m³"


class DPTVolumeFlux(DPT4ByteFloat):
    """DPT 14.077 DPT_Value_Volume_Flux."""

    dpt_main_number = 14
    dpt_sub_number = 77
    value_type = "volume_flux"
    unit = "m³/s"


class DPTWeight(DPT4ByteFloat):
    """DPT 14.078 DPT_Value_Weight."""

    dpt_main_number = 14
    dpt_sub_number = 78
    value_type = "weight"
    unit = "N"


class DPTWork(DPT4ByteFloat):
    """DPT 14.079 DPT_Value_Work."""

    dpt_main_number = 14
    dpt_sub_number = 79
    value_type = "work"
    unit = "J"


class DPTApparentPower(DPT4ByteFloat):
    """DPT 14.080 DPT_Value_Apparent_Power."""

    dpt_main_number = 14
    dpt_sub_number = 80
    value_type = "apparent_power"
    unit = "VA"
    ha_device_class = "apparent_power"