Combine the pulse meter sensor with the Analog Threshold Binary Sensor

Hey guys,
I‘m currently reading my gas meter with a QMC5883L magnetometer. So far so good.
For that scenario I was thinking about combining the pulse meter sensor with the Analog Threshold Binary Sensor. So the threshold of the magnetometer could come up with a boolean value each time the magnetometer exceeds a certain threshold. Now how could I geht that pulse to the pulse meter sensor without bridging pins?

A pulse meter is binary; it already creates two states. There is no “threshold” to set.

If you wanted to do something for each pulse then a Template Binary Sensor would allow you to create an additional output in what every from you wish.

To answer your question The Analog Threshold Binary Sensor requires you to set the sensor_id (the pulse meter id) that you have already created.

  • sensor_id (Required, ID): The ID of the source sensor.

Hello, I think that you do not need the pulse sensor to achieve what you want.
I solved this as follows:

substitutions:
  # Project Name, upper/lowercase characters, digits and underscores.
  project_name: "laundry-sensor"
  project_id: 'sensor_laundry'
  # Set calibration_off to 'false' in order to send magnetometer raw data to HA. This makes the calibration easy.
  # Once the calibration is ok (no pulses lost) then it can be set to 'true'.
  calibration_off: 'false'
  threshold_upper: '400'
  threshold_lower: '200'
  # which sensor to use for pulse detection
  magnetometer: "${project_id}_hmc5883lz"

preferences:
  # Lower the default flash write interval in order to avoid flash wear out as global variables get written to flash every ${flash_write_interval}
  flash_write_interval: 30min

api:
  # By calling this service from HA you can set the value of the counter according to the reading of your meter.
  # HA - Developer Tools - Services - ESPHome: ${project_id}_set_gas_counter_total - set value with decimal point
  services:
    - service: set_gas_counter_total
      variables:
        counter_actual: float
      then:
        - globals.set:
            id: counter_total
            value: !lambda 'return counter_actual;'
        - logger.log:
            format: "Service set_gas_counter_total called from HA: counter_actual (esp:counter_total) has been set to: %.2f"
            args: [id(counter_total)] 

globals:
   - id: counter_total
     type: double
     restore_value: yes

sensor:
# Magnetometer
  - platform: hmc5883l
    address: 0x1e
# axis X  
    field_strength_x:
      name: "${friendly_name} - Magnetic field x"
      id: ${project_id}_hmc5883lx
      accuracy_decimals: 0
      internal: ${calibration_off}
# axis Y    
    field_strength_y:
      name: "${friendly_name} - Magnetic field y"
      id: ${project_id}_hmc5883ly
      accuracy_decimals: 0
      internal: ${calibration_off}
# axis Z    
    field_strength_z:
      name: "${friendly_name} - Magnetic field z"
      id: ${project_id}_hmc5883lz
      accuracy_decimals: 0
      internal: ${calibration_off}
    oversampling: 8
    range: 810uT
    update_interval: 1s
# Gas total
  - platform: template
    name: "${friendly_name} - Gas total m3"
    id: "${project_id}_gas_total"
    lambda: |-
      return id(counter_total);
    update_interval: 15s
    unit_of_measurement: "m³"
    accuracy_decimals: 2
    icon: 'mdi:fire'
    device_class: gas
    state_class: total_increasing

binary_sensor:
# Generate pulses representing the rotation of the magnet
# This sensor converts the analog value of the given sensor value to a binary signal using hysteresis. The binary sensor will:
#  - turn to 'off' if the value drops below threshold/low 
#  - turn to 'on' if the value raises above threshold/high
# Every off -> on transition will trigger on_press, which increments the value of 'counter_total'
# Set the threshold below
  - platform: analog_threshold
    name: "${friendly_name} - Gas magnet"
    sensor_id: ${magnetometer}
    threshold:
      upper: ${threshold_upper}
      lower: ${threshold_lower}
    on_press:
      then:
        - lambda: |-
            id(counter_total) += 0.01;

hey @ZsZs73 ,
thank you for sharing you solution! The sensor I’m using isn’t binary so I had to wiggle around with templates as @JulianDH mentioned.

I also do not use a binary sensor (like a reed) to detect the rotation of the magnet, but the very same QMC5883L magnetometer like you.
The following component

binary_sensor:
  - platform: analog_threshold

in my code above is the one which converts the analog value read from the magnetometer (${project_id}_hmc5883lz) to binary values with some histeresys and icreases the value of the previously defined counter_total global variable via the on_press: trigger.

I actually went over to using AI-on-the-edge-device because it is way more solid. I’ve lost intervals over the time due to restarts or other reasons.