Category Archives: BBQ / Smoker / Food

Waveshare Epaper ESPHOME and Mqtt Notification over secure mqtt

UPDATE: AccessPoint on Arduino implemented with captive portal for Wifi Configuration

Got my Waveshare Epaper Cloud running on ESPHome

This is a Epaper display with a 2000mAh Lipo and a passive buzzer.
Running parts of my Smoker monitor.

Below a little movie clip with RTTTL sound notification.
(Send from Home Assistant)
B.t.w. RTTTL are those ringtones we used to have. (Ring Tone Text Transfer Language)

Sending from HA

Parts of the ESPHOME Yaml
NOTE: For the time, you need the time integration to get hours:minutes as a sensor!

esphome:
  name: epaperesp32

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  services:
    - service: play_rtttl
      variables:
        song_str: string
      then:
        - rtttl.play:
            rtttl: !lambda 'return song_str;'

output:
  - platform: ledc
    pin: GPIO22
    id: rtttl_out

rtttl:
  output: rtttl_out
  on_finished_playback:
    - logger.log: 'Song ended!'

ota:
  password: "xxxxxxxxxxxxxxxxxxxxxxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Epaperesp32 Fallback Hotspot"
    password: "xxxxxxxxxxxxxxxxx"

captive_portal:

font:
  - file: 'fonts/tahoma.ttf'
    id: font1
    size: 16
  - file: 'fonts/tahoma.ttf'
    id: font2
    size: 32

sensor:
  - platform: adc
    pin: GPIO36
    name: "epaperesp32 Battery voltage"
    id: battery_voltage
    icon: mdi:battery
    device_class: voltage
    attenuation: auto 
    filters:
     - multiply: 3
    update_interval: 60s

text_sensor:
  - platform: homeassistant
    entity_id: sensor.bbqenv
    name: "mystate"
    id: mystate
    internal: true
  - platform: homeassistant
    entity_id: sensor.bbqcore
    name: "mystate1"
    id: mystate1
    internal: true
  - platform: homeassistant
    entity_id: sensor.time
    name: "mytime"
    id: mytime
    internal: true

spi:
  clk_pin: GPIO13
  mosi_pin: GPIO14

binary_sensor:
  - platform: gpio
    pin:
      number: GPIO12
      inverted: true 
      mode:          
        input: true
        pullup: true
    name: "epaperesp32 button"
    filters:
      - delayed_on: 50ms
    on_press:
      - logger.log: "Button pressed"

display:
  - platform: waveshare_epaper
    cs_pin: GPIO15
    dc_pin: GPIO27
    busy_pin: GPIO25
    reset_pin: GPIO26
    model: 2.13in-ttgo
    rotation: 270
    full_update_every: 12
    update_interval: 10s
    lambda: |-
      it.print(0, 0, id(font2), "BBQ Meter V3");
      it.printf( 35, 32, id(font2), "%s", id(mystate).state.c_str());
      it.printf( 155, 32, id(font2), "%s", id(mystate1).state.c_str());

MQTT Notifier over Internet

This is part of a test where my friends and me can have notifications LEDs over the internet.

Using certificate parts from:
Controlling the led will be done using Mattermost webhooks, or slashcommand with custom scripting.
(Mattermost is my own hosted chat server)

I flashed a Wemos with below code:
(Rotary/display/button part removed.)

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <time.h>
#include <PubSubClient.h>
#include <Adafruit_NeoPixel.h>

#define encoderCLK 5   //D1
#define encoderDT 4    //D2
#define rgbled D4       //D4

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, rgbled, NEO_RGB + NEO_KHZ400);

int servoAngle = 0;
int crntCLK;
int prvsCLK;

String myString;
char ang[50];


#ifndef SECRET
const char ssid[] = "MYSSID";
const char pass[] = "MYPASS";

#define HOSTNAME "henrimqtt"

