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.
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.
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.
What the scale delivers
You read the slot number as described in the chapter Finding your sensors — the scale has its own configuration topic:
campmatic/<GERAETE_ID>/senso4s/config
[{"slot":5,"mac":"F1:2B:…","name":"Gas scale"}]
Six readings arrive under that slot number:
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 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. 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.
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
Creating the sensors
Again under the existing mqtt: sensor:. Replace <GERAETE_ID> and <SLOT_SENSO4S> with your values.
- 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"
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.
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:.
# 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"
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::
- 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.
- 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