MW oven Siemens BF634LGS1 + ESPhome to silence the beeper (faking button press)

Hi, I have a Siemens BF634LGS1 microwave oven. It heats fine (like the inverter for lower power outputs) but I feel like the user interface has been programmed by somebody who never used any MW over in his life, nor the final product has been ever tested in real life scenario.

Over the time I own this oven I slowly stared to hate the fact it beeps for like 20seconds after it finishes heating. beepiip…beepiip…beepiip… To make it even worse, there is actually a setting in the menu on how long it should beep! But even if set to minimum duration it is still around 20seconds! And there is not even a “mute” function.

I decided to do something about it. Disassembly is not too complicated.

  1. remove the front knob by just prying it out.
  2. remove the metal chassis (multiple screws all around)
  3. disconnect wire from main electronics module to the front panel
  4. remove the front panel by unscrewing 2 torx screws on both sides then lift it up and out
  5. from the front panel you must free the actual circuit board. IT is held by multiple plastic clips so slowly one by one unclip them and lift the PCB out. Don’t loose 4 small springs that press against the PCB. They are just inserted in the plastic panel and fall out if you tilt the panel without the PCB inserted!
    (sorry don’t have detailed photos of the disassembly)


Now what?
First I was thinking about completely disconnecting the beeper but then I got more sophisticated idea:
The beeping can be stopped by pressing any button on the oven. So I decided to fake button press of the “timer” button. If you press it once it opens menu to select timer. And if you press it again it disappears again. Perfect!
The buttons are connected to 3.3V (more specifically 3.15V as marked on the silkscreen) on one side and to microprocessor on the other. They are NO and when pressed they close allowing 3.3V on the microcontroller input. That is actually great to spoof - just connect your 3.3V and button is pressed! While I was at it I also traced and spoofed the “open door” button (yes, the oven opens the door electrically)

Now another problem: How to detect the MW oven finished heating? Well there is a handy LED (2 LEDs) above the “start” button that lights up while running.


I measured the voltages and then actually traced the LED signal to power transistor (Q1133) that was driven using 3.3V from the microcontroller. Transistor opens to GND and current flows from 6V power rail through the resistor, LED, transistor to the GND.

There are even handy testpoints for all the signals I need on the back of the board!

I then placed ESP8266, power and ground can be sourced by some unused card edge connector. ESP8266 is glued using silicone.

I then flashed very simple code that fakes the button press 1second after it detects end of heating. By allowing 1second it beeps once (beepiip) and then it is silenced! This could be of course done without Home assitatnt or ESPhome just by simple MCU but I wanted the ability to flash new settings or even open the oven remotely! And as a bonus I see in HA if the oven is running or not!
obrazek

...
output:
  - platform: gpio
    pin: D6
    id: d6_out

  - platform: gpio
    pin: D5
    id: d5_out
button:
  - platform: output
    name: "button_timer"
    id: button_timer
    output: d5_out
    duration: 100ms

  - platform: output
    name: "button_door"
    output: d6_out
    duration: 100ms



binary_sensor:
  - platform: gpio
    pin: D2
    name: "MW running"
    device_class: power    
    on_release:
      then:
      - delay: 1s
      - button.press: button_timer
      - delay: 200ms
      - button.press: button_timer

I could also open the door automatically once it finishes by pressing the “door” button but it is not implemented yet.

Future improvement I can think of:
Monitor the actual “door button” to determine if the door has been opened since the end of heating. If not, send notification, open the door automatically or just hijack another part of the circuit to flash LEDs etc to draw attention to the oven. (damnit! I should have done it when I had the oven opened!)

Few detailed photos and IDs in case anybody finds this topic while repairing the oven for example :slight_smile:

Front panel ID: E890L42A7SGS
PCB ID: MI003D1XB03D
PCB NO: J657542A5GS
Assembly ID:J605Q42A9SGS




Implemented some improvements. Door is automatically opened at the end of heating BUT only if you press “info” button. It can be pressed before you start heating or after. Might reverse the logic if it proves to be good feature in long term use.

The logic is that I monitor “door open” button and have a template switch door_open_request" as variable. After pressing “info” the switch is turned on and after pressing (either by actual button or by esphome) “open door” it is turned off.

Hardware modification was needed to get the “info” button on D1 and I also bridged D6 and D7 (door open button). I am not sure if I could take one GPIO as output and input at the same time so just to be sure I used one for output (opening the door) and one for readback if the button has been pressed.

Also implemented “stay awake” function so the oven stays ON and does not go to sleep after 30minutes of inactivity - used simple interval function to press “timer button” every 29minutes.
This is done for 2reasons:
A) the oven makes a sound when it turns off which is terrible specially at night
B) it takes few seconds to boot up. Even if you press button to open door, it takes few seconds to open. Bit frustrating
C) I doubt it takes less power in “powered down” state as the LCD is still illuminated showing time and date. Might check real consumption later but doubt it will be significant

Simple interval function is bit crude as it does not take into account the last time you interacted with the oven so later I might make some more refined procedure that takes the last change (door opened/info pressed…) and takes 29minutes from this time.

Updated code:

output:
  - platform: gpio
    pin: D6
    id: d6_out

  - platform: gpio
    pin: D5
    id: d5_out
button:
  - platform: output
    name: "button_timer"
    id: button_timer
    output: d5_out
    duration: 90ms

  - platform: output
    name: "button_door"
    id: button_door
    output: d6_out
    duration: 90ms



binary_sensor:
  - platform: gpio
    pin: D2
    name: "MW running"
    device_class: power    
    on_release:
      then:
      - if:
          condition:
            switch.is_on: door_open_request
          then:
            - delay: 1s
            - button.press: button_door
          else:
            - delay: 1s
            - button.press: button_timer
            - delay: 200ms
            - button.press: button_timer



  - platform: gpio
    pin: D7
    name: "Door Pressed"
    on_press:
      then:
      - switch.turn_off: door_open_request    


  - platform: gpio
    pin: D1
    name: "Info Pressed"
    on_press:
      then:
      - switch.turn_on: door_open_request

 

switch:
  - platform: template
    name: "Door Open Request"
    id: door_open_request
    optimistic: true


interval:
  - interval: 29min
    startup_delay: 60s
    then:
      - button.press: button_timer
      - delay: 200ms
      - button.press: button_timer