const char MQTT_HOST[] = "www.henriaanstoot.nl";
const int MQTT_PORT = 9883;
const char MQTT_USER[] = "xxxxxx"; // leave blank if no credentials used
const char MQTT_PASS[] = "xxxxxx"; // leave blank if no credentials used

const char MQTT_SUB_TOPIC[] = "notification/" HOSTNAME "/in";
const char MQTT_PUB_TOPIC[] = "notification/" HOSTNAME "/out";
const char MQTT_PUB_TOPIC_angle[] = "notification/" HOSTNAME "/send";

#ifdef CHECK_CA_ROOT
static const char digicert[] PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIFtTCCA52gAwIBAgIUXEEQRLHhYox8a95YiAYX/wQ/XeMwDQYJKoZIhvcNAQEN
//--------------- SNIP SNIP ... generated cert here
vht8GyCCgCH55Syvy9ls6gCyLjTT2rtllw==
-----END CERTIFICATE-----
)EOF";
    #endif

    #ifdef CHECK_PUB_KEY
    // Extracted by: openssl x509 -pubkey -noout -in ca.crt
    static const char pubkey[] PROGMEM = R"KEY(
    -----BEGIN PUBLIC KEY-----
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    xxxxxxxx
    -----END PUBLIC KEY-----
    )KEY";
    #endif

    #ifdef CHECK_FINGERPRINT
        // Extracted by: openssl x509 -fingerprint -in ca.crt
    static const char fp[] PROGMEM = "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD";
    #endif
#endif

//////////////////////////////////////////////////////

#if (defined(CHECK_PUB_KEY) and defined(CHECK_CA_ROOT)) or (defined(CHECK_PUB_KEY) and defined(CHECK_FINGERPRINT)) or (defined(CHECK_FINGERPRINT) and defined(CHECK_CA_ROOT)) or (defined(CHECK_PUB_KEY) and defined(CHECK_CA_ROOT) and defined(CHECK_FINGERPRINT))
  #error "cant have both CHECK_CA_ROOT and CHECK_PUB_KEY enabled"
#endif

BearSSL::WiFiClientSecure net;
PubSubClient client(net);

time_t now;
unsigned long lastMillis = 0;

void mqtt_connect()
{
  while (!client.connected()) {
    Serial.print("Time: ");
    Serial.print(ctime(&now));
    Serial.print("MQTT connecting ... ");
    if (client.connect(HOSTNAME, MQTT_USER, MQTT_PASS)) {
      Serial.println("connected.");
      client.subscribe(MQTT_SUB_TOPIC);
    } else {
      Serial.print("failed, status code =");
      Serial.print(client.state());
      Serial.println(". Try again in 5 seconds.");
      /* Wait 5 seconds before retrying */
      delay(5000);
    }
  }


}

