Skip to content

Jura Ena Micro 90 Commands v2

Andrew J Freyer edited this page May 7, 2024 · 1 revision

Introduction

Jura has implemented a transfer encoding that spreads data bytes through a number of other bytes. Explained here and here and here and here.

Each machine has a slightly different set of commands that it responds to and each machine appears to encode its sensor outputs differently. The following are inferred from testing, review of hydraulic system topology and review of schematics of other machines. I believe that these are correct, but it's likely there are some nuances I don't appreciate or haven't figured out yet.

I note that everywhere/everyone that discuss Jura commands cautions against using "AN:0A" as it purportedly erases the EEPROM. It doesn't appear that anyone has actually executed this command to be sure, however. Like others I heeded this warning, and did not test. It's not clear if that's a command that resets counters to zero, or completely erases all firmware in the machine entirely. I offer no advice or input on that question.

Useful Commands

Command Response Presumed Swiss German Acronym Description
"IC:" IC:hhhh Input Controller (??) Four (evidently) hexadecimal valus returned, corresponding to status of the input board
"RT:####" RT:0xhhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh Reihentest (??) Sixteen (evidently) hexadecimal values from EEPROM address specified at input
"RR:hh" RR:hhhh Read RAM (??) Possible ram values? Only some values change over time. [Investigating; not used]
"HZ:" HZ:bbbbbbbbbbb,hhhh,hhhh,hhhh,hhhh,hhhh,d,bbbbb Heißwasser-Zubereitung (??) Values related to hot water and steam preparation automations
"CS:" CS:hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh Circuits und Systeme (??) Sixteen (evidently) hexadecimal valus returned, corresponding digital system values and variables
"FA:hh" OK Funktion auswählen (??) Select a programmed operaiton of the machine to initiate (e.g., predetermined sequences of FN commands, like button presses or "brewgorup move to position")
"FN:hh" OK Funktion (??) Initate a mechanical function of the machine (be careful here)
"AS:" AS:hhhh hhhh,hhhh hhhh Analoger Sensor (??) Analog values of sensors (e.g., resistance of thermistors) [Investigating; not used]
"DI:" OK Drainage Init (??) Initialize the drainage/output valve (linear, servo-controlled, not ceramic valve)
"GB:" OK ?? Disable power board, shut down machine without rinsing
"MI:" OK Mischventil Initialisierung (??) Drainage valve move to initialization position
"MC:" OK Mischventil Condensat (??) Drainage valve move to condenser position
"MV:" OK Mischventil Validierung (??) Drainage valve validate position; (e.g., cycle through throw of server to reposition)
"TL:" TL:XXXXX ?? Software/firmware version number.
"TL:" TY:XXXXX ?? Software/firmware version number.

Interpretation "IC:"

Received via UART as a string, so references are from left to right as indexes of the corresponding char array:

