matthewwall / weewx-sdr

weewx driver for software-defined radio
GNU General Public License v3.0
114 stars 74 forks source link

Bresser-5in1 parsing issue with weewx version 4.1.1 #87

Closed ioerror closed 2 years ago

ioerror commented 4 years ago

The Bresser-5in1 packet format included in sdr.py needed to be adjusted for my use.

weewx is configured in a standard manner and I'm using an rtlsdr with the sdr driver like so:

[SDR]
    loop_interval = 15
    driver = user.sdr
    path = /usr/share/weewx/user/
    cmd = rtl_433 -d0 -f 868.300M -M utc -F json -R 119
    log_unknown_sensors = True
    log_unmapped_sensors = True
    [[sensor_map]]
        outTemp = temperature.42.Bresser5in1Packet
        outHumidity = humidity.42.Bresser5in1Packet
        windDir = wind_dir.42.Bresser5in1Packet
        windSpeed = wind_avg.42.Bresser5in1Packet
        windGust = wind_max.42.Bresser5in1Packet
        rain_total = rain.42.Bresser5in1Packet
    [[deltas]]
        rain = rain_total

The output of this configuration appears to attempt to parse UV values which is a mistake. My model does not record UV data. Here's the output with weewx:

PYTHONPATH=/usr/share/weewx python3 /usr/share/weewx/user/sdr.py --cmd="rtl_433 -d0 -f 868.300M -M utc -F json -R 119"
out:['{"time" : "2020-06-15 13:45:05", "model" : "Bresser-5in1", "id" : 42, "temperature_C" : 25.700, "humidity" : 35, "wind_max_m_s" : 0.000, "wind_avg_m_s" : 0.600, "wind_dir_deg" : 135.000, "rain_mm" : 78.800, "mic" : "CHECKSUM"}\n']
parsed: {'dateTime': 1592228705, 'usUnits': 17, 'temperature.42.Bresser5in1Packet': 25.7, 'humidity.42.Bresser5in1Packet': 35.0, 'wind_dir.42.Bresser5in1Packet': 135.0, 'uv.42.Bresser5in1Packet': None, 'uv_index.42.Bresser5in1Packet': None, 'rain_total.42.Bresser5in1Packet': 78.8}

The class Bresser5in1Packet definition has output as comments that looks correct but the code does not produce that output. For example, the code looks for uv and uv_index when it should be looking for wind_dir and wind_avg. I modified the SDR driver to correctly check for wind_dir and wind_avg and removed the UV values like so:

@staticmethod
def parse_json(obj):
    pkt = dict()
    pkt['dateTime'] = Packet.parse_time(obj.get('time'))
    pkt['usUnits'] = weewx.METRICWX
    pkt['station_id'] = obj.get('id')
    pkt['temperature'] = Packet.get_float(obj, 'temperature_C')
    pkt['humidity'] = Packet.get_float(obj, 'humidity')
    pkt['wind_dir'] = Packet.get_float(obj, 'wind_dir_deg')
    pkt['wind_gust'] = Packet.get_float(obj, 'wind_max_m_s')
    pkt['wind_speed'] = Packet.get_float(obj, 'wind_avg_m_s')
    #pkt['uv'] = Packet.get_float(obj, 'uv')
    #pkt['uv_index'] = Packet.get_float(obj, 'uvi')
    # deal with different labels from rtl_433
    for dst, src in [('wind_speed', 'wind_speed_ms'),
                     ('gust_speed', 'gust_speed_ms'),
                     ('rain_total', 'rainfall_mm'),
                     ('wind_speed', 'wind_speed'),
                     ('gust_speed', 'gust_speed'),
                     ('rain_total', 'rain_mm')]:
        if src in obj:
            pkt[dst] = Packet.get_float(obj, src)
    return Bresser5in1Packet.insert_ids(pkt)

With these changes it now parses as expected:

 PYTHONPATH=/usr/share/weewx python3 /usr/share/weewx/user/sdr.py --cmd="rtl_433 -d0 -f 868.300M -M utc -F json -R 119"