void receivedCallback(char* topic, byte* payload, unsigned int length) {
    //  pixels.clear(); // Set all pixel colors to 'off'
 
  Serial.print("Received [");
  Serial.print(topic);
  Serial.print("]: ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
if (!strncmp((char *)payload, "0", length)) {
       pixels.setPixelColor(0, pixels.Color(0, 0, 0));
      pixels.show();   // Send the updated pixel colors to the hardware.
}
if (!strncmp((char *)payload, "1", length)) {
       pixels.setPixelColor(0, pixels.Color(150, 0, 0));
      pixels.show();   // Send the updated pixel colors to the hardware.
}
if (!strncmp((char *)payload, "2", length)) {
       pixels.setPixelColor(0, pixels.Color(0, 0, 150));
      pixels.show();   // Send the updated pixel colors to the hardware.
}
if (!strncmp((char *)payload, "3", length)) {
       pixels.setPixelColor(0, pixels.Color(0, 150, 0));
      pixels.show();   // Send the updated pixel colors to the hardware.
}
}

void setup()
{
  pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)

  pinMode (encoderCLK,INPUT_PULLUP);
  pinMode (encoderDT,INPUT_PULLUP);
  prvsCLK = digitalRead(encoderCLK);
  Serial.begin(115200);
  Serial.println();
  Serial.println();
  Serial.print("Attempting to connect to SSID: ");
  Serial.print(ssid);
  WiFi.hostname(HOSTNAME);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("connected!");

  Serial.print("Setting time using SNTP");
  configTime(1 * 3600, 0, "pool.ntp.org", "time.nist.gov");
  now = time(nullptr);
  while (now < 1510592825) {
    delay(500);
    Serial.print(".");
    now = time(nullptr);
  }
  Serial.println("done!");
  struct tm timeinfo;
  gmtime_r(&now, &timeinfo);
  Serial.print("Current time: ");
  Serial.print(asctime(&timeinfo));

  #ifdef CHECK_CA_ROOT
    BearSSL::X509List cert(digicert);
    net.setTrustAnchors(&cert);
  #endif
  #ifdef CHECK_PUB_KEY
    BearSSL::PublicKey key(pubkey);
    net.setKnownKey(&key);
  #endif
  #ifdef CHECK_FINGERPRINT
    net.setFingerprint(fp);
  #endif
  #if (!defined(CHECK_PUB_KEY) and !defined(CHECK_CA_ROOT) and !defined(CHECK_FINGERPRINT))
    net.setInsecure();
  #endif

      
  client.setServer(MQTT_HOST, MQTT_PORT);
  client.setCallback(receivedCallback);
  mqtt_connect();
       pixels.setPixelColor(0, pixels.Color(0, 0, 0));
      pixels.show();   // Send the updated pixel colors to the hardware.

}

void loop()
{
   crntCLK = digitalRead(encoderCLK);

 if (crntCLK != prvsCLK){
      // If the encoderDT state is different than the encoderCLK state then the rotary encoder is rotating counterclockwise
        if (digitalRead(encoderDT) != crntCLK) {
          servoAngle ++;

        }
        else {
          servoAngle --;
         }
         Serial.println(servoAngle);
          String myString = String(servoAngle);
          myString.toCharArray(ang, myString.length() + 1);
          client.publish(MQTT_PUB_TOPIC_angle, ang, false);
 }
  prvsCLK = crntCLK;

  now = time(nullptr);
  if (WiFi.status() != WL_CONNECTED)
  {
    Serial.print("Checking wifi");
    while (WiFi.waitForConnectResult() != WL_CONNECTED)
    {
      WiFi.begin(ssid, pass);
      Serial.print(".");
      delay(10);
    }
    Serial.println("connected");
  }
  else
  {
    if (!client.connected())
    {
      mqtt_connect();
    }
    else
    {
      client.loop();
    }
  }

  if (millis() - lastMillis > 5000) {
    lastMillis = millis();
    client.publish(MQTT_PUB_TOPIC, ctime(&now), false);
  }
}

Busy weekend .. didn´t have time to post

I’ve got my SDK-85 cassette interface PCB’s in, If you want to have the Kicad files. Message me.

My 3D printer has a worn out hot-end .. so a new one to install.

BBQ time! .. That’s from 1-januari till 31-december .. rain, snow storm whatever.
I’ve made a lot of Rubs/Sauces and marinades.
But a new book i always welcome ..

Also new recipes and tips. Let me know.

Sunday a day of music with our folkband.
Played some old and new tunes.

Did some Vulkan / OpenGL benchmark testing.

Cleaned and fixed our wine cellar.

And tomorrow i’m starting new work.

My take on the MoinkBalls

I love to BBQ, this is a favorite.

A MOINK Ball is a beef meatball wrapped in pork bacon, sprinkled with rub, smoked, and sauced .. so beef and pork .. hence the name Moo – oink balls.

Made this today .. but forgot to take some pictures.
Picture is from another date

Ingredients

500 grams of ground beef
40 grams Parmesan cheese grated
1 egg beaten
40 grams of breadcrumbs
100 ml of milk
1 tablespoon garlic finely chopped
1 teaspoon dried parsley
1/4 teaspoon sea salt
2/3 teaspoon dried oregano
2 packs of (smoked) breakfast bacon
barbecue rub 
barbecue sauce

