Skip to content

Commit 508f412

Browse files
committed
clean up the acurite packets. consolidate conversions.
1 parent da2c7d6 commit 508f412

File tree

1 file changed

+64
-54
lines changed

1 file changed

+64
-54
lines changed

bin/user/sdr.py

+64-54
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@
7474
in the JSON data, for example 'wind_speed_mph' instead of just 'wind_speed'.
7575
"""
7676

77+
# FIXME: deprecate then eliminate the V2 acurite packets - single packet def
78+
# can recognize anything rtl_433 spits out
79+
7780
from __future__ import with_statement
7881
from calendar import timegm
7982
try:
@@ -162,6 +165,23 @@ def confeditor_loader():
162165
return SDRConfigurationEditor()
163166

164167

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+
165185
class AsyncReader(threading.Thread):
166186

167187
def __init__(self, fd, queue, label):
@@ -400,30 +420,22 @@ def parse_json(obj):
400420
pkt['channel'] = obj.get('channel')
401421
pkt['sequence_num'] = Packet.get_int(obj, 'sequence_num')
402422
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
409423
if 'humidity' in obj:
410424
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'))
411429
if 'wind_avg_mi_h' in obj:
412430
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'))
418433
if 'wind_dir_deg' in obj:
419434
pkt['wind_dir'] = Packet.get_float(obj, 'wind_dir_deg')
420435
if 'rain_in' in obj:
421436
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'))
427439
if 'uv' in obj:
428440
pkt['uv'] = Packet.get_int(obj, 'uv')
429441
if 'lux' in obj:
@@ -461,8 +473,11 @@ def parse_json(obj):
461473
pkt['hardware_id'] = "%04x" % obj.get('id', 0)
462474
pkt['sensor_id'] = "%04x" % obj.get('sensor_id', 0)
463475
pkt['channel'] = obj.get('channel')
464-
pkt['temperature'] = Packet.get_float(obj, 'temperature_C')
465476
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'))
466481
pkt['battery'] = 0 if obj.get('battery_ok') == 1 else 1
467482
pkt['mod'] = obj.get('mod') # apparently mod = ASK
468483
pkt['freq'] = Packet.get_float(obj, 'freq')
@@ -492,21 +507,16 @@ def parse_json(obj):
492507
pkt['msg_type'] = Packet.get_int(obj, 'subtype')
493508
elif 'message_type' in obj:
494509
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')
502512
if 'temperature_F' in obj:
503513
pkt['temperature'] = Packet.get_float(obj, 'temperature_F')
504514
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'))
510520
return Acurite.insert_ids(pkt, Acurite3n1PacketV2.__name__)
511521

512522

@@ -548,25 +558,17 @@ def parse_json(obj):
548558
# 49 has wind_speed, wind_dir, and rain
549559
# 56 has wind_speed, temperature, humidity
550560
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'))
555562
if 'wind_dir_deg' in obj:
556563
pkt['wind_dir'] = Packet.get_float(obj, 'wind_dir_deg')
557564
if 'rain_in' in obj:
558565
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'))
564568
if 'temperature_F' in obj:
565569
pkt['temperature'] = Packet.get_float(obj, 'temperature_F')
566570
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'))
570572
if 'humidity' in obj:
571573
pkt['humidity'] = Packet.get_float(obj, 'humidity')
572574
return Acurite.insert_ids(pkt, Acurite5n1PacketV2.__name__)
@@ -616,7 +618,7 @@ def parse_text(ts, payload, lines):
616618
def parse_json(obj):
617619
pkt = dict()
618620
pkt['dateTime'] = Packet.parse_time(obj.get('time'))
619-
pkt['usUnits'] = weewx.METRIC
621+
pkt['usUnits'] = weewx.US
620622
pkt['hardware_id'] = "%04x" % obj.get('id', 0)
621623
pkt['channel'] = obj.get('channel')
622624
# support both battery status keywords
@@ -625,7 +627,10 @@ def parse_json(obj):
625627
else:
626628
pkt['battery'] = Packet.get_int(obj, 'battery')
627629
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'))
629634
pkt['humidity'] = Packet.get_float(obj, 'humidity')
630635
return Acurite.insert_ids(pkt, AcuriteTowerPacket.__name__)
631636

@@ -760,41 +765,46 @@ def get_rain_total(obj):
760765
class Acurite606TXPacket(Packet):
761766
# 2017-03-20: Acurite 606TX Temperature Sensor
762767
# {"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"}
764768

765-
# IDENTIFIER = "Acurite 606TX Sensor"
766-
IDENTIFIER = "Acurite-606TX"
769+
IDENTIFIER = "Acurite 606TX Sensor"
767770

768771
@staticmethod
769772
def parse_json(obj):
770773
pkt = dict()
771774
pkt['dateTime'] = Packet.parse_time(obj.get('time'))
772-
pkt['usUnits'] = weewx.METRIC
775+
pkt['usUnits'] = weewx.US
773776
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'))
777781
if 'battery_ok' in obj:
778782
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
779785
pkt = Packet.add_identifiers(pkt, sensor_id, Acurite606TXPacket.__name__)
780786
return pkt
781787

782788

783789
class Acurite606TXPacketV2(Packet):
784790
# 2021-02-23: Acurite 606TX Temperature Sensor
785791
# {"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"}
786793

787794
IDENTIFIER = "Acurite-606TX"
788795

789796
@staticmethod
790797
def parse_json(obj):
791798
pkt = dict()
792799
pkt['dateTime'] = Packet.parse_time(obj.get('time'))
793-
pkt['usUnits'] = weewx.METRIC
800+
pkt['usUnits'] = weewx.US
794801
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'))
796806
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__)
798808
return pkt
799809

800810

@@ -816,7 +826,7 @@ def parse_json(obj):
816826
pkt['channel'] = obj.get('channel')
817827
pkt['battery'] = 0 if obj.get('battery_ok') == 1 else 1
818828
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'))
820830
return Acurite.insert_ids(pkt, AcuriteRain899Packet.__name__)
821831

822832

0 commit comments

Comments
 (0)