Squirrel Logo

Adding a Bresser 5 in 1 sensor to Home Assistant

Johan Vromans
Articles » Bresser 5in1 with HA


Adding a Bresser 5 in 1 sensor to Home Assistant

As part of an ongoing home automation project I want to have my own weather station and use it in Home Assistant.

Hardware

Bresser 5 in 1

After some asking around I was told that the Bresser 5-in-1 would be a good choice.

This sensor comes in several flavours, that only differ in functionality of the base station. Since I had no intentions of using the base station much, I ordered the cheapest flavour I could find from Amazon.

The sensor is called 5 in 1 since it has 5 sensor functions: temperature, humidity, wind, rain and pressure. However, the pressure is not measured by the sensor, but by the base station. There are newer models, the 6 in 1, that also measures the amount of ultra-violet light, and the 7 in 1 that also measures the amount of light. This article is based on an 5 in 1, but almost everything applies to the other models too.

The sensor transmits the data via a radio signal. I purchased this USB2.0 DAB FM Radio DVB-T RTL2832U R820T2 RTL SDR TV Stick Dongle Digital USB TV HDTV Tuner Receiver IR Remote with Antenna from Ali Express. It has a Rafael Micro r820t chip that is known to work fine with most systems.

Never mind the CD and remote, I am not going to use it.

Warning: This dongle draws about 250mA. If you are going to plug it in a RaspberryPi make sure your power supply is sufficient.

Note: While this dongle works, it is “[…] misusing a broadband FM device for listening for a couple of bits. It's like driving a semi truck to the grocery store and wondering about fuel economy.”
So there may be better alternatives.

As may be expected, the sensor works out of the box after inserting the batteries in both the sensor and the base station.

Software

rtl_433

To use the dongle there is a nifty tool called rtl_433. It is a general purpose digital radio receiver that, despite the name, can receive almost all frequency bands that are in use for digital communication.

To get this tool see GitHub.

The tool needs to be told what frequency to receive. The Bresser 5-in-1 sensor uses a frequency of 868.30Mhz.

And it is dead simple. I inserted the dongle in my (linux) PC and started the tool:

   rtl_433 -c /dev/null -f 868.3M

And lo and behold! After a couple of seconds it reported:

   time      : 2022-05-30 21:01:39
   model     : Bresser-6in1 id        : 14100077
   channel   : 0            Battery   : 1             Temperature: 14.5 C
   Humidity  : 61           Sensor type: 1            Wind Gust : 0.0 m/s   
   Wind Speed: 0.0 m/s      Direction : 90            UV        : 0.0  
   Flags     : 0            Integrity : CRC

Wow, this went fast. This is really a nifty tool.

One of the first things to remark is that this Bresser 5-in-1 reports itself as speaking the newer 6-in-1 protocol. Good. So there's a bogus UV value included. Battery value 1 means the batteries are still good. Channel, sensor type, flags and integrity have a purpose but not as far as I'm concerned. The other measurements are familiar: temperature (in degrees Celcius), humidity (in percent), wind gust and (average) speed (in meters/second) and wind direction (in degrees). The values are reported periodically, once per 12 seconds according to the rtl_433 docs but often it may take longer.

Note that the wind direction is reported in 16 discrete steps: 0 (N), 22, 45, 68, 90 (E), 112, 135, 158, 180 (S), 202, 225, 248, 270 (W), 292, 315, and 338.
Temperature values are reported in increments of 0.1 °C.
Rain meter values are reported in increments of 0.4 mm. Only the cumulative total value is reported. Amounts per hour, day, week and so on are tracked by the base syation.

If you have a 6-in-1 sensor there is also an ultra-violet value, a floating point number. The 7-in-1 sensor reports the light value in both lux and kilolux.

