Control your Jura coffee machine

Thanks guys. I have had some success with the Jura X9 Impressa.
There is a connector on the steam generator relay board beside the DB9 connector.
For the life of me, I could not make heads or tails of the read eeprom responses - they do not seem to reflect the brew counter counts shown on the display. Also the tray water/status is inconsistent and not representative of the machine.

The important part is that I can brew products and turn the machine on and off.
I used a NodeMCU clone without level shifters, getting the power from the same header (5v) to vin pin, and knock on wood - it’s chooching away with the 5v Rx and 3v Tx.

I created alexa voice routines to properly stack the multi-brews required and used the scheduler component to turn the machine on and off on work-mornings automatically.

# disable serial logging when using GPIO01/03
logger:
  baud_rate: 0
uart:
  tx_pin: GPIO1
  rx_pin:
    number: GPIO3
    inverted: no
  baud_rate: 9600
  #debug:
    #direction: BOTH
    #dummy_receiver: false
    #after:
    #  delimiter: "\n"
    #sequence:
    #  - lambda: UARTDebug::log_string(direction, bytes);
  id: uart_bus
  #rx_buffer_size: 512

#stream_server:
#   uart_id: uart_bus
#   port: 1234

switch:
  - platform: template
    name: 'Coffee Maker'
    icon: "mdi:coffee-maker"
    id: jura_on_off_switch
    turn_on_action:
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFF, 0xDB, 0xDF]  ## 'N'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xFF, 0xDB]  ## '1'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'
    turn_off_action:
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFF, 0xDB, 0xDF]  ## 'N'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xFB, 0xDB, 0xFF, 0xDB]  ## '2'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'
    optimistic: true
    assumed_state: true
button:
  - platform: template
    name: 'Select Decaffe'
    icon: "mdi:cup-water"
    id: jura_select_decaffe
    on_press:
      - uart.write: [0xFB, 0xDF, 0xDB, 0xDF]  ## 'F'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xFF, 0xDB, 0xFF, 0xDB]  ## '3'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'
      - delay: 1000ms
      - uart.write: [0xFB, 0xDF, 0xDB, 0xDF]  ## 'F'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xFF, 0xDB, 0xFF, 0xDB]  ## '3'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'
  - platform: template
    name: 'Brew Coffee'
    icon: "mdi:cup-water"
    id: jura_make_coffee
    on_press:
      - uart.write: [0xFB, 0xDF, 0xDB, 0xDF]  ## 'F'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xFF, 0xDB]  ## '1'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'
  - platform: template
    name: 'Brew Espresso'
    icon: "mdi:cup-water"
    id: jura_make_espresso
    on_press:
      - uart.write: [0xFB, 0xDF, 0xDB, 0xDF]  ## 'F'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xFB, 0xDB, 0xFF, 0xDB]  ## '2'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'
  - platform: template
    name: 'Brew Double'
    icon: "mdi:cup-water"
    id: jura_make_double
    on_press:
      - uart.write: [0xFB, 0xDF, 0xDB, 0xDF]  ## 'F'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xDB, 0xDF, 0xFF, 0xDB]  ## '4'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'

sensor:
  - platform: uptime
    name: "Uptime"

  - platform: wifi_signal
    name: "WiFi Signal"
    update_interval: 60s

Thanks guys. I have had some success with the Jura X9 Impressa.
There is a connector on the steam generator relay board beside the DB9 connector.
For the life of me, I could not make heads or tails of the read eeprom responses - they do not seem to reflect the brew counter counts shown on the display. Also the tray water/status is inconsistent and not representative of the machine. The commands do come back starting with a lower-case of what I sent… so it’s not a serial line readback issue as far as I can tell.

The important part is that I can brew products and turn the machine on and off.
I used a NodeMCU clone without level shifters, getting the power from the same header (5v) to vin pin, and knock on wood - it’s chooching away with the 5v Rx and 3v Tx.

I created alexa voice routines to properly stack the multi-brews required and used the scheduler component to turn the machine on and off on work-mornings automatically.

# disable serial logging when using GPIO01/03
logger:
  baud_rate: 0
uart:
  tx_pin: GPIO1
  rx_pin:
    number: GPIO3
    inverted: no
  baud_rate: 9600
  #debug:
    #direction: BOTH
    #dummy_receiver: false
    #after:
    #  delimiter: "\n"
    #sequence:
    #  - lambda: UARTDebug::log_string(direction, bytes);
  id: uart_bus
  #rx_buffer_size: 512