For the balls

ONE of the following

    1/2 teaspoon cayenne pepper
    1/2 teaspoon crushed red pepper flakes
    1/4 teaspoon chili powder
    1 jalapeño pepper, seeded and finely chopped

Recipe

Mix the ingredients of the balls , except for the rub and sauce.
Sprinkle the meatballs with the rub.
Cool in the fridge.
Wrap a slice of bacon around the balls and secure with a cocktail stick. Put your MOINK Balls in the fridge for half an hour to stiffen.

I try to get my smoker at 110C.
Using Cherry wood (or apple), I let the balls hit a core temperature of 55C.
Brush the balls with barbecue sauce.
Remove from the smoker when 70C.

Late Burns Night and St Patrick’s Day

We had a delayed Burns night, seems a bit of a habit of our band.
But with Covid, who knows, maybe we are celebrating Burns Night 2020.

I wanted to make Haggis “bitterballen” (Fried balls) but Irmgard has no frying pan. So I made some Haggis sausage rolls.

The others made also a lot of Scottish/Irish themed food. (Too much again) But i don’t have the recipes.

We played some old tunes, and some new. Talking eating and drinking, time flies!

Irmgard and I played a duet on the Harp and some new tunes on the Concertina.

Wellll the recipes:

I wanted to make this one:
https://cookingwithbry.com/haggis-bon-bons-recipe/

Instead I made this:

  • 392g haggis, canned haggis ( Holiday 2022, stuffed a load of cans in our car )
  • 3 Sausages (that is about 200 gr)
  • Bunch fresh parsley, finely chopped
  • 320g ready rolled all-butter puff pastry
  • 2 tbsp Dijon mustard
  • 1 free-range egg, beaten

Mix haggis, sausagemeat and parsley.

I used square “bladerdeeg” for pastry, made a roll out of one square filled with the haggis. (Takes about of 13 sheets).
Brushed on the beaten egg, and put on baking paper.
20 Minutes in a 180 degrees oven.
Cut up each roll in 3-4 parts.

Bread from beer waste

Last saturday we were brewing beer, ending up with a lot of spent grain. (Bier borstel in Dutch)
These are the processed grains from the brewing.

Well, let’s bake a delicious bread, very tasty with, for example, salted butter.

Preparation time : 135 minutes
Baking time : 60 minutes

What do you need
225 grams of spent grain from the brewing
400 grams of flour
200 ml beer ( I use Leffe Blond)
7 grams of baker’s yeast
50ml olive oil

Put the brewer’s grains in the food processor. (Removes the sharp edges of the malt.)
Put the yeast and a little sugar in the beer. This causes the yeast to become active.
Knead all ingredients together until it becomes an airy ball.
Then let this dough rise for an hour and a half in a warm place in a bowl that is covered with plastic.
Then knead the dough briefly and let it rest for another half hour.
Preheat the oven to 200º C.
Pour the batter into a greased baking pan.
Then place the dough in the center of the oven.
After about an hour the bread should be ready. You can check this by knocking on the bread. If it sounds hollow, the bread is ready.

Two minute timelapse of oyster mushrooms growing.

#!/bin/bash
# capture images from Foscam ( 5 minute interval )
while true; do
wget -q "http://IP-WEBCAM:88/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=adminuser&pwd=adminpass" -O $(date +%Y%m%d%H%M).jpg
sleep 300
done

# from jpg to mp4
ffmpeg -f image2 -r 24 -pattern_type glob -i '*.jpg'   -vcodec libx264 -profile:v high444 -refs 16 -crf 0 -preset ultrafast -vf scale=1920:1080 paddo.mp4

If your ipcam can’t add timestamps, use below part to add text (replace in above script)

