Gasflasche (Mopeka)
Der Mopeka-Sensor ist der aufwendigste von allen — er sendet keinen Füllstand, sondern nur Rohwerte. Die Prozentzahl entsteht erst durch Rechnen. Wir nehmen dafür genau dieselben Formeln, die auch die CampMatic-App verwendet, damit App und Home Assistant denselben Wert zeigen.
Was der Sensor wirklich sendet
Der Mopeka misst mit Ultraschall von unten durch den Flaschenboden. Was bei dir ankommt, ist die Laufzeit dieses Schallimpulses — nicht die Füllhöhe und erst recht kein Prozentwert:
campmatic/<GERAETE_ID>/mopeka/bottle_<SLOT_MOPEKA>/raw_tof Laufzeit in Mikrosekunden
campmatic/<GERAETE_ID>/mopeka/bottle_<SLOT_MOPEKA>/raw_t Temperaturbyte (0–127)
campmatic/<GERAETE_ID>/mopeka/bottle_<SLOT_MOPEKA>/battery_raw Batterie als Rohbyte
campmatic/<GERAETE_ID>/mopeka/bottle_<SLOT_MOPEKA>/quality Messgüte 0–3
campmatic/<GERAETE_ID>/mopeka/bottle_<SLOT_MOPEKA>/rssi Signalstärke in dBm
Die Rohwerte anlegen
Häng die folgenden Sensoren unter das bestehende mqtt: sensor: in deiner /config/packages/campmatic.yaml. Ersetze <GERAETE_ID> und <SLOT_MOPEKA> durch deine Werte.
- name: "Gasflasche Laufzeit"
unique_id: campmatic_<GERAETE_ID>_mopeka_<SLOT_MOPEKA>_tof
state_topic: "campmatic/<GERAETE_ID>/mopeka/bottle_<SLOT_MOPEKA>/raw_tof"
state_class: measurement
entity_category: diagnostic
icon: mdi:radar
expire_after: 2700
availability_topic: "campmatic/<GERAETE_ID>/status"
payload_available: "online"
payload_not_available: "offline"
- name: "Gasflasche Temperaturbyte"
unique_id: campmatic_<GERAETE_ID>_mopeka_<SLOT_MOPEKA>_rawt
state_topic: "campmatic/<GERAETE_ID>/mopeka/bottle_<SLOT_MOPEKA>/raw_t"
state_class: measurement
entity_category: diagnostic
expire_after: 2700
availability_topic: "campmatic/<GERAETE_ID>/status"
payload_available: "online"
payload_not_available: "offline"
- name: "Gasflasche Temperatur"
unique_id: campmatic_<GERAETE_ID>_mopeka_<SLOT_MOPEKA>_temp
state_topic: "campmatic/<GERAETE_ID>/mopeka/bottle_<SLOT_MOPEKA>/raw_t"
value_template: "{{ value | int - 40 }}"
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
expire_after: 2700
availability_topic: "campmatic/<GERAETE_ID>/status"
payload_available: "online"
payload_not_available: "offline"
- name: "Gasflasche Sensorbatterie"
unique_id: campmatic_<GERAETE_ID>_mopeka_<SLOT_MOPEKA>_batt
state_topic: "campmatic/<GERAETE_ID>/mopeka/bottle_<SLOT_MOPEKA>/battery_raw"
value_template: "{{ (value | float(0) / 32.0) | round(2) }}"
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
entity_category: diagnostic
expire_after: 2700
availability_topic: "campmatic/<GERAETE_ID>/status"
payload_available: "online"
payload_not_available: "offline"
- name: "Gasflasche Messqualität"
unique_id: campmatic_<GERAETE_ID>_mopeka_<SLOT_MOPEKA>_quality
state_topic: "campmatic/<GERAETE_ID>/mopeka/bottle_<SLOT_MOPEKA>/quality"
state_class: measurement
entity_category: diagnostic
icon: mdi:signal-cellular-2
expire_after: 2700
availability_topic: "campmatic/<GERAETE_ID>/status"
payload_available: "online"
payload_not_available: "offline"
Füllhöhe und Füllstand berechnen
Jetzt kommt die eigentliche Rechnung. Sie gehört unter template: sensor: — falls du diesen Abschnitt noch nicht hast, legst du ihn einmal an.
template:
- sensor:
- name: "Gasflasche Füllhöhe"
unique_id: campmatic_<GERAETE_ID>_mopeka_<SLOT_MOPEKA>_mm
unit_of_measurement: "mm"
state_class: measurement
icon: mdi:arrow-expand-vertical
availability: >-
{{ states('sensor.gasflasche_laufzeit') not in ['unknown','unavailable']
and states('sensor.gasflasche_temperaturbyte') not in ['unknown','unavailable'] }}
state: >-
{% set tof = states('sensor.gasflasche_laufzeit') | float(0) %}
{% set t = states('sensor.gasflasche_temperaturbyte') | float(0) %}
{{ (tof * (0.573045 - 0.002822 * t - 0.00000535 * t * t)) | round(1) }}
- name: "Gasflasche Füllstand"
unique_id: campmatic_<GERAETE_ID>_mopeka_<SLOT_MOPEKA>_level
unit_of_measurement: "%"
state_class: measurement
icon: mdi:propane-tank
availability: >-
{{ states('sensor.gasflasche_fullhohe') not in ['unknown','unavailable'] }}
state: >-
{% set leer = 38 %}
{% set voll = 333 %}
{% set mm = states('sensor.gasflasche_fullhohe') | float(0) %}
{{ [[((mm - leer) / (voll - leer) * 100), 0] | max, 100] | min | round(0) }}
sensor.gasflasche_temperaturbyte und nicht sensor.gasflasche_temperatur. Wer hier die Grad-Celsius-Zahl einsetzt, bekommt Werte, die plausibel aussehen — aber falsch sind. sensor.gasflasche_fullhohe — ohne Umlaute. Genauso wird aus „Füllstand" fullstand und aus „Messqualität" messqualitat. Die Formeln oben benutzen bereits die richtigen Schreibweisen. Wer sie ändert, muss darauf achten: Ein falsch geschriebener Entitätsname liefert einfach einen leeren Wert, ohne Fehlermeldung. Deine Flasche eintragen
Die beiden Zahlen leer und voll in der Füllstandsformel hängen von deiner Flasche ab. Der Wert für leer ist bei allen gleich, nur der Vollwert unterscheidet sich:
Flaschentyp leer voll
6 kg Stahl 38 333
11 kg Stahl 38 358
14 kg Stahl 38 408
6 kg Aluminium 38 300
11 kg Aluminium 38 460
CampingGaz 907 38 130
US 20 lb 38 248
US 30 lb 38 381
US 40 lb 38 508
tank_type, zum Beispiel EUROPE_6KG für die 6-kg-Stahlflasche. Mehrere Flaschen
Hast du zwei Mopeka-Sensoren, legst du den ganzen Block ein zweites Mal an — mit der zweiten Platznummer und anderen Namen. Achte darauf, dass auch die unique_id und die Verweise in den Formeln mitwandern:
- name: "Gasflasche rechts Laufzeit" # statt "Gasflasche Laufzeit"
unique_id: campmatic_<GERAETE_ID>_mopeka_5_tof
state_topic: "campmatic/<GERAETE_ID>/mopeka/bottle_5/raw_tof"
...
# und in der Formel dann auch:
{% set tof = states('sensor.gasflasche_rechts_laufzeit') | float(0) %}
Nicht vergessen: Nach dem Speichern Konfiguration prüfen und Home Assistant neu starten.
- Die Konfigurationsprüfung meldet keinen Fehler
sensor.gasflasche_fullhohezeigt einen Wert in Millimeternsensor.gasflasche_fullstandzeigt eine plausible Prozentzahl- Die Messqualität steht auf 2 oder 3 — bei 0 oder 1 sitzt der Sensor nicht sauber