#stream_server:
#   uart_id: uart_bus
#   port: 1234

switch:
  - platform: template
    name: 'Coffee Maker'
    icon: "mdi:coffee-maker"
    id: jura_on_off_switch
    turn_on_action:
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFF, 0xDB, 0xDF]  ## 'N'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xFF, 0xDB]  ## '1'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'
    turn_off_action:
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFF, 0xDB, 0xDF]  ## 'N'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xFB, 0xDB, 0xFF, 0xDB]  ## '2'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'
    optimistic: true
    assumed_state: true
button:
  - platform: template
    name: 'Select Decaffe'
    icon: "mdi:cup-water"
    id: jura_select_decaffe
    on_press:
      - uart.write: [0xFB, 0xDF, 0xDB, 0xDF]  ## 'F'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xFF, 0xDB, 0xFF, 0xDB]  ## '3'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'
      - delay: 1000ms
      - uart.write: [0xFB, 0xDF, 0xDB, 0xDF]  ## 'F'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xFF, 0xDB, 0xFF, 0xDB]  ## '3'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'
  - platform: template
    name: 'Brew Coffee'
    icon: "mdi:cup-water"
    id: jura_make_coffee
    on_press:
      - uart.write: [0xFB, 0xDF, 0xDB, 0xDF]  ## 'F'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xFF, 0xDB]  ## '1'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'
  - platform: template
    name: 'Brew Espresso'
    icon: "mdi:cup-water"
    id: jura_make_espresso
    on_press:
      - uart.write: [0xFB, 0xDF, 0xDB, 0xDF]  ## 'F'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xFB, 0xDB, 0xFF, 0xDB]  ## '2'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'
  - platform: template
    name: 'Brew Double'
    icon: "mdi:cup-water"
    id: jura_make_double
    on_press:
      - uart.write: [0xFB, 0xDF, 0xDB, 0xDF]  ## 'F'
      - delay: 8ms
      - uart.write: [0xDF, 0xDB, 0xDB, 0xDF]  ## 'A'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xFF, 0xDB]  ## ':'
      - delay: 8ms
      - uart.write: [0xDB, 0xDB, 0xFF, 0xDB]  ## '0'
      - delay: 8ms
      - uart.write: [0xDB, 0xDF, 0xFF, 0xDB]  ## '4'
      - delay: 8ms
      - uart.write: [0xDF, 0xFF, 0xDB, 0xDB]  ## '\r'
      - delay: 8ms
      - uart.write: [0xFB, 0xFB, 0xDB, 0xDB]  ## '\n'

sensor:
  - platform: uptime
    name: "Uptime"

  - platform: wifi_signal
    name: "WiFi Signal"
    update_interval: 60s

Hiya. I have managed to flash ESPHome on the official wifi dongle, but im not sure whats next. I looked at the github repo which you posted and it seems its for custom made ESP32 connected to the service port, not the official module? Im not sure what config i should put in ESPHome to flash it onto the original wifi dongle, besides that status_led and uart you have posted above.
Particularly, what should i do with .py and .h files?

Hey, I’ve had a Jura impressa F7 (F-series) for years and have been running a variant of the RyanAlden github code on it for years. I run it on a Wemos D1 as the post starts.

But in the past few weeks I’ve made a lot of improvements to it. I can now read a lot more sensors (almost all counter positions!) namely:

  • Single espresso
  • Double espresso
  • Single coffee
  • Double coffee
  • Single cappuccino (*)
  • Single ristretto (*)
  • Double ristretto (*)
  • Movements of the brewing unit (*)
  • Cleanings performed
  • Descaling performed (*)
  • Number of coffee grounds in the drawer (*)

(*) all these sensors are new compared to the original esphome interaction from Ryan Alden

I also optimized it more for the small SRAM memory that a Wemos D1 (8266 chip) has. I’m going to continue with it myself. i still miss the counters for:

  • hot water
  • steam usage

i also want to port it to an ESP32 chip so you can use more SRAM and have a separate dedicated UART port.

It’s still a work in progress, so if you have any improvements, feel free to post a pull request or “issue” on github!

P.S. the release is a stable version but does not contain all the latest found sensors and SRAM optimizations. and for the ESP32 variant a new branch has been created.

link to my repository: GitHub - alco28/Jura-F7-ESPHOME: Automate your Jura Impressa F* coffee machine. gives full control of all options and counts your consumption.