...
...
wget -q "http://IP-WEBCAM:88/cgi-bin/CGIProxy.fcgi?cmd=snapPicture2&usr=adminuser&pwd=adminpass" -O /tmp/1.jpg
convert -fill white -pointsize 30 -draw "text 10,30 '$(date)'" /tmp/1.jpg $(date +%Y%m%d%H%M).jpg
rm -f /tmp/1.jpg 
...
...

Smoker, BBQ tips n tricks

I love to bbq outside, winter, snow/rain whatever.
There is no excuse. There are periods where i use a bbq like 3-4 times per week.
Sometimes just to get a nice smokey hamburger.

I’ve written this post because sometimes i see (or smell) some rookie mistakes. (Wrong type of smoke, using accelerants)

I’ve got a offset smoker
https://www.henriaanstoot.nl/2019/06/16/smoker/

A Weber One Touch

And a Skottle Braai

All have their own benefits,and restrictions.

The tips below are the ones i find useful and are MY opinion, but i’m just an amateur and could be wrong 🙂

Offset smoker:

Offset smoker with on the left a cold smoke part ( for cheese and fish ) Some hops behind the Smoker

An offset smoker is perfect for ribs, brisket and other meats that are perfect to take some time to absorb smoke and get better when slowly cooked.

When going Low and slow, i follow these rules:

  • Try to leave the lid closed! No need to let the slowly buildup temperature get away from your meat!
  • Need to know the temperature? Use the one on your kettle or even better, one with a little cable to leave it outside of the heating chamber.
    (See tools)

Weber:

I use this one to do a fast steak (below more about this),smoking nuts and pizza.

  • Use a lid to hold some of the moisture.
  • Use a line of bricks though the middle to create a little cold/hot zone.
    (See pictures)
  • Buy a second grid/grate with a easy accessible opening.
    I’ve used an angle grinder to open a part of the grid.
    This allows easy access to the coals.
  • When making pizza, use a stone slate, and lay your coals at the side, in a horseshoe fashion.
    Some people say .. crank the temperature up to 400 something degrees.
    Far to high to my liking .. 200 is enough
Tomahawk with a tray below it, brick divider ( indirect / direct part )
Cold smoked salmon using a cold smoke generator (filled with wood dust)
Pizza on a stone slate, i use this slate also for Smoked Chocolate Chip Cookies !
Smoked nuts, cheese sausages and eggs.

Skottle Braai:

This one is perfect for fried rice, meats/vegetables which need fluids.
(Some satay/chinese stirfries or small piece meat like Shawarma.

Another way to stir fry is with our beer brew burner

For all things above:

Prepare everything, get your timing right.
Sometimes you are smoking for 6+ hours, but when you forgot to make a marinade, getting things sliced or need a product you dont have/forgot/gone bad .. (i’ve been there)


For the offset smoker .. i don’t use tuning plates .. and probably never will.
Tuning plates can be used to get your smoker front to back evenly heated. This is only useful when cooking a lot of meat.
I seldom do, so i use the colder part whenever things are going too fast.

I even used a Flir camera to check the temperature distribution


Using a lot of heat? Don´t put pepper on your meat. It will burn, just wait when it’s on your plate.
Salt is fine.


Using briquettes or charcoal?
Briquettes, when properly lighted, doesn´t give you a nasty smoke as plain charcoal, charcoal needs more time to burn properly. Briquettes will last for a long time. (See below tools)
Coconut briquettes are perfect for slow cooking .. they burn for a long time.
Use a chimney and wait until all briquettes are white!

Look at the smoke, it should be thin blue-ish. Not thick or white or even black.
Except for smoking woods.


Smoke wood: I’ve tried a lot of smokewoods. Cherry, wine vines, Apple, Pear, hickory, oak, maple and more.
Some people and even packages say: “Soak for 30 minutes in water”
Well i don’t, then the smoke is mostly water vapor.
If you make a neat aluminum foil package with a few little holes, it won’t burst into flames and produces a nice amount of smoke which lasts a while.

Pack tightly and only a few small holes
Tube wood chip holder

Don’t use accelerants like spirit. It gives a nasty taste/smell.


Use different plates and tools for raw and cooked meat.


Look at the core temperature, for example for beef

Rare: 50 to 52 degrees
Medium rare: 55 to 58 degrees
Medium: 60 to 63 degrees
Medium Well: 65 to 67 degrees
Well done: 70 to 80 degrees

Stop before it reaches the desired temperature. Wrap in foil and wait a few minutes. The temperature will rise a few degrees


Trying to get your temperature up again by adding briquettes or wood?
Sometimes fuel is getting low and temperature is dropping.
I seldom but briquettes or wood directly in the fire, it wil give a nasty smoke when it start burning .. I use the chimney to get it burning right.
Then i will place it in the offset chamber.


Using a drip bucket? Or want to use more moisture for your meat?
Heat some apple juice or plain water, and put this in a container below the meat. (See the tomahawk picture above)


The hand trick to check your meat does not really work.
A IT consultant and a bricklayer have different hands, and muscles. 🙂
But it can be an indicator!

Tools:

Spatula, Tongs, Fork, and Basting Brush

Chimney:
You need this!

Fast and easy getting your fire ready

Trays and foils:
Use heavy duty aluminum foil.

The open one i also used to smoke grains for beer brewing.

Beer grains

Rubs, sauces and spices:
Get yourself some nice different rubs and sauces.
Make your own rubs (or sauce)
I will post some recipes for rubs and the smokey red wine sauce i’ve made.
Remember which spices are going to burn in a dry rub.
Sauce is not only to complement the meat, but you can also use it to glace the meat while cooking!

Injecting:

Injecting game stock into meat. Right a spices cabinet i build which can be turned almost 180 degrees.

Injecting meat will give it a nice flavor and tenderness.

Fire starters:

Use a starter which burns clean .. no smoke no odor

Temperature:

Dual temperature sensor

Use a wireless dual temperature sensor, one for the meat (core) and one for the temperature in the Bbq.

For a fast reading, for example in ribs, i use below speed sensor

Reads temperature in 2 seconds

Use pin for testing tenderness

Or … going fancy with my own build bbq watch .. (separate post)

Small pieces of meat? Use a fine mazed mat like this

To moisturize your meat or apply seasoning like apple juice, use a plant spay

At last .. some tips for you to try:


(No links to recipes on the internet, just google there are many .. i will post recipes i’ve tried myself)

Ribs 3-2-1 method

Got a nice steak with a fat cap?
Try argentina style.
Just do a 3-minutes per site. (Even better .. use a pre-heated iron cast grate to get some nice lines.
At the end press the meat on the grate, so the fat melts and drips onto the coals. These wil burn and give big flames. Those burning flaming fat wil give your beef a taste to remember!

Cast iron grate


Briskett

Cold smoking

Moinkballs

Beercan Chicken

Cheezy Hamburger

In the past i came up with a hamburger that most liked.
(The computer party burger)

This one is quite cheezy, and heavy cheese, so not to everyones liking.
But we loved this “experiment”!

And indeed an experiment, i’m not a cook. I only know how to smoke meat, slowcook and so on.
The only other thing i can make which gets compliments, is a real Pasta Carbonara

  • Viking blue cheese
  • Camembert cheese
    • Red onion (outer rings only)
  • Brown sugar
  • Rucola lettuce
  • Hamburger made from deer. ( Gamey taste )
    https://www.grutto.com/nl/wild/hert-pakket-groot
  • Chestnut mushrooms
  • Shitake olive oil
  • Balsamic vinegar
  • Teardrop tony roasted onion bbq sauce

Mix a lot of the cheeses and melt in the preheated oven.
Glaze the onion in olive oil and brown sugar.
Fry the mushrooms in shitake olive oil and add some balsamic vinegar.
Prepare the burgers on your BBQ, use some smoke.
(I like to put the cheese on top of the burgers the last 2 minutes or so, it will melt over the burgers and get some smoke)
Slice the burger buns in two, and put in the oven. (Sliced part down)
(until a little brown/crispy)