rtl_433 is capable of sending the information to an MQTT server where Home Assistant can pick it up. This led to the following configuration for rtl_443:

   gain          0
   frequency     868.30M
   hop_interval  600
   ppm_error     0
   sample_rate   250k
   report_meta   time:tz
   protocol 172 # Bresser Weather Center 6-in-1 (newer 5-in-1)
   protocol 173 # Bresser Weather Center 7-in-1
   output mqtt=http://my mqtt server,retain=1,devices=rtl_433/bresser51

After restarting rtl_433 I could see the messages flowing in using MQTT Explorer.

Home Assistant Sensors

In Home Assistant I defined a new package file bresser51.yaml (Full info at end.)

The basic definition for each of the sensor values is:

   sensor:
     - platform: mqtt
       name: Bresser51 Temperature
       state_topic: rtl_433/bresser51/temperature_C
       unique_id: bresser51_temperature_C
       unit_of_measurement: "°C"
       device_class: temperature

For the battery status I used a binary sensor:

   binary_sensor:
     - platform: mqtt
       name: Bresser51 Battery
       state_topic: rtl_433/bresser51/battery_ok
       unique_id: bresser51_battery_ok
       payload_on: "0"
       payload_off: "1"
       device_class: battery

Note that for the battery class, on means that the batteries are low and must be replaced.

To get a nice, symbolic name for the wind direction I added a template sensor:

   template:
     sensor:
       # Map heading in degrees to symbolic name.
       # Note that the bresser sensor returns discrete values!
       #  0 22 45 68 90 112 135 158 180 202 225 248 270 292 315 338 360
       - name: Bresser51 Wind Direction Name
	 icon: mdi:compass-rose
	 state: |
	   {%- set dir = states('sensor.bresser51_wind_direction') | float -%}
	   {% set names = "N NNO NO ONO O OZO ZO ZZO Z ZZW ZW WZW W WNW NW NNW N".split() %}
	   {{ names[( dir / 22 ) | int ] }}

For the rain meter I added statistical sensors.

sensor:
    - name: Bresser51 Rain 1H
      platform: statistics
      unique_id: bresser51_rain_1h
      entity_id: sensor.bresser51_rain
      sampling_size: 200
      state_characteristic: change
      max_age:
        hours: 1

Similar for 24 hours and 7 days (168 hours). The Bresser 5-in-1 reports max. 6 times per minute, so the sampling size should be chosen sufficiently large to hold all the samples for the desired period.

But… It turns out that statistics sensors, while doing a great job in most cases, are less suitable for this purpose. Consider the situation that the accumulated amount of rain is 50mm at 10:00 yesterday, 60mm at 06:00 today. Niw it is 08:00. The statistics sensor will report the difference between the current value, 60mm, and the first reading within the 24-hour interval, which is also 60. So it reports zero. For all practical purposes, it should report 10mm, since the value 24 hours ago was 50mm.

So a better approach is to use an SQL sensor to retrieve the last value before the interval and use that instead of the first value in the interval.

sensor:
  - platform: sql
    db_url: !secret recorder_db
    queries:
      - name: Bresser51 DB Rain 1H
        query: >-
          SELECT * FROM states
          WHERE entity_id = 'sensor.bresser51_rain'
                AND last_updated < CURRENT_TIMESTAMP - INTERVAL '1 hour'
          ORDER BY last_updated DESC
          LIMIT 1;
        column: state
        unit_of_measurement: mm

Unfortunately the Home Assistant developers decided to remove the possibility to define an SQL sensor using YAML, so it must be done now, tediously and prone to errors, via the UI.

Lovelace

Full data at end.

I use an entities card for most purposes. I use a custom:multiple-entity-row to combine temperature and humidity, and I do the same with wind gust, average and direction.

      - type: entities
        title: Weerstation
        state_color: true
        entities:
          - entity: sensor.bresser51_temperature
            type: custom:multiple-entity-row
            name: Temperatuur
            icon: mdi:thermometer
            show_state: false
            entities:
              - entity: sensor.bresser51_temperature
                name: false
              - entity: sensor.bresser51_humidity
                name: false

