ESP basiertes Touch Display für VanPI

@Tibu81 und @RV3DTech

Vielen Dank für die Gehäuse Vorschläge.

Ich suche nach einer unauffälligen Montage direkt an die Wand - ohne sichtbare Schrauben. Da wäre die Lösung von RV3DTech vermutlich passender. Die Nutzung des Ram Mounts ist vermutlich optional, oder? Oder anders gefragt: Liegt das Gehäuse dann plan an der Wand?

Hallo zusammen,

Zum Abschluss des Samstag gibt’s jetzt noch ein Update von mir.

Die aktuellen Änderungen von @RV3DTech sind mit eingebaut.

Ich habe einiges bzgl. Framerate / Speicher / CPU / RAM Auslastung gemacht (bzw. KI machen lassen… :smiley: ). Das Ganze fühlt sich finde ich jetzt deutlich flüssiger an und die Animationen ruckeln nicht mehr so. Auch ist deutlich Platz geschafft für weitere Features…

Bugs sind einige behoben:

  • Wlan Relais haben jetzt (hoffentlich) den richtigen Namen.
  • Schaltflächen sind an diversen Stellen in der UI vergrößert, sodass man sie leichter bedienen kann
  • Das scrollen vor allem in der Navigationsleiste unten wurde etwas verbesert, man sollte nicht mehr so häufig aus versehen den Tab wechseln.

Als Feature ist ein Temperatur Tab hinzugekommen, der auch über die letzte 1,6,12,24H den Temperaturverlauf von Innen / Aussentemperatur und bis zu 2 zusätzlichen Temperaturen visualisiert.

Als Entwicklertool ist ein lokales Gateway für Tailscale hinzugekommen. Bei mir ist der VanPi per Tailscale mit dem Entwickler-Pc verbunden, das Display hängt aber im Heimnetzwerk. Das script “brückt” nun die Daten vom Heimnetzwerk zum Vanpi. Das Ganze geht Live oder mit unterdrücktem /put, also ohne aktives schreiben auf den VanPi. Das hat es zumindest mir einfacher gemacht zu debuggen. Habe es mit gepusht, vielleicht hilft es ja.

Ich freue mich auf euer Feedback.

Das Release V1.2.1 ist jetzt hochgeladen.

Schönes Wochenende euch!

Sehr cool eure Arbeit, läuft auch schon sehr gut.

Hab aber ein Fehler, wenn man in Systemeinstellung auf Tabs anpassen geht gibts ein Absturz und dann ein Reboot.

Serieller Monitor sagt das..

76 bytes
CamperUI ready!
[DISPLAY v8.7] Adaptive internal draw buffer active; f=framebuffer cache flush, s=RGB resync
[DISPLAY v8.7] RGB pixel clock: 12 MHz (original panel timing)

[DISPLAY v8.7] RGB resync scheduled after save/manual command: ESP_OK
Guru Meditation Error: Core 1 panic’ed (LoadProhibited). Exception was unhandled.

Core 1 register dump:
PC : 0x420236d1 PS : 0x00060e30 A0 : 0x82022b9d A1 : 0x3fcebf30
A2 : 0x00000000 A3 : 0x00000000 A4 : 0x00000007 A5 : 0x00000000
A6 : 0x00000004 A7 : 0x0000004c A8 : 0x8203daa0 A9 : 0x3fcebf10
A10 : 0x00000000 A11 : 0x0000004c A12 : 0x00000000 A13 : 0x00000000
A14 : 0x00000004 A15 : 0x0000004c SAR : 0x0000001f EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000022 LBEG : 0x400555cd LEND : 0x400555e1 LCOUNT : 0xfffffffe

Backtrace: 0x420236ce:0x3fcebf30 0x42022b9a:0x3fcebf50 0x420475e7:0x3fcebf70 0x42014d3b:0x3fcebf90 0x42015287:0x3fcebfb0 0x42015eb3:0x3fcebfe0 0x4201f4a1:0x3fcec000 0x4201f55d:0x3fcec020 0x4201fe86:0x3fcec060 0x42020b31:0x3fcec090 0x42020c1a:0x3fcec0b0 0x42041a71:0x3fcec0f0 0x42041b0a:0x3fcec110 0x4200428b:0x3fcec130 0x42065b2c:0x3fcec1b0 0x4037f3d5:0x3fcec1d0

ELF file SHA256: 8a7a15c88

Rebooting…
ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0xc (RTC_SW_CPU_RST),boot:0xb (SPI_FAST_FLASH_BOOT)
Saved PC:0x42120d92
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce2820,len:0x10cc
load:0x403c8700,len:0xc2c
load:0x403cb700,len:0x30b0
entry 0x403c88b8

-– Waveshare ESP32-S3 CamperUI Starting —
CPU frequency: 240 MHz
CH32V003 IO expander initialized
CH32V003 IO expander initialized
Setting PWM to 100
Scanning I2C bus…
I2C device found at 0x24
I2C device found at 0x51
I2C device found at 0x5D
Found GT911 candidate: 0x5D
GT911 initialized at 0x5D
[HTTP] Background worker pinned to Core 0
[DATA v8.7] Source=LIVE HTTP worker=RUNNING
[DISPLAY v8.7] LVGL double draw buffer enabled: 2x 19200 bytes (20 lines each), internal RAM only
[NAV v8] init page=0 faults=0 nav=(0,420) 480x60 scroll=(0,0) content=(0,40) 480x380 lvgl_free=8772 frag=1%
[DISPLAY v8.7] Internal heap after startup: free=32688 largest=12276 bytes
CamperUI ready!
[DISPLAY v8.7] Adaptive internal draw buffer active; f=framebuffer cache flush, s=RGB resync
[DISPLAY v8.7] RGB pixel clock: 12 MHz (original panel timing)
[TOUCH v8.7] n=geometry/memory, t=touch on/off, r=full screen redraw
[DISPLAY v8.7] RGB resync scheduled after save/manual command: ESP_OK

Fehler kommt anscheint nur wenn ich es über Arduino Flashe. Hab es nochmal OTA geflasht da dritt der Fehler nicht auf.

Hallo zusammen,

ich habe das Update per OTA eingespielt. Jetzt V1.21

  • Das OTA Update ließ sich problemlos einspielen. Es sollte dann ein automatischer Neustart folgen. Der Screen ist dann aber schwarzgeblieben. Ein Power Cycle hat geholfen
  • Der Übernahme der WRelay Namen funktioniert
  • In den Systemeinstellungen kann man die Sichtbarkeit von Relays und Dimmer steuern. “Speichern & Beenden” aktiviert aber nicht die Einstellung. Dies passiert erst nach einem Neustart des Displays.
  • In den WLAN Einstellungen verdeckt der “Firmware-Update” Bereich die aktuelle IP Adresse
  • Der Maxxfan Bug ist noch drin. Anleitung zur Reproduktion:
    • Wechsel von “Aus” auf “Auto” → 26°C → Zustand wird bestätigt
    • Wechseln von “Auto” auf “Aus”. → “Warte auf Rückmeldung” → “Keine Bestätigung - Zustand prüfen.”
  • Der Maxxfan Zustand ist ja nur simuliert - eventuell macht es noch Sinn, die Reset Funktion mit einzublenden.
  • Der Temperaturverlauf gefällt mir. Eine wirklich Aussage hat es aber erst mit Werten auf der Y-Achse.
  • In der Relais Zuordnung für Pumpe und Abwasser werden nur die generischen Namen angezeigt. Schöne wäre der tatsächliche Name.

Ja, der RAM-Mount ist bisher nur eine Idee für meine Einbausituation und wäre optional.

Eine direkte Wandbefestigung ist beim aktuellen Gehäuse noch nicht vorgesehen. Die Schwierigkeit dabei: Das Display wird von hinten verschraubt, deshalb lässt sich das Gehäuse nicht einfach vorher an der Wand befestigen.

Ein möglicher Ansatz wäre eine separate Grundplatte an der Wand, in die das Gehäuse über Haken oder Schlüssellochaufnahmen eingehängt und anschließend mit einer M3-Schraube gesichert wird. Ob es damit plan an der Wand liegen kann, müsste ich bei der Konstruktion noch prüfen.

Vielleicht hat jemand noch eine bessere Idee? :eyes:

Die separate Grundplatte wäre natürlich der Goldstandard. Ich hätte es einfach gehalten und das Gehäuse einfach mit 3M Klebeband an die Wand geklebt. Hält Bombe und geht bei Bedarf auch wieder ab.

Noch eine Frage zur Visualisierung der Spannung der Starterbatterie:

Damit mir diese angezeigt wird, habe ich in der HTTP API den Function Node Get Battery stats wie folgt angepasst:

let shuntData = global.get("VE_SHUNT")


msg.payload = {
    "VoltB":global.get("MainBattVolt") || 0,
    "Ampere": global.get("MainBattAmps") || 0,
    "battsoc": global.get("MainBattSoc") || 0,
    "starter_voltage": shuntData.auxBatteryVolt || 0,
};
return msg;

Das scheint mir für zukünftige Updates aber ungünstig.

Wäre es da nicht sicherer, innerhalb eines Userflows einen zusätzlichen HTTP Endpoint zu erstellen, der die Infos zur Starterbatterie liefert?

Zur separaten Grundplatte bin ich heute noch nicht gekommen. Ich habe aber die Vertiefungen für die Display-Schrauben und M3-Unterlegscheiben tiefer gemacht, sodass die Rückseite jetzt plan an der Wand anliegt und sich das Gehäuse ankleben lässt. :slightly_smiling_face:

Die Schraubklemmen für Plus und Minus sind außerdem seitlich zugänglich; eine Öffnung für den Kabelabgang ist ebenfalls vorgesehen.
Was meinst du dazu?

Ein eigener Userflow wäre eine gute Übergangslösung, ohne den bestehenden VanPi-Flow verändern zu müssen. Für Anfänger wäre die zusätzliche Einrichtung allerdings eine weitere Hürde.

Wäre es deshalb sinnvoll, den Wunsch an Pekaway weiterzugeben, damit die Starterbatterie-Spannung künftig direkt über die offizielle HTTP-API verfügbar ist? Bis dahin könnte ein fertiger Userflow zum Importieren mit kurzer Anleitung helfen.

CamperUI liest aktuell starter_voltage aus /batt. Ich könnte eine zusätzliche Abfrage ergänzen und die bisherige Variante weiterhin unterstützen. Den Endpunkt und das Datenformat sollten wir kurz mit @Niklas abstimmen.

Fehlende Shunt-Daten sollten dabei als „nicht verfügbar“ behandelt werden, damit das Display keine irreführenden 0 V anzeigt.

Ein Update zu meinem Entwicklungsstand V1.2.1-RV3D.89-dev

  • Energie-Verläufe: Chart-Symbole auf Batterie und Solar öffnen eigene Ansichten für 1 / 6 / 12 / 24 Stunden. Batterie zeigt Ladezustand oder Lade-/Entladeleistung, Solar die Leistung in Watt. Gestaltung an die Temperatur-Charts angeglichen.

  • Relais-Bedienung: Touch-Auswertung verbessert und schnelle Mehrfachbefehle abgefangen, damit langes Drücken nicht zu Relais-Klackern führt.
    → bitte auch bei euch Testen!

  • Batterie-Farben: Rot-/Gelb-Grenzen unter Alarm-Schwellen einstellbar; darüber wird Blau angezeigt.

  • Temperaturzuordnung: Home übernimmt jetzt fest Innen, Außen und Zusatz 1 aus den zentralen Einstellungen – keine doppelte Zuordnung mehr.

  • MaxxFan: Befehlsfolge für den Wechsel von Auto auf Aus beziehungsweise Manuell korrigiert.

  • Einstellungen: Anpassungen gegen den Absturz bei „Tabs anpassen“; Relais-/Dimmer-Sichtbarkeit wird nach dem Speichern direkt übernommen.

  • WLAN/OTA: Update-Bereich unterhalb der Verbindungsinfos angeordnet und den OTA-Neustart überarbeitet, um den schwarzen Bildschirm nach dem Update zu vermeiden.

  • Temperatur-Charts: Y-Achse beschriftet und Darstellung bei konstanten Werten verbessert.

  • Versionsanzeigen: Alte fest eingetragene Versionsnummern durch die zentrale Versionskennung ersetzt.

Die Firmware kompiliert erfolgreich; die automatischen Logikprüfungen sind ebenfalls durchgelaufen. Live- und Langzeittests der neuen Änderungen stehen noch aus.

Die Energie-Verläufe verwenden die vorhandenen Dummy-/Live-Daten und beginnen nach dem Start neu. Fehlende Daten erscheinen als Lücken. Solar zeigt zunächst Leistung in W, noch keinen Ertrag in Wh.

Als Nächstes möchte ich meinen Victron Cerbo GX und den Victron-Wechselrichter über CamperUI einbinden. Die Anbindung soll über MQTT am VanPi laufen. Wahrscheinlich ist das eher eine Nischenfunktion, aber für meinen Anwendungsfall könnte CamperUI damit die wichtigsten Aufgaben des GX Touch übernehmen – und ein zusätzliches Display überflüssig machen. Mal schauen…

Richtig gut! Für meinen Anwendungsfall passt das.

Guten Morgen,

ich habe gesehen, dass inzwischen das Release 1.3 verfügbar ist. Kurzes Feedback dazu:

  • Maxxfan: Der Statuswechsel “Auto” → “Aus” funktioniert jetzt
  • Wifi: Bei uns war gestern ein WLAN Ausfall. Ich musste das Display danach neustarten damit es sich wieder mit dem WLAN verbindet. Habt Ihr grundsätzlich einen Wifi Reconnect vorgesehen?
  • Die neue Setting Funktion via Broswer ist mega! Die Einstellungen gehen deutlich besser von der Hand als auf dem kleinen Display. Mir stellt sich nun die Frage, ob man die Settings Funktion nicht aus dem Buttom Menü des Displays entfernen könnte. Das würde Platz sparen. Meine Idealvorstellung des Bottom Menüs ist, dass man dort ohne horizontales Scrollen auskommt
  • Füllstände: Ich nutze die Füllstandsfunktion auch für unsere Gasflasche. Gas wird üblicherweise in kg gemessen. Wäre schön wenn Ihr die Einheiten “l” und “kg” vorsehen könntet.
  • Heizung: Zu meinem persönlichen Glück fehlt noch die Steuerung der Truma Heizung.

Nochmals ein dickes Thumbs Up für das, was Ihr hier in extrem kurzer Zeit auf die Beine gestellt habt.

Hi,

das Thema custom endpoints hatte ich auch schon überlegt weil ich z.b. Luftfeuchtigkeit auf gern von den Ruuvi tags übertragen würde.

Starter voltage wäre dann auch genau so ein Thema. Am besten wäre es in einem user flow, dann bleibt es Update fähig. Ich probiere nachher mal was aus.

Das man die Settings nun auch ausblenden kann ist eine gute Idee, da man sie ja über die webeinstellungen wieder aufrufen kann. Werde ich umsetzen!

Bzgl der Heizung, kannst du mir einmal die Ausgabe vom /heater endpoint schicken? Also dann mit der Truma drin? Dann macht’s die Integration einfacher.

Füllstände in l/kg kann ich einbinden!

Wifi reconnect auch gern das das die Verbindung überwacht wird mit auto connect

Hier die Ausgabe von /heater:

{
  "heatertoggle": false,
  "heatstatus": "wait",
  "heattemp": "wait",
  "heatvolt": 0,
  "heatfan": "wait",
  "heatglow": 0,
  "heatwpump": 0,
  "heaterror": "no",
  "targettemp_vanpi": 25,
  "runtime_m": 0,
  "runtime_remaining_s": 0,
  "timer_state": false,
  "timer": 0,
  "tempsensor": 1,
  "tempsensor_name": "Innen",
  "tempsensors": {
    "temp1": {
      "state": "10.6",
      "name": "Innen",
      "type": "ds18b20"
    },
    "temp2": {
      "state": "10.6",
      "name": "Aussen",
      "type": "ds18b20"
    },
    "temp3": {
      "state": "0",
      "name": "Temp3",
      "type": "ds18b20"
    },
    "temp4": {
      "state": "0",
      "name": "Temp4",
      "type": "ds18b20"
    }
  },
  "heater_name": "",
  "truma_CI": {
    "air": {
      "mode": "normal",
      "target": "off"
    },
    "diagnostics": {
      "alive": "online",
      "energy": "fuel",
      "error": "none",
      "flags": "window_closed ",
      "manual_mode_active": false,
      "model": "Combi D 4",
      "power_limit": 900
    },
    "metrics": {
      "cpplus_fw": "v4.5.2 (Build 4594)",
      "cpplus_time": "11:22:45",
      "heater_fw": "v6.0.2 (Build 65535)",
      "last_valid_age_sec": 0,
      "manual_mode_count": 1,
      "publish_count": "301.179",
      "script_runtime": "19d, 23:50"
    },
    "water": {
      "target": "off"
    },
    "timestamp": "2026-10-13T09:22:16.382Z",
    "timer_state": false,
    "timer": {
      "type": "Buffer",
      "data": [
        31,
        139,
        8,
        0,
        0,
        0,
        0,
        0,
        0,
        3,
        171,
        86,
        42,
        81,
        178,
        138,
        142,
        173,
        5,
        0,
        165,
        190,
        86,
        57,
        8,
        0,
        0,
        0
      ],
      "__enc__": true,
      "length": 28
    },
    "heater_name": "Truma",
    "runtime_m": 0,
    "runtime_remaining_s": 0,
    "tempsensor": 1,
    "tempsensor_name": "Innen"
  },
  "ventilation": {
    "maxxfan": {
      "fan_power": false,
      "fan_direction": "out",
      "fan_temp": 26,
      "fan_auto": false,
      "fan_speed": 3,
      "fan_vent": "close"
    }
  }
}

Zum Release 1.4:

  • Ausblenden der Systemeinstellungen: Ich kann dies am Display deaktivieren. Das Display startet dann neu und die Systemeinstellungen sind wieder da

Hi,

das stimmt, beim Starten war es immernoch wieder aktiviert. Jetzt ist es weg.

5 Sekunden in der Tableiste unten gedrückt halten öffnet die Einstellungen (Falls man z.b. kein WLAN konfiguriert hat ists sonst schlecht …wie ich das wohl raus gefunden habe :smiley:)

Die Erstinbetriebnahme ist nun auch einfacher geworden:

Einfach das Display verbinden und dort Wlan sowie Ip Adressen vorkonfigurieren und dann flashen!

…Truma Heizung kommt jetzt :slight_smile:

Holla die Waldfee, mit dem Web-Flasher ist es verdammt einfach geworden, die Firmware aufs Display zu bringen! :clap: :star_struck:

@abcklaus

Jetzt ist eine erste Truma Steuerung da.

Da ich so gar keine Ahnung habe, wie die Truma aufgebaut ist oder funktioniert schaue bitte mal ob es a) funktioniert? b)alle features hat die man mit einer truma braucht? c) alles Anzeigt was dich interessiert bei einer Truma

Ich freue mich auf deine Rückmeldung :slight_smile:

Wow, sieht optisch schon mal mega aus. Ich kann es aber erst morgen ausprobieren.

Eine Kleinigkeit ist mir aber schon mal aufgefallen, die die Usability verbessern könnte.

Mein Wissens gibt es folgende Truma Modelle:

Dieselmodelle

  • Combi D4 (4 kW Diesel)
  • Combi D4E (4 kW Diesel + elektrische Heizstäbe)
  • Combi D6 (6 kW Diesel)
  • Combi D6E (6 kW Diesel + elektrische Heizstäbe)

Gasmodelle

  • Combi 4 (4 kW Gas)
  • Combi 4E (4 kW Gas + elektrische Heizstäbe)
  • Combi 6 (6 kW Gas)
  • Combi 6E (6 kW Gas + elektrische Heizstäbe)

“E” steht jeweils für den Elektroheizstab. Bedeutet: Trägt das Modell kein “E” im Namen, kannst Du den Bereich, wo man die Energiequelle wählt, weglassen. Mit etwas Quetschen dürften die übrigen Bereiche ohne Scrollen auf eine Seite passen.