74
74
in the JSON data, for example 'wind_speed_mph' instead of just 'wind_speed'.
75
75
"""
76
76
77
+ # FIXME: deprecate then eliminate the V2 acurite packets - single packet def
78
+ # can recognize anything rtl_433 spits out
79
+
77
80
from __future__ import with_statement
78
81
from calendar import timegm
79
82
try :
@@ -162,6 +165,23 @@ def confeditor_loader():
162
165
return SDRConfigurationEditor ()
163
166
164
167
168
+ # utilities for inline unit conversions. respect the None!
169
+ def to_F (v ):
170
+ if v is not None :
171
+ v = v * 1.8 + 32
172
+ return v
173
+
174
+ def to_mph (v ):
175
+ if v is not None :
176
+ v *= 0.621371
177
+ return v
178
+
179
+ def to_in (v ):
180
+ if v is not None :
181
+ v /= 25.4
182
+ return v
183
+
184
+
165
185
class AsyncReader (threading .Thread ):
166
186
167
187
def __init__ (self , fd , queue , label ):
@@ -400,30 +420,22 @@ def parse_json(obj):
400
420
pkt ['channel' ] = obj .get ('channel' )
401
421
pkt ['sequence_num' ] = Packet .get_int (obj , 'sequence_num' )
402
422
pkt ['message_type' ] = Packet .get_int (obj , 'message_type' )
403
- if 'temperature_F' in obj :
404
- pkt ['temperature' ] = Packet .get_float (obj , 'temperature_F' )
405
- if 'temperature_C' in obj :
406
- pkt ['temperature' ] = Packet .get_float (obj , 'temperature_C' )
407
- if pkt ['temperature' ] is not None :
408
- pkt ['temperature' ] = pkt ['temperature' ] * 1.8 + 32
409
423
if 'humidity' in obj :
410
424
pkt ['humidity' ] = Packet .get_float (obj , 'humidity' )
425
+ if 'temperature_F' in obj :
426
+ pkt ['temperature' ] = Packet .get_float (obj , 'temperature_F' )
427
+ elif 'temperature_C' in obj :
428
+ pkt ['temperature' ] = to_F (Packet .get_float (obj , 'temperature_C' ))
411
429
if 'wind_avg_mi_h' in obj :
412
430
pkt ['wind_speed' ] = Packet .get_float (obj , 'wind_avg_mi_h' )
413
- if 'wind_avg_km_h' in obj :
414
- pkt ['wind_speed' ] = Packet .get_float (obj , 'wind_avg_km_h' )
415
- if pkt ['wind_speed' ] is not None :
416
- # Convert to mph
417
- pkt ['wind_speed' ] *= 0.621371
431
+ elif 'wind_avg_km_h' in obj :
432
+ pkt ['wind_speed' ] = to_mph (Packet .get_float (obj , 'wind_avg_km_h' ))
418
433
if 'wind_dir_deg' in obj :
419
434
pkt ['wind_dir' ] = Packet .get_float (obj , 'wind_dir_deg' )
420
435
if 'rain_in' in obj :
421
436
pkt ['rain_total' ] = Packet .get_float (obj , 'rain_in' )
422
- if 'rain_mm' in obj :
423
- pkt ['rain_total' ] = Packet .get_float (obj , 'rain_mm' )
424
- if pkt ['rain_total' ] is not None :
425
- # Convert to inches
426
- pkt ['rain_total' ] /= 25.4
437
+ elif 'rain_mm' in obj :
438
+ pkt ['rain_total' ] = to_in (Packet .get_float (obj , 'rain_mm' ))
427
439
if 'uv' in obj :
428
440
pkt ['uv' ] = Packet .get_int (obj , 'uv' )
429
441
if 'lux' in obj :
@@ -461,8 +473,11 @@ def parse_json(obj):
461
473
pkt ['hardware_id' ] = "%04x" % obj .get ('id' , 0 )
462
474
pkt ['sensor_id' ] = "%04x" % obj .get ('sensor_id' , 0 )
463
475
pkt ['channel' ] = obj .get ('channel' )
464
- pkt ['temperature' ] = Packet .get_float (obj , 'temperature_C' )
465
476
pkt ['humidity' ] = Packet .get_float (obj , 'humidity' )
477
+ if 'temperature_F' in obj :
478
+ pkt ['temperature' ] = Packet .get_float (obj , 'temperature_F' )
479
+ elif 'temperature_C' in obj :
480
+ pkt ['temperature' ] = to_F (Packet .get_float (obj , 'temperature_C' ))
466
481
pkt ['battery' ] = 0 if obj .get ('battery_ok' ) == 1 else 1
467
482
pkt ['mod' ] = obj .get ('mod' ) # apparently mod = ASK
468
483
pkt ['freq' ] = Packet .get_float (obj , 'freq' )
@@ -492,21 +507,16 @@ def parse_json(obj):
492
507
pkt ['msg_type' ] = Packet .get_int (obj , 'subtype' )
493
508
elif 'message_type' in obj :
494
509
pkt ['msg_type' ] = Packet .get_int (obj , 'message_type' )
495
- if 'wind_avg_mi_h' in obj :
496
- pkt ['wind_speed' ] = Packet .get_float (obj , 'wind_avg_mi_h' )
497
- elif 'wind_avg_km_h' in obj :
498
- pkt ['wind_speed' ] = Packet .get_float (obj , 'wind_avg_km_h' )
499
- if pkt ['wind_speed' ] is not None :
500
- # Convert to mph
501
- pkt ['wind_speed' ] *= 0.621371
510
+ if 'humidity' in obj :
511
+ pkt ['humidity' ] = Packet .get_float (obj , 'humidity' )
502
512
if 'temperature_F' in obj :
503
513
pkt ['temperature' ] = Packet .get_float (obj , 'temperature_F' )
504
514
elif 'temperature_C' in obj :
505
- pkt ['temperature' ] = Packet .get_float (obj , 'temperature_C' )
506
- if pkt [ 'temperature' ] is not None :
507
- pkt ['temperature ' ] = pkt [ 'temperature' ] * 1.8 + 32
508
- if 'humidity ' in obj :
509
- pkt ['humidity ' ] = Packet .get_float (obj , 'humidity' )
515
+ pkt ['temperature' ] = to_F ( Packet .get_float (obj , 'temperature_C' ) )
516
+ if 'wind_avg_mi_h' in obj :
517
+ pkt ['wind_speed ' ] = Packet . get_float ( obj , 'wind_avg_mi_h' )
518
+ elif 'wind_avg_km_h ' in obj :
519
+ pkt ['wind_speed ' ] = to_mph ( Packet .get_float (obj , 'wind_avg_km_h' ) )
510
520
return Acurite .insert_ids (pkt , Acurite3n1PacketV2 .__name__ )
511
521
512
522
@@ -548,25 +558,17 @@ def parse_json(obj):
548
558
# 49 has wind_speed, wind_dir, and rain
549
559
# 56 has wind_speed, temperature, humidity
550
560
if 'wind_avg_km_h' in obj :
551
- pkt ['wind_speed' ] = Packet .get_float (obj , 'wind_avg_km_h' )
552
- if pkt ['wind_speed' ] is not None :
553
- # Convert to mph
554
- pkt ['wind_speed' ] *= 0.621371
561
+ pkt ['wind_speed' ] = to_mph (Packet .get_float (obj , 'wind_avg_km_h' ))
555
562
if 'wind_dir_deg' in obj :
556
563
pkt ['wind_dir' ] = Packet .get_float (obj , 'wind_dir_deg' )
557
564
if 'rain_in' in obj :
558
565
pkt ['rain_total' ] = Packet .get_float (obj , 'rain_in' )
559
- if 'rain_mm' in obj :
560
- pkt ['rain_total' ] = Packet .get_float (obj , 'rain_mm' )
561
- if pkt ['rain_total' ] is not None :
562
- # Convert to inches
563
- pkt ['rain_total' ] /= 25.4
566
+ elif 'rain_mm' in obj :
567
+ pkt ['rain_total' ] = to_in (Packet .get_float (obj , 'rain_mm' ))
564
568
if 'temperature_F' in obj :
565
569
pkt ['temperature' ] = Packet .get_float (obj , 'temperature_F' )
566
570
elif 'temperature_C' in obj :
567
- pkt ['temperature' ] = Packet .get_float (obj , 'temperature_C' )
568
- if pkt ['temperature' ] is not None :
569
- pkt ['temperature' ] = pkt ['temperature' ] * 1.8 + 32
571
+ pkt ['temperature' ] = to_F (Packet .get_float (obj , 'temperature_C' ))
570
572
if 'humidity' in obj :
571
573
pkt ['humidity' ] = Packet .get_float (obj , 'humidity' )
572
574
return Acurite .insert_ids (pkt , Acurite5n1PacketV2 .__name__ )
@@ -616,7 +618,7 @@ def parse_text(ts, payload, lines):
616
618
def parse_json (obj ):
617
619
pkt = dict ()
618
620
pkt ['dateTime' ] = Packet .parse_time (obj .get ('time' ))
619
- pkt ['usUnits' ] = weewx .METRIC
621
+ pkt ['usUnits' ] = weewx .US
620
622
pkt ['hardware_id' ] = "%04x" % obj .get ('id' , 0 )
621
623
pkt ['channel' ] = obj .get ('channel' )
622
624
# support both battery status keywords
@@ -625,7 +627,10 @@ def parse_json(obj):
625
627
else :
626
628
pkt ['battery' ] = Packet .get_int (obj , 'battery' )
627
629
pkt ['status' ] = obj .get ('status' )
628
- pkt ['temperature' ] = Packet .get_float (obj , 'temperature_C' )
630
+ if 'temperature_F' in obj :
631
+ pkt ['temperature' ] = Packet .get_float (obj , 'temperature_F' )
632
+ elif 'temperature_C' in obj :
633
+ pkt ['temperature' ] = to_F (Packet .get_float (obj , 'temperature_C' ))
629
634
pkt ['humidity' ] = Packet .get_float (obj , 'humidity' )
630
635
return Acurite .insert_ids (pkt , AcuriteTowerPacket .__name__ )
631
636
@@ -760,41 +765,46 @@ def get_rain_total(obj):
760
765
class Acurite606TXPacket (Packet ):
761
766
# 2017-03-20: Acurite 606TX Temperature Sensor
762
767
# {"time" : "2017-03-04 16:18:12", "model" : "Acurite 606TX Sensor", "id" : 48, "battery" : "OK", "temperature_C" : -1.100}
763
- # {"time" : "2021-10-26 23:39:49", "model" : "Acurite-606TX", "id" : 194, "battery_ok" : 1, "temperature_C" : 19.200, "mic" : "CHECKSUM"}
764
768
765
- # IDENTIFIER = "Acurite 606TX Sensor"
766
- IDENTIFIER = "Acurite-606TX"
769
+ IDENTIFIER = "Acurite 606TX Sensor"
767
770
768
771
@staticmethod
769
772
def parse_json (obj ):
770
773
pkt = dict ()
771
774
pkt ['dateTime' ] = Packet .parse_time (obj .get ('time' ))
772
- pkt ['usUnits' ] = weewx .METRIC
775
+ pkt ['usUnits' ] = weewx .US
773
776
sensor_id = obj .get ('id' )
774
- pkt ['temperature' ] = Packet .get_float (obj , 'temperature_C' )
775
- if 'battery' in obj :
776
- pkt ['battery' ] = 0 if obj .get ('battery' ) == 'OK' else 1
777
+ if 'temperature_F' in obj :
778
+ pkt ['temperature' ] = Packet .get_float (obj , 'temperature_F' )
779
+ elif 'temperature_C' in obj :
780
+ pkt ['temperature' ] = to_F (Packet .get_float (obj , 'temperature_C' ))
777
781
if 'battery_ok' in obj :
778
782
pkt ['battery' ] = 0 if Packet .get_int (obj , 'battery_ok' ) == 1 else 1
783
+ else :
784
+ pkt ['battery' ] = 0 if obj .get ('battery' ) == 'OK' else 1
779
785
pkt = Packet .add_identifiers (pkt , sensor_id , Acurite606TXPacket .__name__ )
780
786
return pkt
781
787
782
788
783
789
class Acurite606TXPacketV2 (Packet ):
784
790
# 2021-02-23: Acurite 606TX Temperature Sensor
785
791
# {"time" : "2021-02-23 16:24:07", "model" : "Acurite-606TX", "id" : 153, "battery_ok" : 1, "temperature_C" : 18.800, "mic" : "CHECKSUM"}
792
+ # {"time" : "2021-10-26 23:39:49", "model" : "Acurite-606TX", "id" : 194, "battery_ok" : 1, "temperature_C" : 19.200, "mic" : "CHECKSUM"}
786
793
787
794
IDENTIFIER = "Acurite-606TX"
788
795
789
796
@staticmethod
790
797
def parse_json (obj ):
791
798
pkt = dict ()
792
799
pkt ['dateTime' ] = Packet .parse_time (obj .get ('time' ))
793
- pkt ['usUnits' ] = weewx .METRIC
800
+ pkt ['usUnits' ] = weewx .US
794
801
sensor_id = obj .get ('id' )
795
- pkt ['temperature' ] = Packet .get_float (obj , 'temperature_C' )
802
+ if 'temperature_F' in obj :
803
+ pkt ['temperature' ] = Packet .get_float (obj , 'temperature_F' )
804
+ elif 'temperature_C' in obj :
805
+ pkt ['temperature' ] = to_F (Packet .get_float (obj , 'temperature_C' ))
796
806
pkt ['battery' ] = 0 if obj .get ('battery_ok' ) == '1' else 1
797
- pkt = Packet .add_identifiers (pkt , sensor_id , Acurite606TXPacket .__name__ )
807
+ pkt = Packet .add_identifiers (pkt , sensor_id , Acurite606TXPacketV2 .__name__ )
798
808
return pkt
799
809
800
810
@@ -816,7 +826,7 @@ def parse_json(obj):
816
826
pkt ['channel' ] = obj .get ('channel' )
817
827
pkt ['battery' ] = 0 if obj .get ('battery_ok' ) == 1 else 1
818
828
if 'rain_mm' in obj :
819
- pkt ['rain_total' ] = Packet .get_float (obj , 'rain_mm' ) / 25.4
829
+ pkt ['rain_total' ] = to_in ( Packet .get_float (obj , 'rain_mm' ))
820
830
return Acurite .insert_ids (pkt , AcuriteRain899Packet .__name__ )
821
831
822
832
0 commit comments