out:['{"time" : "2020-06-15 13:50:17", "model" : "Bresser-5in1", "id" : 42, "temperature_C" : 26.300, "humidity" : 34, "wind_max_m_s" : 0.800, "wind_avg_m_s" : 1.100, "wind_dir_deg" : 135.000, "rain_mm" : 78.800, "mic" : "CHECKSUM"}\n']
parsed: {'dateTime': 1592229017, 'usUnits': 17, 'temperature.42.Bresser5in1Packet': 26.3, 'humidity.42.Bresser5in1Packet': 34.0, 'wind_dir.42.Bresser5in1Packet': 135.0, 'wind_gust.42.Bresser5in1Packet': 0.8, 'wind_speed.42.Bresser5in1Packet': 1.1, 'rain_total.42.Bresser5in1Packet': 78.8}
out:['{"time" : "2020-06-15 13:50:41", "model" : "Bresser-5in1", "id" : 42, "temperature_C" : 26.300, "humidity" : 34, "wind_max_m_s" : 0.800, "wind_avg_m_s" : 1.000, "wind_dir_deg" : 135.000, "rain_mm" : 78.800, "mic" : "CHECKSUM"}\n']
parsed: {'dateTime': 1592229041, 'usUnits': 17, 'temperature.42.Bresser5in1Packet': 26.3, 'humidity.42.Bresser5in1Packet': 34.0, 'wind_dir.42.Bresser5in1Packet': 135.0, 'wind_gust.42.Bresser5in1Packet': 0.8, 'wind_speed.42.Bresser5in1Packet': 1.0, 'rain_total.42.Bresser5in1Packet': 78.8}
out:['{"time" : "2020-06-15 13:50:53", "model" : "Bresser-5in1", "id" : 42, "temperature_C" : 26.300, "humidity" : 34, "wind_max_m_s" : 0.800, "wind_avg_m_s" : 1.000, "wind_dir_deg" : 135.000, "rain_mm" : 78.800, "mic" : "CHECKSUM"}\n']
parsed: {'dateTime': 1592229053, 'usUnits': 17, 'temperature.42.Bresser5in1Packet': 26.3, 'humidity.42.Bresser5in1Packet': 34.0, 'wind_dir.42.Bresser5in1Packet': 135.0, 'wind_gust.42.Bresser5in1Packet': 0.8, 'wind_speed.42.Bresser5in1Packet': 1.0, 'rain_total.42.Bresser5in1Packet': 78.8}
out:['{"time" : "2020-06-15 13:51:05", "model" : "Bresser-5in1", "id" : 42, "temperature_C" : 26.400, "humidity" : 34, "wind_max_m_s" : 0.800, "wind_avg_m_s" : 0.800, "wind_dir_deg" : 135.000, "rain_mm" : 78.800, "mic" : "CHECKSUM"}\n']
parsed: {'dateTime': 1592229065, 'usUnits': 17, 'temperature.42.Bresser5in1Packet': 26.4, 'humidity.42.Bresser5in1Packet': 34.0, 'wind_dir.42.Bresser5in1Packet': 135.0, 'wind_gust.42.Bresser5in1Packet': 0.8, 'wind_speed.42.Bresser5in1Packet': 0.8, 'rain_total.42.Bresser5in1Packet': 78.8}
out:['{"time" : "2020-06-15 13:51:29", "model" : "Bresser-5in1", "id" : 42, "temperature_C" : 26.400, "humidity" : 34, "wind_max_m_s" : 0.800, "wind_avg_m_s" : 0.800, "wind_dir_deg" : 135.000, "rain_mm" : 78.800, "mic" : "CHECKSUM"}\n']
parsed: {'dateTime': 1592229089, 'usUnits': 17, 'temperature.42.Bresser5in1Packet': 26.4, 'humidity.42.Bresser5in1Packet': 34.0, 'wind_dir.42.Bresser5in1Packet': 135.0, 'wind_gust.42.Bresser5in1Packet': 0.8, 'wind_speed.42.Bresser5in1Packet': 0.8, 'rain_total.42.Bresser5in1Packet': 78.8}

Should I open a pull request with my changes to fix this by changing things as I've done above? Or is there another way to fix this?

joewilliamsca commented 3 years ago

Hey, I was looking into this last night (Bresser-6in1), and you might want to change the code that you commented out for the uv values to something like this, incase this parser is being used by someone that has a device that supports uv...

   if 'uv' in obj:
    pkt['uv'] = Packet.get_float(obj, 'uv')
    if 'uv_index' in obj:
    pkt['uv_index'] = Packet.get_float(obj, 'uvi')

Just a FYI...

matthewwall commented 2 years ago

bresser changes have been merged into master as of 26oct2021