Skip to content

SDR.PY modification for BALDR Wireless Weather Station - Remote Sensor, Shelf Standing or Wall Hanging, Battery Powered for Home Weather Stations. Identifies as "Bresser-3CH" #202

Description

@modacs

Hi,
Not a software engineer, first time with Python, but I did manage to struggle through with writing a parser for sdr.py for an inexpensive Temp/Humidity sensor sold at Amazon under the name BALDR Wireless Weather Station - Remote Sensor, Shelf Standing or Wall Hanging, Battery Powered for Home Weather Stations. This sensor identifies as a Bresser-3CH, there was no parser defined for it, so I managed to cobble one together. I am using it with weewx, and RTL.SDR unit. I thought I would post it here if on the next update for SDR.PY someone that's an expert can review and include if they deem as decent. One strange thing with this sensor is that it can change unit's metric to US, on a battery change so I left the choices as commented out, so one can choose the appropriate units. Maybe I missed something?
any rate here it is

class BresserTH(Packet):
# 2026-13-1 : Bresser Temperature and Humidity Sensor

#{"time" : "2026-01-13 16:08:56", "model" : "Bresser-3CH", "id" : 41, "channel" : 1, "battery_ok" : 1, "temperature_F" : 64.400, "humidity" : 38, "mic" : "CHECKSUM"}\n', '{"time" : "2026-01-13 16:08:57", "model" : "Bresser-3CH", "id" : 41, "channel" : 1, "battery_ok" : 1, "temperature_F" : 64.400, "humidity" : 38, "mic" : "CHECKSUM"}\n']

IDENTIFIER = "Bresser-3CH"

@staticmethod
def parse_json(obj):
    channel = obj.get('channel')        
    device_id = obj.get('id')

    sensor_id = f"{channel}:{device_id}" if channel else str(device_id) # Prefix channel to device ID
    pkt = dict()
    pkt['dateTime'] = Packet.parse_time(obj.get('time'))

pkt['usUnits'] = weewx.US

    pkt['usUnits'] = weewx.METRIC

pkt['temperature'] = Packet.get_float(obj, 'temperature_F')

    pkt['temperature'] = Packet.get_float(obj, 'temperature_C')
    pkt['humidity'] = Packet.get_float(obj, 'humidity')
    pkt['battery'] = Packet.get_battery(obj)
    pkt['channel'] = obj.get('channel') # Optional: Keep if needed for logging, but not required for mapping
    pkt = Packet.add_identifiers(pkt, sensor_id, BresserTH.__name__)
    return pkt

A line from my config file to select the appropriate logical channel

extraTemp1 = temperature.1:41.BresserTH

extraTemp2 = temperature.2:125.BresserTH

extraHumid1 = humidity.1:41.BresserTH

extraHumid2 = humidity.2:125.BresserTH

Happy Weather!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions