diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c0dc202
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+setup-node/setup-node
diff --git a/artwork/gps-tracker-price-tag.png b/artwork/gps-tracker-price-tag.png
new file mode 100644
index 0000000..920dc4a
Binary files /dev/null and b/artwork/gps-tracker-price-tag.png differ
diff --git a/artwork/preisschild.svg b/artwork/preisschild.svg
new file mode 100644
index 0000000..b71983e
--- /dev/null
+++ b/artwork/preisschild.svg
@@ -0,0 +1,99 @@
+
+
diff --git a/firmware/README.md b/firmware/README.md
index 71d574e..6e0cb60 100644
--- a/firmware/README.md
+++ b/firmware/README.md
@@ -2,6 +2,12 @@
`
LED nach oben (mit eigenem Kabel, siehe ODT File)
-Reset Knopf kurz drücken, dann folgender Befehl:
+Reset Knopf (z.B. mit Bueroklammer) drücken, dann folgender Befehl:
+
[joerg@cinnamon firmware]$ openocd -f /usr/share/openocd/scripts/interface/stlink.cfg -c "transport select hla_swd" -f /usr/share/openocd/scripts/target/stm32l0.cfg -c init -c 'program EU868.hex verify reset exit'
+
+Gerade nach Befehl Reset-Knopf wieder loslassen - Timing ist entscheidend!
+
+Nach Firmware Update immer:
+AT+FDR
`
diff --git a/schablone/schablone.FCStd b/schablone/schablone.FCStd
new file mode 100644
index 0000000..87214da
Binary files /dev/null and b/schablone/schablone.FCStd differ
diff --git a/schablone/schablone.FCStd1 b/schablone/schablone.FCStd1
new file mode 100644
index 0000000..721ba0a
Binary files /dev/null and b/schablone/schablone.FCStd1 differ
diff --git a/schablone/schablone.stl b/schablone/schablone.stl
new file mode 100644
index 0000000..89a2927
Binary files /dev/null and b/schablone/schablone.stl differ
diff --git a/setup-node/main.go b/setup-node/main.go
new file mode 100644
index 0000000..18c83f7
--- /dev/null
+++ b/setup-node/main.go
@@ -0,0 +1,162 @@
+package main
+
+import (
+ "fmt"
+ "github.com/tarm/serial"
+ "log"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+)
+
+// returns last line of output
+func sendCommand(p *serial.Port, command string) string {
+ fmt.Printf("%s\n", command)
+ var first_line string = ""
+ p.Flush()
+ time.Sleep(300 * time.Millisecond)
+ ignorebuf := make([]byte, 1024)
+ p.Read(ignorebuf)
+ _, err := p.Write([]byte(command + "\n"))
+ if err != nil {
+ log.Fatal(err)
+ }
+ buf := make([]byte, 1024)
+
+ time.Sleep(300 * time.Millisecond)
+
+ n, _ := p.Read(buf)
+ if n > 0 {
+ lines := strings.Split(string(buf[:n]), "\n")
+ //fmt.Printf("%+q\n", lines)
+ first_line = lines[0]
+
+ }
+ return first_line
+}
+
+func getDevEui(p *serial.Port) string {
+ var reply = sendCommand(p, "AT+DADDR=?")
+ //fmt.Printf("XXX%sYYY\n",reply)
+ if len(reply) >= 10 {
+ return "a8 40 41 00 " + reply[0:11]
+ } else {
+ return ""
+ }
+}
+
+func getFWVersion(p *serial.Port) string {
+ var reply = sendCommand(p, "AT+VER=?")
+ //fmt.Printf("XXX%sYYY\n",reply)
+ if len(reply) >= 10 {
+ return reply
+ } else {
+ return ""
+ }
+}
+
+func getAppKey(deveui string) string {
+ if len(deveui) == 23 {
+ mdeveui := strings.ReplaceAll(deveui, " ", "")
+ appkey := fmt.Sprintf("%c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c %c%c",
+ mdeveui[10],
+ mdeveui[3],
+ mdeveui[4],
+ mdeveui[7],
+ mdeveui[15],
+ mdeveui[9],
+ mdeveui[11],
+ mdeveui[2],
+ mdeveui[0],
+ mdeveui[8],
+ mdeveui[1],
+ mdeveui[6],
+ mdeveui[5],
+ mdeveui[12],
+ mdeveui[14],
+ mdeveui[13],
+ mdeveui[3],
+ mdeveui[6],
+ mdeveui[12],
+ mdeveui[7],
+ mdeveui[15],
+ mdeveui[1],
+ mdeveui[9],
+ mdeveui[11],
+ mdeveui[2],
+ mdeveui[10],
+ mdeveui[0],
+ mdeveui[8],
+ mdeveui[5],
+ mdeveui[14],
+ mdeveui[4],
+ mdeveui[13])
+
+ fmt.Printf("calculated AppKey: %s\n", appkey)
+ return appkey
+
+ } else {
+ fmt.Printf("devEui has wrong length: %s\n", deveui)
+ return ""
+ }
+}
+
+func readSerial(p *serial.Port) {
+ p.Flush()
+ buf := make([]byte, 32)
+
+ time.Sleep(200 * time.Millisecond)
+ n, _ := p.Read(buf)
+ for n > 0 {
+ // ignoring error as EOF raises error on Linux
+ reply := string(buf[:n])
+ fmt.Printf("%s", reply)
+ n, _ = p.Read(buf)
+ }
+}
+
+func main() {
+ if len(os.Args) != 2 {
+ fmt.Println("usage: " + filepath.Base(os.Args[0]) + " ")
+ os.Exit(1)
+ }
+
+ serialdev := os.Args[1]
+ appEui := "a8 40 41 35 10 35 10 35"
+
+ c := &serial.Config{Name: serialdev, Baud: 9600, ReadTimeout: time.Second * 1}
+ s, err := serial.OpenPort(c)
+ if err != nil {
+ log.Fatal("Problem mit Serial Interface")
+ }
+
+ location, err := time.LoadLocation("Europe/Zurich")
+
+ f, err := os.OpenFile("setup-node.log",
+ os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
+ if err != nil {
+ log.Println(err)
+ }
+ defer f.Close()
+
+ sendCommand(s, "AT")
+ devEui := getDevEui(s)
+ FWVersion := getFWVersion(s)
+ if devEui != "" {
+ fmt.Printf("devEui: %s\n", devEui)
+ sendCommand(s, "AT+APPEUI="+appEui)
+ appkey := getAppKey(devEui)
+ sendCommand(s, "AT+APPKEY="+appkey)
+ sendCommand(s, "AT+FDR")
+ sendCommand(s, "AT+LON=0")
+ sendCommand(s, "ATZ")
+ logline := strings.ToUpper(fmt.Sprintf("%s: %s %s %s %s\n", time.Now().In(location).Format("02.01.2006 15:04"), strings.ReplaceAll(devEui, " ", ""), strings.ReplaceAll(appEui, " ", ""), strings.ReplaceAll(appkey, " ", ""), FWVersion))
+ if _, err := f.WriteString(logline); err != nil {
+ log.Println(err)
+ }
+ readSerial(s)
+ } else {
+ log.Fatal("Could not get devEui")
+ }
+}
diff --git a/setup-node/setup-node.log b/setup-node/setup-node.log
new file mode 100644
index 0000000..b364154
--- /dev/null
+++ b/setup-node/setup-node.log
@@ -0,0 +1,8 @@
+17.04.2021 17:13: A8404100018193D7 A840413510351035 80407114A08019D30090781148A01D43 V1.6.5 EU868
+17.04.2021 17:14: A8404100018193F3 A840413510351035 80403114A08019F30090381148A01F43 V1.6.5 EU868
+14.05.2021 16:28: A8404100018193F3 A840413510351035 80403114A08019F30090381148A01F43 V1.6.5 EU868
+14.05.2021 16:52: A8404100018193D7 A840413510351035 80407114A08019D30090781148A01D43 V1.6.5 EU868
+14.05.2021 20:26: A8404100018193D7 A840413510351035 80407114A08019D30090781148A01D43 V1.6.5 EU868
+14.05.2021 20:32: A8404100018193F3 A840413510351035 80403114A08019F30090381148A01F43 V1.6.5 EU868
+02.06.2021 19:44: A8404100018193DE A840413510351035 8040E114A08019D30090E81148A01D43
+02.06.2021 19:49: A8404100018193DE A840413510351035 8040E114A08019D30090E81148A01D43 V1.6.5 EU868