Since I do not have values for the air pressure, this is measured by the base station, I 'borrow' this from weather.openweathermap.

          - entity: weather.openweathermap
            icon: mdi:gauge
            type: custom:template-entity-row
            name: Barometer
            state: >
              {{ state_attr('weather.openweathermap','pressure') }} hPa

Finally, I suppress the battery state if it is normal.

          - type: conditional
            conditions:
              - entity: binary_sensor.bresser51_battery
                state: "on"
            row:
              entity: binary_sensor.bresser51_battery
              show_active: true
              name: Batterij

The final result. Well, for now.

Dashboard

Appendices

.homeassistant/packages/bresser51.yaml

Full contents.

.homeassistant/dashboards/default.yaml (section)

views:
  - cards:
      - type: entities
        title: Weerstation
        state_color: true
        entities:
          - entity: sensor.bresser51_temperature
            type: custom:multiple-entity-row
            name: Temperatuur
            icon: mdi:thermometer
            show_state: false
            entities:
              - entity: sensor.bresser51_temperature
                name: false
              - entity: sensor.bresser51_humidity
                name: false
          - entity: weather.openweathermap
            icon: mdi:gauge
            type: custom:template-entity-row
            name: Barometer
            state: >
              {{ state_attr('weather.openweathermap','pressure') }} hPa
          - entity: sensor.bresser51_wind_speed
            type: custom:multiple-entity-row
            name: Wind
            icon: mdi:weather-windy
            show_state: false
            secondary_info:
              entity: sensor.bresser51_wind_direction_name
              name: false
            entities:
              - entity: sensor.bresser51_wind_gust
                name: vlaag
                unit: false
              - entity: sensor.bresser51_wind_speed
                name: gem.
              - entity: sensor.bresser51_wind_beaufort
                name: Bft
                unit: false
          - entity: sensor.bresser51_rain
            type: custom:multiple-entity-row
            name: Neerslag
            show_state: false
            secondary_info:
              entity: sensor.bresser51_rain
              name: false
            entities:
              - entity: sensor.bresser51_rain_168h
                name: 168u
                hide_unavailable: true
                hide_if: 0
              - entity: sensor.bresser51_rain_24h
                name: 24u
                hide_unavailable: true
                hide_if: 0
              - entity: sensor.bresser51_rain_1h
                name: uur
                hide_unavailable: true
                hide_if: 0
          - type: conditional
            conditions:
              - entity: binary_sensor.bresser51_battery
                state: "on"
            row:
              entity: binary_sensor.bresser51_battery
              show_active: true
              name: Batterij

It may be worth investigating a compass card, e.g. custom:compass-card.

      - type: custom:compass-card
        header: false
        language: nl
        indicator_sensors:
          - sensor: sensor.bresser51_wind_direction
            indicator:
              type: arrow_inward
        value_sensors:
          - sensor: sensor.bresser51_wind_beaufort

A full dashboard with everything.

.config/rtl_433/rtl_433.conf

gain          0
frequency     868.30M
hop_interval  600
ppm_error     0
sample_rate   250k
protocol 172 # Bresser Weather Center 6-in-1 (newer 5-in-1)
protocol 173 # Bresser Weather Center 7-in-1
output mqtt=http://mqtt.squirrel.nl,retain=1,devices=rtl_433/bresser51

Don't bother trying to get to mqtt.squirrel.nl. It is a LAN host.

/etc/systemd/system/rtl433.service

[Unit]
Description=RTL 433 Receiver
After=network-online.target
Wants=network-online.target
Before=

[Service]
User=jv
Environment="PATH=/usr/bin:/sbin"
ExecStart=/usr/bin/rtl_433 -c /home/jv/.config/rtl_433/rtl_433.conf
Restart=always
RestartSec=60s

[Install]
WantedBy=multi-user.target



© Copyright 2003-2022 Johan Vromans. All Rights Reserved.
articles/hass_bresser51/index.html last modified 21:36:52 18-Aug-2022