Binary GPIO Sensor Status abfragen

Hallo,

ich bin gerade dabei meine Kaffeemaschine Delonghi Magnifica S smart zu machen.
Ich benutze einen ESP 32 und Optokoppler um den LED Status der Maschine auslesen zu können. Das funktioniert so weit ganz gut, ich scheitere jedoch den Status der Maschine korrekt anzuzeigen.

Geplant ist es so:

  • wenn beide LED (Kaffe und Espresso) leuchten, ist die Maschine bereit,
  • wenn nur eine LED leuchtet, wird gerade zubereitet,
  • und wenn beide aus sind, ist die Maschine nicht bereit.

Der Status soll dann in einem Text Sensor “status_kaffee” ausgegeben werden

Ich habe das ganze mal auf einem Experimentierboard aufgebaut.
Der Status Bereit, nicht bereit wird angezeigt die Zubereitung jedoch nicht. Ich vermute, dass der ESP nur den einen GPIO als Änderung betrachtet und somit nicht die Prüfung wie im “lamda”-Teil durchführt.
Hat wer eine Idee wie ich das richtig machen kann?

hier der Code

captive_portal:
  
binary_sensor:
  - platform: gpio
    pin: GPIO27
    id: led_espresso
    name: "Status LED Espresso"
    entity_category: diagnostic
    icon: mdi:led-outline
    disabled_by_default: false
    publish_initial_state: true
    filters:
        #delayed_on_off: 100ms



  - platform: gpio
    pin: GPIO25
    id: led_kaffee
    name: "Status LED Kaffe"
    entity_category: diagnostic
    icon: mdi:led-outline
    disabled_by_default: false
    publish_initial_state: true
    filters:
        #delayed_on_off: 100ms
 

  - platform: template
    name: "Zubereitung Kaffee"
    lambda: |-
      if (id(led_kaffee).state == 1 && id(led_espresso).state == 0) {
        return true;
      } else {
        return false;
      }
    on_state:
      - logger.log: "Zubereitung Kaffee"
      - text_sensor.template.publish:
          id: status_kaffee
          state: "Zubereitung Kaffee"

  - platform: template
    name: "Zubereitung Espresso"
    lambda: |-
      if (id(led_kaffee).state == 0 && id(led_espresso).state == 1) {
        return true;
      } else {
        return false;
      }
    on_state:
      - logger.log: "Zubereitung Espresso"
      - text_sensor.template.publish:
          id: status_kaffee
          state: "Zubereitung Espresso"
  
  - platform: template
    name: "Maschine bereit"
    lambda: |-
      if (id(led_kaffee).state == 1 && id(led_espresso).state == 1) {
        return true;
      } else {
        return false;
      }
    on_state:
      - logger.log: "Maschine Bereit"
      - text_sensor.template.publish:
          id: status_kaffee
          state: "Maschine Bereit" 
  
  - platform: template
    name: "Maschine nicht bereit"
    lambda: |-
      if (id(led_kaffee).state == 0 && id(led_espresso).state == 0) {
        return true;
      } else {
        return false;
      }
    on_state:
      - logger.log: "Maschine nicht Bereit / ausgeschaltet"
      - text_sensor.template.publish:
          id: status_kaffee
          state: "Maschine nicht Bereit / ausgeschaltet"
  
  - platform: gpio
    pin: GPIO32
    name: "Status Led Wassertank"
    entity_category: diagnostic
    icon: mdi:led-outline
    disabled_by_default: true
    publish_initial_state: true
    filters:
        delayed_on_off: 100ms
    on_multi_click:
      - timing: # Wassertank ok
          - OFF for at least 2000ms
        then:
          - logger.log: "Wasser OK"
          - text_sensor.template.publish:
              id: status_wassertank
              state: "Wasser OK"

      - timing: # Wassertank fehlt
          - ON for at least 2000ms
        then:
          - logger.log: "Wassertank fehlt"
          - text_sensor.template.publish:
              id: status_wassertank
              state: "Wassertank fehlt"

      
      - timing: # Wassertank leer
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms 
        then:
          - logger.log: "Wassertank leer"
          - text_sensor.template.publish:
              id: status_wassertank
              state: "Wassertank leer"
        invalid_cooldown: 500ms
  

  - platform: gpio
    pin: GPIO12
    name: "Status Led Satzbehälter"
    entity_category: diagnostic
    icon: mdi:led-outline
    disabled_by_default: true
    publish_initial_state: true
    filters:
        delayed_on_off: 100ms
    on_multi_click:
      - timing: # Satzbehälter ok
          - OFF for at least 2000ms
        then:
          - logger.log: "Satzbehälter OK"
          - text_sensor.template.publish:
              id: status_satzbehalter
              state: "Satzbehälter OK"

      - timing: # Satzbehälter fehlt
          - ON for at least 2000ms
        then:
          - logger.log: "Satzbehälter fehlt"
          - text_sensor.template.publish:
              id: status_satzbehalter
              state: "Satzbehälter fehlt"


      - timing: # Wassertank leer
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms
        - ON for 200ms to 270ms
        - OFF for 200ms to 270ms 
        then:
          - logger.log: "Satzbehälter voll"
          - text_sensor.template.publish:
              id: status_satzbehalter
              state: "Satzbehälter voll"
        invalid_cooldown: 500ms


# Binary Sensor für eingeschaltet/aufheizen fehlt noch eventuell nicht notwendig????

output:
  - platform: gpio
    pin: GPIO14 # Ein Aus Schalter
    id: relay_1
  - platform: gpio
    pin: GPIO4 # Espresso Schalter
    id: relay_2
  - platform: gpio
    pin: GPIO33 # Kaffe Jenny Schalter
    id: relay_3

button:
  - platform: output
    output: relay_1 # Ein und ausschalten der Maschine
    id: button_1
    disabled_by_default: false
    duration: 200ms
    name: "Ein/Aus"
    icon: "mdi:power"
  - platform: output
    output: relay_2
    id: button_2
    disabled_by_default: false
    duration: 200ms # Espresso machen
    name: "Espresso"
    icon: "mdi:coffee"
  - platform: output
    output: relay_3
    id: button_3
    duration: 200ms # Jenny Kaffee machen
    name: "Kaffee"
    icon: "mdi:coffee"

# # Sensors for ESP version and WIFI information

text_sensor:

  - platform: template
    icon: mdi:information-outline
    id: status_kaffee
    name: "Status Kaffee"

  - platform: template
    icon: mdi:information-outline
    id: status_wassertank
    name: "Status Wassertank"

  - platform: template
    icon: mdi:information-outline
    id: status_satzbehalter
    name: "Status Satzbehälter"

  # Installed version
  - platform: template
    name: "Device Version"
    id: device_version
    icon: "mdi:label-outline"
    entity_category: diagnostic
    lambda: |-
      return {"${project_version}"};
    update_interval: 6h
  # ESPHome version
  - platform: version
    hide_timestamp: true
    name: 'ESPHome Version'
  # IP address and connected SSID
  - platform: wifi_info
    ip_address:
      name: 'IP Address'
      icon: mdi:wifi
    ssid:
      name: 'SSID'
      icon: mdi:wifi-strength-2

sensor:
  # Uptime
  - platform: uptime
    name: Uptime Sensor
  # WiFi signal
  - platform: wifi_signal
    name: "WiFi Signal"
    update_interval: 120s