String Index Bin Indexd Manipulation Interpretation
0 0 Single bit Drainage tray momentary switch
0 1 Single bit Bypass doser reed switch
0 2 Single bit Water tank reed switch
0 3 Single bit Bean hopper cover momentary switch
1 4 - 5 Bit pair Brew group spindle encoder pulse train/revolution counter
1 6 Single bit Flow meter pulse train/revolution counter
1 7 ????? Unknown
2 8 - 11 ????? Unknown
3 12 - 15 Bit pair Output valve servo position
  • IC [0]

    • Binary representation of hex value == four binary flags. From left to right (again, referenced as char array here; zero index on left; h = bbbb = 0123

      • [0] = bean hopper lid state; 0 = open; 1 = OK (momentary switch under vent on top of machine is closed)

      • [1] = water tank error; 0 = OK, 1 = problem (reed switch is in presence of foating magnet in reservior)

      • [2] = bypass doser; 0 = OK; 1 = bypass doser door open (reed switch is in presence of magnet in door)

      • [3] = drip tray removed; 1 = seated properly; 0 = open (momentary switch behind tray front is closed)

  • IC [1]

    • Flow meter and output valve encoder/revolution counter. Both iterate too quickly for the UART port to report, so the best we can do it seems is to consider whether the value is changing, ignoring the absolute value from any specific ping of the machine. Specifically:

      • [4] & [5] as decimal = revolution counter, changes between 0, 1, 2, 3 somewhat predictably, but not consistent enough for extracting absolute values because sampling cannot occur quickly enough.

      • [6] as binary switches between 1 and 0 when water is flowing through the system. Likely/possibly a raw output from a Hall Effect sensor within the flow meter (magnet vane proximate, or not, to sensor). Counting this value corresponds to volume through the machine, time, and volume corresponds generally to pressure within the hydraulic system.

      • [7] unknown; appears to always be 1.

  • IC [2]

    • [8][9][10][11] Unknown, appears to be always zero.
  • IC [3]

    • Brew group motor encoder/revolution counter. As with the servo, this appears to change very quickly, so the absolute value extracted from the machine is not a reliable indicator of position.

      • [12][13] Unknown, appears to be always zero.

      • [14][15] as decimal = revolution counter, changes between 0, 1, 2, 3 somewhat predictably, but not consistent enough for extracting absolute values. bit 14 = 1 and bit 15 = 0 when brew group is in "ready" position.


Interpretation "RT:0000"

This is the first word of the EEPROM at address 0000. Almost every byte is useful, but many have undiscovered purposes. Again, these are output by the machine as a string, so the indexing is from left to right, as an array of characters. Index 0 here is the left-most value output. Specifically:

RT:hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh 
   0    1    2    3    4    5    6    7    8    9    10   11   12   13   14   15
String Index Type Manipulation Intepretation
0 4-byte hex Convert to decimal lifetime count of espresso
1 4-byte hex Convert to decimal lifetime count of double espresso [not an option for ENA Micro 90; always zero; safe writable location??]
2 4-byte hex Convert to decimal lifetime count of coffee
3 4-byte hex Convert to decimal lifetime count of double coffee [not an option for ENA Micro 90; always zero; safe writable location??]
4 4-byte hex Convert to decimal lifetime count of cappuccino
5 4-byte hex Convert to decimal lifetime count of macchiato
6 4-byte hex Convert to decimal lifetime count of preground preparations
7 4-byte hex Convert to decimal lifetime count of low pressure pump operations (rinse operations?)
8 4-byte hex Convert to decimal lifetime count of cleaning cycles
9 4-byte hex Convert to decimal lifetime count of descaling cycles (???)
10 4-byte hex Convert to decimal lifetime count of brew group drive motor operations
11 4-byte hex ??? ???
12 4-byte hex ??? ???
13 4-byte hex Convert to decimal ??? -- possible count of water operations since descaling?
14 4-byte hex Convert to decimal count of spent grounds grounds since last tray empty
15 4-byte hex Convert to decimal count preparations since last clean

Interpretation "RT:0010"

This is the first word of the EEPROM at address 0010. Again, almost every byte is useful, but many have undiscovered purposes. As with other outputs, these are output by the machine as a string, so the indexing is from left to right, as an array of characters. Index 0 here is the left-most value output. Specifically:

RT:hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh 
   0    1    2    3    4    5    6    7    8    9    10   11   12   13   14   15
String Index Type Manipulation Intepretation
0 4-byte hex Convert to decimal high pressure pump operations (preparations + milk cleaning and venturi and steam operations)
1 4-byte hex ??? Changes frequently; relates to cleaning? Rinsing? Turn on?
2 4-byte hex ??? ???
3 4-byte hex Convert to decimal lifetime count of milk foam preparations (separate from milked coffee drinks)
4 4-byte hex Convert to decimal lifetime count of hot water preprations
5 4-byte hex Convert to decimal lifetime count of grinder operations
6 4-byte hex ??? Maybe related to cleaning???
7 4-byte hex ??? ???
8 4-byte hex ??? ???
9 4-byte hex ??? ???
10 4-byte hex ??? Appears to be 90 when a filter is required [under investigation]
11 4-byte hex Convert to decimal lifetime count of milk clean clean operations
12 4-byte hex ??? large number that iterates by 2s for each operation
13 4-byte hex ??? ???
14 4-byte hex ??? ???
15 4-byte hex ??? ???

Interpretation "RT:0020"

Investigated RT:0020 through 0060, and very few values appear to regularly change; RT:0020 worth continued investigation, but others likely not. [under investigation]

RT:hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh 
   0    1    2    3    4    5    6    7    8    9    10   11   12   13   14   15
String Index Type Manipulation Intepretation
0 4-byte hex ??? ???
1 4-byte hex ??? ???
2 4-byte hex ??? ???
3 4-byte hex ??? ???
4 4-byte hex ??? ???
5 4-byte hex ??? ???
6 4-byte hex ??? ???
7 4-byte hex ??? ???
8 4-byte hex ??? ???
9 4-byte hex Has water filter == 16 when water filter is installed and marked via the system menu
10 4-byte hex ??? ???
11 4-byte hex ??? ???
12 4-byte hex ??? ???
13 4-byte hex ??? ???
14 4-byte hex ??? ???
15 4-byte hex ??? ???

Interpretation "RR:XX"

Investigated RR:00 through FF, and very few values appear to regularly change, some change cyclically. [under investigation]

RT:hhhh
   0   
String Index Type Manipulation Intepretation
0 4-byte hex ??? ???

Interpretation "HZ:"

These values appear to relate to preparation of hot water and/or steam beverages. Not related just temperature, not related just to water. Presume the acronym is similar to Heißwasser-Zubereitung.

NOTE: Spaces added below for readability; spaces do not appear in output from machine. Commas do appear in the output from the machine.

RT:bbbbbbbbbbb, hhhh, hhhh, hhhh, hhhh, d, bbbbb
   ^            ^     ^     ^     ^     ^  ^
   0 - 11       12    13    14    15    16 17 - 22 <- parse index (binary as individual numbers, hex as ints, skip commas)
String Index Start Type Manipulation Intepretation
0 - 11 11-bit binary ??? Bitfield described below; not all bits discovered
12 4-byte hex decimal Output valve position
13 4-byte hex decimal Last water volume through pump (resets to zero before new preparation)
14 4-byte hex decimal Thermoblock temperature * 10
15 4-byte hex decimal Last brew operation / seems to be equivalent to RT:0000 [9]??
16 1 decimal decimal Integer position state of the ceramic valve; Know from part research (see Schematics that the ceramic valve can take roughly six different positions, which are divided between steam modes and non-steam modes (defined by water temperature coming out of the thermoblock). Positions are hot water, brew, block, condenser, venturi, or steam.
17 5-bit binary ??? Each bit corresponds to an error, some error states not known here.
  • HZ [0] - [11]

    • Binary, referenced as a char array (indexing from left to right, or MSB first as a binary number)

      • [0] = ??? always asserted?
      • [1] = ???
      • [2] = Rinse required == 1; After water rinse, goes to 0; durable on power loss
      • [3] = ??? may be 1 when venturi is active, maybe milk related/steam related?
      • [4] = Thermoblock preheated/at temperature
      • [5] = Thermoblock ready
      • [6] = Thermoblock in milk dispense mode
      • [7] = Venturi pumping
      • [8] = ??? unknown; on observation, does not appear to be related to rinse or water
      • [9] = ???
      • [10] = ???
      • [11] = ???

Interpretation "CS:"

Similar to an EEPROM word dump, we receive 64 bytes of information, most of which relates to circuitry and the system overall. [under investigation]

CS:hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh 
   0    1    2    3    4    5    6    7    8    9    10   11   12   13   14   15
String Index Type Manipulation Intepretation
0 4-byte hex integer / 10 Thermoblock temperature
1 4-byte hex decimal redundant to HZ re: linear actuator output valve postion
2 4-byte hex decimal redundant to HZ re: last pump water dispense
3 4-byte hex decimal brew program is ready?
4 4-byte hex binary presumption: multiple bitfields concatenated together here. See below.
5 4-byte hex binary presumption: multiple bitfields concatenated together here. See below.
6 4-byte hex ??? ???
7 4-byte hex ??? ???
8 4-byte hex ??? ???
9 4-byte hex ??? ???
10 4-byte hex ??? ???
11 4-byte hex ??? ???
12 4-byte hex ??? ???
13 4-byte hex ??? ???
14 4-byte hex ??? ???
15 4-byte hex ??? ???
  • CS [4]

    • Presumption is that multiple bitfields are merged together here. Referred to here by string index, left to right:

      h    h    h    h
      bbbb bbbb bbbb bbbb
      0    1    2    3
      
    • CS [4][0] = identical to ceramic valve position integer from HZ

    • CS [4][1] = status of thermoblock ???

    • CS [4][2] - [4][3] = duty cycle of thermoblock (appears to always be on full duty)

  • CS [5]

    • Presumption is that multiple bitfields are merged together here. Referred to here by string index, left to right:

      h    h    h    h
      bbbb bbbb bbbb bbbb
      0    1    2    3
      
    • CS [5][0] - [5][1] = duty cycle of pump. Shifts from PEP pumping, to 50% duty for water to ~16% duty for venturi operations; may update a status field to characterize pumping type.

    • CS [5][2] = pump status; 1111 = on, 0000 = off

    • CS [5][3] = grinder is active when 0d3, 0b0011


Interpretation "AS:"

These values appear to correspond to analog readings of the thermistors coupled to the ceramic valve. In other words, they're inversely correlated to the ceramic valve and thermoblock thermistor values, respectively. Still under investigation.


Interpretation "FN:XX"

Commands that test the function of individual parts of the machine.

Command Description
FN:01 Pump on at full duty cycle
FN:02 Pump off
FN:07 Grinder on
FN:08 Grinder off
FN:0D Init brewgroup
FN:22 Brewgroup to brew position
FN:0B Brewgroup to tamping position, begin tamping
FN:0C Stop tamping
FN:1D Drain valve on
FN:1E Drain valve off
FN:24 Thermoblock ON ?? NOTE - will trip a thermal shutoff quickly; tread with caution.
FN:25 Thermoblock OFF
FN:29 Vent steam

See Jutta Proto for more possible commands; many of these I tested and many work just fine, but were not interesting to me by design - I'm not interested in a totally custom brew sequence when we can manipulate existing preparation sequence in real time by manipulating button presses.


Interpretation "FA:XX"

Commands that test higher order functions of the input board, such as button presses.

Command Description
FA:01 Power off with rinse
FA:02 Press rotary to confirm displayed prompt
FA:03 Press rotary to when in ready state to launch settings menu
FA:04 Press rotary to select currently displayed menu item
FA:05 Rotate rotary right (advance menu in first direction)
FA:06 Rotate rotary left (advance menu in second direction)
FA:07 Press "ESPRESSO" button to execute appropriate preparation sequence
FA:08 Press "CAPPUCCINO" button to execute appropriate preparation sequence
FA:09 Press "COFFEE" button to execute appropriate preparation sequence
FA:0A Press "MACCHIATO" button to execute appropriate preparation sequence
FA:0B Press "WATER" button to execute appropriate preparation sequence
FA:0C Press "MILK" button to execute appropriate preparation sequence

Interpretation "TY:"

Returns version number.


Interpretation "TL:"

Returns another version number.