diff --git a/go.mod b/go.mod
index 1a750e3ce9163666930b8eba50a2076189144aa6..97a60efbe837b4d6502015f98416ee8f90f056f6 100644
--- a/go.mod
+++ b/go.mod
@@ -3,6 +3,7 @@ module jonasled.dev/jonasled/ems-esp-logger
 go 1.23.4
 
 require (
+	github.com/eclipse/paho.mqtt.golang v1.5.0
 	github.com/joho/godotenv v1.5.1
 	github.com/sirupsen/logrus v1.9.3
 	github.com/wind-c/comqtt/v2 v2.6.0
@@ -10,9 +11,10 @@ require (
 )
 
 require (
-	github.com/gorilla/websocket v1.5.1 // indirect
+	github.com/gorilla/websocket v1.5.3 // indirect
 	github.com/rs/xid v1.5.0 // indirect
 	golang.org/x/net v0.27.0 // indirect
+	golang.org/x/sync v0.7.0 // indirect
 	golang.org/x/sys v0.22.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )
diff --git a/go.sum b/go.sum
index 31ffe23a8cd12b95a4a722cfad4df8ff9a022cd8..04b0286ab491326e40257bfeb9b34ed69e0ec4bc 100644
--- a/go.sum
+++ b/go.sum
@@ -1,8 +1,10 @@
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
-github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
+github.com/eclipse/paho.mqtt.golang v1.5.0 h1:EH+bUVJNgttidWFkLLVKaQPGmkTUfQQqjOsyvMGvD6o=
+github.com/eclipse/paho.mqtt.golang v1.5.0/go.mod h1:du/2qNQVqJf/Sqs4MEL77kR8QTqANF7XU7Fk0aOTAgk=
+github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
+github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=
 github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
 github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
@@ -21,6 +23,8 @@ github.com/wind-c/comqtt/v2 v2.6.0 h1:huLdOwYDrwMTrEwH7+mSs1GftHZ/tDqJw8nOz3iX7k
 github.com/wind-c/comqtt/v2 v2.6.0/go.mod h1:6O4VilBrTQ/cNIcmIgNdMLCK9DTiLRxkal00t0DLN64=
 golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
 golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
+golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
 golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
diff --git a/helper/generateRandomString.go b/helper/generateRandomString.go
new file mode 100644
index 0000000000000000000000000000000000000000..fdea325f5c29a87def0d545d982fbad98cf5c2d6
--- /dev/null
+++ b/helper/generateRandomString.go
@@ -0,0 +1,15 @@
+package helper
+
+import (
+	"math/rand"
+)
+
+func GenerateRandomString(length int) string {
+	const charset = "abcdefghijklmnopqrstuvwxyz0123456789"
+	// Generate random string
+	result := make([]byte, length)
+	for i := range result {
+		result[i] = charset[rand.Intn(len(charset))]
+	}
+	return string(result)
+}
diff --git a/main.go b/main.go
index 1609ca92af4fbfd90345e4aa8145b79b21e655f7..26cb826c56625dd59de61e6af4bec586071a480b 100644
--- a/main.go
+++ b/main.go
@@ -2,16 +2,23 @@ package main
 
 import (
 	"os"
+	"time"
 
 	_ "github.com/joho/godotenv/autoload"
 	"jonasled.dev/jonasled/ems-esp-logger/log"
+	"jonasled.dev/jonasled/ems-esp-logger/mqttclient"
 	"jonasled.dev/jonasled/ems-esp-logger/mqttserver"
 )
 
 func main() {
+	log.Init()
 	if os.Getenv("MQTT_SERVER_ENABLED") == "true" {
 		log.Log.Info("Starting embedded MQTT server")
 		mqttserver.Start()
 	}
+	mqttclient.Init()
+	for {
+		time.Sleep(time.Second)
+	}
 
 }
diff --git a/mqttclient/main.go b/mqttclient/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..77d1529d5110c959c40663bcbd71a313be6d3ae7
--- /dev/null
+++ b/mqttclient/main.go
@@ -0,0 +1,45 @@
+package mqttclient
+
+import (
+	"fmt"
+	"os"
+
+	mqtt "github.com/eclipse/paho.mqtt.golang"
+	"jonasled.dev/jonasled/ems-esp-logger/helper"
+	"jonasled.dev/jonasled/ems-esp-logger/log"
+)
+
+var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
+	log.Log.Debugf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic())
+}
+
+var messagePubHandlerBoiler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
+	log.Log.Debugf("Received message for boiler: %s from topic: %s\n", msg.Payload(), msg.Topic())
+
+}
+
+var connectHandler mqtt.OnConnectHandler = func(client mqtt.Client) {
+	log.Log.Info("Successfully connected to MQTT broker")
+}
+
+var connectLostHandler mqtt.ConnectionLostHandler = func(client mqtt.Client, err error) {
+	log.Log.Error("Connection to MQTT broker lost: ", err.Error())
+}
+
+func Init() {
+	opts := mqtt.NewClientOptions()
+	opts.AddBroker(fmt.Sprintf("tcp://%s:%s", os.Getenv("MQTT_HOST"), os.Getenv("MQTT_PORT")))
+	opts.SetClientID("ems-esp-logger_" + helper.GenerateRandomString(8))
+	if os.Getenv("MQTT_USERNAME") != "" {
+		opts.SetUsername(os.Getenv("MQTT_USERNAME"))
+		opts.SetPassword(os.Getenv("MQTT_PASSWORD"))
+	}
+	opts.SetDefaultPublishHandler(messagePubHandler)
+	opts.OnConnect = connectHandler
+	opts.OnConnectionLost = connectLostHandler
+	client := mqtt.NewClient(opts)
+	if token := client.Connect(); token.Wait() && token.Error() != nil {
+		log.Log.Fatal("Failed connecting to MQTT server: ", token.Error())
+	}
+	client.Subscribe(os.Getenv("MQTT_TOPTIC_BOILER"), 1, messagePubHandlerBoiler)
+}