Chapter 12

Gas scale (Senso4s)

The Senso4s sits under the gas bottle and weighs it. Because it measures weight, it works with any bottle — composite and lightweight bottles included. It delivers the level ready-made in percent. There is one detail you need to know, though, or Home Assistant shows an outdated reading when something is wrong.

8 minutes Last verified: 22.09.2026 DE EN

Before you start

The Senso4s comes as BASIC and PLUS. Both weigh the bottle every 15 minutes. Your CampMatic reads the scale over Bluetooth roughly every 5 minutes and passes the values on. So the level changes at most every quarter of an hour, even though readings arrive more often.

Firmware 1.37.10 or later
Your CampMatic reads the Senso4s from firmware 1.37.10. Home Assistant shows your version in sensor.<ENTITY>_firmware_version. If it is older, our support will update it on request — write to us via the help page. Until then the CampMatic app does not even offer the scale for pairing.

Set it up in the Senso4s app

First set the scale up as usual in the Senso4s app: choose the bottle, zero the scale. That can only be done there — neither the CampMatic nor Home Assistant can configure the scale.

Close the Senso4s app

Then close the Senso4s app. While it is connected to the scale, the scale broadcasts nothing — and your CampMatic cannot hear it.

Pair it in the CampMatic app

In the CampMatic app go to Devices → Add and choose Senso4s BASIC / PLUS. The app then looks for scales nearby. If you have several, tell them apart by gas level and signal strength.

No pairing, no topics
Your CampMatic only sends the scale's readings once it is paired in the CampMatic app. Before that nothing reaches Home Assistant — even if the scale is standing right next to the vehicle.

What the scale delivers

You read the slot number as described in the chapter Finding your sensors — the scale has its own configuration topic:

Example reply json
campmatic/<GERAETE_ID>/senso4s/config
  [{"slot":5,"mac":"F1:2B:…","name":"Gas scale"}]

Six readings arrive under that slot number:

The Senso4s topics text
campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/gas_percent   level 0–100 %, only for a valid measurement
campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/level_raw     level or status code, see below
campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/flags         model, warnings, usage mode
campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/battery       scale battery in percent
campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/prognosis     time left in 15-minute steps
campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/rssi          signal strength in dBm
gas_percent freezes when something is wrong
This is the easiest place to be fooled. gas_percent is only sent for a valid measurement. If the scale needs zeroing or its battery is flat, nothing new arrives there — and Home Assistant keeps showing the last percentage as if all were well.

What you can rely on is level_raw: it arrives with every reading and contains either the level or a status code. That is why the sensors below are built on level_raw.
What level_raw can contain text
0–100     level in percent — all fine
255       zeroing needed — zero the scale in the Senso4s app
254       scale battery flat
252       setup error — check the setup in the Senso4s app
241–247   measurement disturbed (PLUS only)

flags is a single number holding several pieces of information. From 128 upwards it is a BASIC, below that a PLUS. Only the PLUS reports warnings, as values that are added together. The last four bits are the usage mode you chose in the Senso4s app.

How flags is made up text
128          BASIC — has no warnings
 64          scale moved           (PLUS only)
 32          scale tilted          (PLUS only)
 16          temperature warning   (PLUS only)
  1 to 5     usage mode: 1 BBQ · 2 Camping · 3 Caravanning · 4 Heating · 5 Household

Examples:
  131 = 128 + 3        BASIC, Caravanning
    3                  PLUS without a warning, Caravanning
   99 = 64 + 32 + 3    PLUS, moved and tilted, Caravanning
Readings are not stored
The scale's readings are not kept on the broker. After a restart of Home Assistant the sensors therefore read "unknown" for up to five minutes — until the next reading. That sorts itself out.

Creating the sensors

Again under the existing mqtt: sensor:. Replace <GERAETE_ID> and <SLOT_SENSO4S> with your values.

/config/packages/campmatic.yaml — under mqtt: sensor: yaml Download
    - name: "Gas Scale Level"
      unique_id: campmatic_<GERAETE_ID>_senso4s_<SLOT_SENSO4S>_percent
      # Deliberately level_raw, not gas_percent: only 0–100 is a level.
      # For a status code the sensor shows "unknown" instead of an old value.
      state_topic: "campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/level_raw"
      value_template: >-
        {% set r = value | int(-1) %}
        {{ r if r >= 0 and r <= 100 else none }}
      unit_of_measurement: "%"
      state_class: measurement
      icon: mdi:propane-tank
      expire_after: 2700
      availability_topic: "campmatic/<GERAETE_ID>/status"
      payload_available: "online"
      payload_not_available: "offline"

    - name: "Gas Scale State"
      unique_id: campmatic_<GERAETE_ID>_senso4s_<SLOT_SENSO4S>_state
      state_topic: "campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/level_raw"
      value_template: >-
        {% set r = value | int(-1) %}
        {% if r >= 0 and r <= 100 %}ok
        {% elif r == 255 %}zeroing needed
        {% elif r == 254 %}battery flat
        {% elif r == 252 %}setup error
        {% elif r >= 241 and r <= 247 %}measurement disturbed
        {% else %}unknown (code {{ r }})
        {% endif %}
      icon: mdi:scale
      expire_after: 2700
      availability_topic: "campmatic/<GERAETE_ID>/status"
      payload_available: "online"
      payload_not_available: "offline"

    - name: "Gas Scale Time Left"
      unique_id: campmatic_<GERAETE_ID>_senso4s_<SLOT_SENSO4S>_hours
      # 15-minute steps converted to hours. 65535 means: no estimate.
      state_topic: "campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/prognosis"
      value_template: >-
        {% set p = value | int(65535) %}
        {{ none if p == 65535 else (p * 15 / 60) | round(1) }}
      unit_of_measurement: "h"
      state_class: measurement
      icon: mdi:timer-sand
      expire_after: 2700
      availability_topic: "campmatic/<GERAETE_ID>/status"
      payload_available: "online"
      payload_not_available: "offline"

    - name: "Gas Scale Battery"
      unique_id: campmatic_<GERAETE_ID>_senso4s_<SLOT_SENSO4S>_batt
      state_topic: "campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/battery"
      unit_of_measurement: "%"
      device_class: battery
      state_class: measurement
      entity_category: diagnostic
      expire_after: 2700
      availability_topic: "campmatic/<GERAETE_ID>/status"
      payload_available: "online"
      payload_not_available: "offline"

    - name: "Gas Scale Signal"
      unique_id: campmatic_<GERAETE_ID>_senso4s_<SLOT_SENSO4S>_rssi
      state_topic: "campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/rssi"
      unit_of_measurement: "dBm"
      device_class: signal_strength
      state_class: measurement
      entity_category: diagnostic
      expire_after: 2700
      availability_topic: "campmatic/<GERAETE_ID>/status"
      payload_available: "online"
      payload_not_available: "offline"
Why 2700 seconds
After expire_after seconds without a new value a sensor turns "unavailable". 2700 seconds are 45 minutes — three full measuring cycles of the scale and around nine readings by your CampMatic. Only when nothing arrives for that long is the scale really gone: flat battery, Senso4s app still connected, or out of range.

It should not be shorter, because the readings are not stored and individual readings can be missed — after a restart of your CampMatic, for instance, Bluetooth takes a few minutes to come back. The sensor would then flicker for no reason. And it is the same value as for every other sensor in this guide.
The time left is an estimate
The scale extrapolates it from recent consumption. As long as it has no consumption to go on, right after a bottle change for instance, there is no estimate — the sensor then reads "unknown". If it shows 0, the bottle is nearly empty; the Senso4s app then shows "< 1 h".

Faults and warnings

The warnings come as binary_sensor. If you already have that section from the chapter Truma LevelControl, add the entries there. Otherwise create it once now, at the same level as sensor:.

/config/packages/campmatic.yaml — under mqtt: yaml Download
  # Separate section — same level as "sensor:"
  binary_sensor:
    # Goes on when you have to act yourself:
    # 255 zeroing needed, 254 battery flat, 252 setup error
    - name: "Gas Scale Not Measuring"
      unique_id: campmatic_<GERAETE_ID>_senso4s_<SLOT_SENSO4S>_fault
      state_topic: "campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/level_raw"
      value_template: "{{ 'ON' if value | int(0) in [252, 254, 255] else 'OFF' }}"
      device_class: problem
      expire_after: 2700
      availability_topic: "campmatic/<GERAETE_ID>/status"
      payload_available: "online"
      payload_not_available: "offline"

    # The three warnings only exist on the PLUS. From 128 upwards it is a
    # BASIC, and they always stay off.
    - name: "Gas Scale Moved"
      unique_id: campmatic_<GERAETE_ID>_senso4s_<SLOT_SENSO4S>_motion
      state_topic: "campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/flags"
      value_template: >-
        {% set f = value | int(0) %}
        {{ 'ON' if f < 128 and f | bitwise_and(64) > 0 else 'OFF' }}
      device_class: problem
      expire_after: 2700
      availability_topic: "campmatic/<GERAETE_ID>/status"
      payload_available: "online"
      payload_not_available: "offline"

    - name: "Gas Scale Tilted"
      unique_id: campmatic_<GERAETE_ID>_senso4s_<SLOT_SENSO4S>_incline
      state_topic: "campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/flags"
      value_template: >-
        {% set f = value | int(0) %}
        {{ 'ON' if f < 128 and f | bitwise_and(32) > 0 else 'OFF' }}
      device_class: problem
      expire_after: 2700
      availability_topic: "campmatic/<GERAETE_ID>/status"
      payload_available: "online"
      payload_not_available: "offline"

    - name: "Gas Scale Temperature Warning"
      unique_id: campmatic_<GERAETE_ID>_senso4s_<SLOT_SENSO4S>_temp_warn
      state_topic: "campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/flags"
      value_template: >-
        {% set f = value | int(0) %}
        {{ 'ON' if f < 128 and f | bitwise_and(16) > 0 else 'OFF' }}
      device_class: problem
      expire_after: 2700
      availability_topic: "campmatic/<GERAETE_ID>/status"
      payload_available: "online"
      payload_not_available: "offline"
Why "not measuring" ignores a disturbed measurement
The sensor only goes on for the three states where you have to do something yourself: zero the scale, replace the battery or check the setup. A disturbed measurement on the PLUS (241–247) shows up in the Gas Scale State sensor.
You have a BASIC?
Then moved, tilted and temperature warning always read OK. You can simply leave those three entries out.

Model and usage mode

If you want to see which model is paired and which usage mode is set in the Senso4s app, add two diagnostic values — again under mqtt: sensor::

Optional yaml
    - name: "Gas Scale Model"
      unique_id: campmatic_<GERAETE_ID>_senso4s_<SLOT_SENSO4S>_model
      state_topic: "campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/flags"
      value_template: "{{ 'BASIC' if value | int(0) >= 128 else 'PLUS' }}"
      entity_category: diagnostic
      icon: mdi:scale
      expire_after: 2700
      availability_topic: "campmatic/<GERAETE_ID>/status"
      payload_available: "online"
      payload_not_available: "offline"

    - name: "Gas Scale Usage Mode"
      unique_id: campmatic_<GERAETE_ID>_senso4s_<SLOT_SENSO4S>_mode
      state_topic: "campmatic/<GERAETE_ID>/senso4s/bottle_<SLOT_SENSO4S>/flags"
      value_template: >-
        {% set m = value | int(0) | bitwise_and(15) %}
        {{ {1: 'BBQ', 2: 'Camping', 3: 'Caravanning', 4: 'Heating', 5: 'Household'}.get(m, 'unknown') }}
      entity_category: diagnostic
      icon: mdi:tune-variant
      expire_after: 2700
      availability_topic: "campmatic/<GERAETE_ID>/status"
      payload_available: "online"
      payload_not_available: "offline"

Then check the configuration and restart Home Assistant.

Before you move on
  • The scale is paired in the CampMatic app and the Senso4s app is closed
  • The level shows a percentage, the state reads ok
  • Gas Scale Not Measuring reads OK