diff --git a/.gitignore b/.gitignore
index 2eea525d885d5148108f6f3a9a8613863f783d36..998ebd1d850f07a8afdb550c8c6780a33dab3935 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
-.env
\ No newline at end of file
+.env
+boiler.csv
\ No newline at end of file
diff --git a/csv/main.go b/csv/main.go
new file mode 100644
index 0000000000000000000000000000000000000000..1ddd8405e141b0f535c60e203fdc586c1b32eb60
--- /dev/null
+++ b/csv/main.go
@@ -0,0 +1,48 @@
+package csv
+
+import (
+	"encoding/csv"
+	"encoding/json"
+	"os"
+
+	"jonasled.dev/jonasled/ems-esp-logger/helper"
+)
+
+func JsonToCsv(jsonData string) {
+	var data map[string]interface{}
+	if err := json.Unmarshal([]byte(jsonData), &data); err != nil {
+		panic(err)
+	}
+
+	file, err := os.OpenFile(os.Getenv("OUTPUT_FILE_NAME"), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
+	if err != nil {
+		panic(err)
+	}
+	defer file.Close()
+
+	writer := csv.NewWriter(file)
+	defer writer.Flush()
+
+	fileInfo, err := file.Stat()
+	if err != nil {
+		panic(err)
+	}
+
+	if fileInfo.Size() == 0 {
+		header := make([]string, 0, len(data))
+		for key := range data {
+			header = append(header, key)
+		}
+		if err := writer.Write(header); err != nil {
+			panic(err)
+		}
+	}
+
+	row := make([]string, 0, len(data))
+	for _, value := range data {
+		row = append(row, helper.AnyToString(value))
+	}
+	if err := writer.Write(row); err != nil {
+		panic(err)
+	}
+}
diff --git a/helper/anyToString.go b/helper/anyToString.go
new file mode 100644
index 0000000000000000000000000000000000000000..7b7e728bbdd9782eabe247e0bb44ac9b9048b42e
--- /dev/null
+++ b/helper/anyToString.go
@@ -0,0 +1,16 @@
+package helper
+
+import "fmt"
+
+func AnyToString(value interface{}) string {
+	switch v := value.(type) {
+	case string:
+		return v
+	case float64:
+		return fmt.Sprintf("%.2f", v)
+	case int:
+		return fmt.Sprintf("%d", v)
+	default:
+		return ""
+	}
+}