Pekaway Connect: die neue App

Ich habe mir einen Display von Carpuride W903 gekauft, welches sich automatisch mit dem Handy koppelt (Android, IOS). Die Musik für per Bluetooth mit dem Auto oder den Boxen gekoppelt. Damit hat man sein altes Auto stark verbessert… Insbesondere die Darstellung von Navigationskarten ist Klasse.

Ich könnte mir vorstellen, dass das folgendes bei der Fahrt ganz interessant wäre:

  • Lagesensor
  • Batterieüberwachung

Solang die UI unter Apple “sinnvoll” angelegt wurde sollte das nicht zu viel Arbeit bedeuten.

Diese Geräte s.o. gibt es ab ca. 80€, allerdings ist bei unseren Testbestellungen für T4 und Defender das Modell oben genannte Modell hängengeblieben.

@Vincent Hi Vince, ich habe aktuell meine Truma Heizung mit einem kleinen LiN board am alten Relaisboard und kann sie somit betreiben.
Wenn ich das nun mit der neuen Connect app machen möchte, geht das und wenn ja, was muss mann hierzu beachten ?
Gruss, Stefan

@Vincent @Karl Hallo zusammen, könnt ihr etwas bzgl. der Truma Einbindung in die neue Connect App mit der Verwendung vom alten Relais board und und einer LIN BUS Platine sagen, ob das geht, bzw. wie ihr das auf dem neuen Core realisiert habt ?
Gruss, Stefan

Die App schickt zum Einstellen der Heizung Anfragen (“Requests”) an den HTTP Endpunkt
heater/:truefalse/:temp/:time [PUT]

Die ankommenden Daten werden von diesem Endpunkt weitergeleitet, je nachdem welche Argumente enthalten sind, also z.B. An/Aus, Temperatur- oder Laufzeiteinstellungen.

Um eine Heizung dann einzuschalten, leiten wir die Nachricht in Node-RED an den Heater Controls Flow weiter. Genauer gesagt, an die Stelle, an denen du auch aus dem Dashboard heraus die Heizung anschalten würdest. Danach wird geprüft, welche Heizung du eingestellt hast, um die Nachricht an den entsprechenden Flow weiterzugeben, um letztendlich die Heizung auch zu schalten.

Du musst also diesen Starbefehl an deine LIN-BUS Platine weiterleiten.

Anders gesagt: Die App weiß nicht welche Heizung du benutzt und es ist der App auch egal. Die App schickt einfach ganz bestimmte Befehle, die dann in Node-RED weiterverarbeitet werden. Ähnlich ist es bei den Wassertanks, die App weiß nicht ob du kapazitive oder Widerstandssensoren benutzt. Die App stellt einfach nur eine Anfrage, bekommt eine Antwort und versucht diese dann darzustellen.

Im Prinzip ist Node-RED dein Server. Alle eingehenden Nachrichten werden dort verarbeitet, aufbereitet und wieder ausgegeben. Die App macht keine Berechnungen etc. die App stellt einfach nur Anfragen an Node-RED und wenn die Antworten im erwarteten Format kommen, dann werden diese Antworten dargestellt. Soll letztendlich heißen, so ziemlich alles ist in Node-RED manipulierbar und realisierbar.

1 Like

Besten Dank für deine sehr gute Erklärung.
Gruß, Stefan

Hallo

Heute die Webasto AirTop2000 STC mit dem Core Verbunden und Funtioniert.
Allerdings Steuerung nur über den Browser.
Über die App und über das Touchdisplay funktioniert alles bis auf die Heizung…
In der App bei Heater wird gar nichts angezeigt ausser ein sich drehender Kreis.
Gruß michl

Moin,

Habe mir auch Mal die PKW app installiert.
Verbindung zum Raspi4 mit HAT klappte ohne Probleme.
Wasser und Strom passen
Nur bei der Heizung bleibt der Bildschirm schwarz.?
Gibt es demnächst ein Update ?

Hey, ist mir auch schonmal aufgefallen, dass das manchmal vorkommt. Versuch mal bitte im Flow “HTTP Api” in der Function Node “get heater stats” die beiden Werte für heattemp und heatfan als String zu übergeben:

Update kommt, dauert aber noch etwas.

1 Like

Hallo

Das war jetzt auch die Lösung für mein Problem mit der Anzeige für Heizung und Temperatur.Der ewig drehende Kreis in der app ist nun vergangenheit.

:+1:

1 Like

Moinsen,
in letzter Zeit habe ich den Eindruck, dass die App Remote nicht mehr so richtig läuft.
Die lief direkt nach der Veröffentlichung gefühlt stabiler/reaktiver.

Die Verbindung beim Start ist jetzt bei mir meistens so:

Und wenn es geklappt hat, werden die Menüs auch nicht mit Inhalt gezeigt:

Ich habe einen LTE Router im Van, an den ich das PCB bzw. den Raspi mit LanKabel verbunden habe.
Speedtest im Van mit dem Router zeigt 55down/25up MBits, das sollte also auf meiner Seite nicht das Problem sein.

Beim lokalen Zugriff per App ist es besser aber auch nicht flüssig.

Beim lokalen Zugriff mit Browser über VanPi Access Point alles gut wie gehabt.

Ist das bei euch auch so? Kann ich was tun, um die App wieder vernünftig nutzen zu können?

Danke und viele Grüße
Jochen

Hey Jochen,

Beim Öffnen der App gibt es einen Timeout von 10s oder 12s, bis die Nachricht erscheint, dass keine Verbindung hergestellt werden konnte.
Also die App schickt eine Anfrage und wenn innerhalb dieser Zeit keine Nachricht zurück kommt, bekommt man die Fehlermeldung.

Wenn du einmal drin bist, werden dann gar keine Daten geladen oder dauert es einfach nur sehr lange? Und auf allen Seiten der App, oder nur auf bestimmten?
Ist das immer so wenn du die App aufmachst, oder nur manchmal (evtl. bestimmte Tageszeiten?)

Dass Android Handys manchmal etwas länger benötigen beim lokalen Zugriff ist uns auch schon aufgefallen, konnte aber noch nicht ausmachen woran das liegt. Bei iOS ist das nicht so, da geht es immer recht flüssig.
Der Server für den Remotezugriff läuft jedenfalls entspannt und hat schnelle Zugriffszeiten, daran sollte es nicht liegen.

Hallo Vincent,
danke für das schnelle Feedback.

Wenn die App schnell startet, gehen auch die Zugriffe auf die verschiedenen Seiten meist recht flüssig (außer Heater).
Meistens habe ich beim Appstart aber das gezeigte Problem mit fehlgeschlagener Verbindung - danach öffnen dann auch die Seiten meist langsam oder gar nicht ….

An Uhrzeiten könnte ich das jetzt nicht festmachen. Eben gerade ging es wieder flott, heute Morgen wie gemeldet langsam im Connect, Seiten gar nicht. Soll heißen, nach etwa 20-20 Sekunden keine Anzeige und ich aufgegeben :cry:

Viele Grüße
Jochen

Also ich beobachte das mal weiter und werde sehen, ob ich was auffälliges bemerke. Die Schritte sind ja nur:

  • App öffnen, am Server anmelden
  • Anfrage schicken, auf Antwort von VanPi warten
  • Antwort darstellen sobald sie erreicht ist

Irgendwo dazwischen muss es ja also hängen

Prima, danke Vincent und ein schönes Wochenende :wave:

Läuft bei mir völlig problemlos , schnell und zuverlässig.

Kann man irgendwie wählen welche Temperatur auf dem Homescreen angezeigt wird?

Ja kann mann, ich poste heute Nachmittag mal meinen flow

Oder du schaust wie vincent das mit den Relays gemacht hat, Temperatur Fühler geht ähnlich.

Halo Mikel
du musst da halt nur die Globalen Daten und Namen von den Sensoren die du hast eintragen.

[
    {
        "id": "f30dc6bbea2092a0",
        "type": "function",
        "z": "e78e73d3.53155",
        "name": "get temp stats",
        "func": "if (global.get(\"temp1\") == null || global.get(\"temp1\") == \"\") {\n    global.set(\"temp1\", \"0\")\n}\nif (global.get(\"temp1\") == \"not connected\" || global.get(\"temp1\") == \"\") {\n    global.set(\"temp1\", \"0\")\n}\nif (global.get(\"temp2\") == null || global.get(\"temp2\") == \"\") {\n    global.set(\"temp2\", \"0\")\n}\nif (global.get(\"temp3\") == null || global.get(\"temp3\") == \"\") {\n    global.set(\"temp3\", \"0\")\n}\nif (global.get(\"temp4\") == null || global.get(\"temp4\") == \"\") {\n    global.set(\"temp4\", \"0\")\n}\n\nif (global.get(\"Dimmertemp1\") == null || global.get(\"Dimmertemp1\") == \"\") {\n    global.set(\"Dimmertemp1\", \"0\")\n}\nif (global.get(\"Dimmertemp2\") == null || global.get(\"Dimmertemp2\") == \"\") {\n    global.set(\"Dimmertemp2\", \"0\")\n}\nif (global.get(\"Dimmertemp3\") == null || global.get(\"Dimmertemp3\") == \"\") {\n    global.set(\"Dimmertemp3\", \"0\")\n}\nif (global.get(\"Dimmertemp4\") == null || global.get(\"Dimmertemp4\") == \"\") {\n    global.set(\"Dimmertemp4\", \"0\")\n}\nmsg.payload = {\n    \"temp1\": {\n        \"state\": global.get(\"temp1\").toString(),\n        \"name\": global.get(\"Ntemp1\"),\n    },\n    \"temp2\": {\n        \"state\": global.get(\"temp2\").toString(),\n        \"name\": global.get(\"Ntemp2\"),\n    },\n    \"temp3\": {\n        \"state\": global.get(\"temp3\").toString(),\n        \"name\": global.get(\"Ntemp3\"),\n    },\n    \"temp4\": {\n        \"state\": global.get(\"temp4\").toString(),\n        \"name\": global.get(\"Ntemp4\"),\n    },\n    \"Dimmertemp1\": {\n        \"state\": global.get(\"Dimmertemp1\").toString(),\n        \"name\": global.get(\"Ndimmertemp1\"),\n    },\n    \"Dimmertemp2\": {\n        \"state\": global.get(\"Dimmertemp2\").toString(),\n        \"name\": global.get(\"Ndimmertemp2\"),\n    },\n    \"Dimmertemp3\": {\n        \"state\": global.get(\"Dimmertemp3\").toString(),\n        \"name\": global.get(\"Ndimmertemp3\"),\n    },\n    \"Dimmertemp4\": {\n        \"state\": global.get(\"Dimmertemp4\").toString(),\n        \"name\": global.get(\"Ndimmertemp4\"),\n    }\n}\n\nreturn msg;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 280,
        "y": 600,
        "wires": [
            [
                "aa3a9dde.7746a"
            ]
        ]
    }
]

Ich habe mir immer eine Kopie von der node die ich geändert habe daneben gelegt, dann kann ich auf die schnelle immer zurück wenn was in die Hose geht :wink:


Ich habe auch nur die eine Node exportiert.

@ahtdf ich sehe nur Änderungen der Dimmy Temperaturwerte und zusätzlich die Ruuvitags, aber um die Anzeige welche Temperatur im Homescreen dargestellt wird ist nichts enthalten. Ich denke du hast meine Frage falsch verstanden oder ich habe mich falsch ausgedrückt. Ich habe zur Zeit 8 Tempanzeigen und die zwei ersten werden im Homescreen der Connect App angezeigt. Wie änder ich diese Anzeige? Ich möchte Tempfühler 4 und 1 gerne auf dem Homescreen sehen.

@Mikel
du stellst mich vor echte herausforderungen :wink:


hab auch nur die eine Node exportiert.
sorry ich habe temp2 genommen und nicht temp4
aber so müsstest du wenigstens 4 Stück konfigurieren können, ob mehtr geht ???

[
    {
        "id": "7b874c502a51605c",
        "type": "function",
        "z": "e78e73d3.53155",
        "name": "generate objects",
        "func": "let relays = msg.payload.relays ?? 0;\nlet wrelays = msg.payload.wrelays ?? 0;\nlet dimmer = msg.payload.dimmer ?? 0;\nlet temp = msg.payload.temp ?? 0;\nlet batt = msg.payload.batt ?? 0;\nlet level = msg.payload.level ?? 0;\n\nfunction wordToNumber(word) {\n    const numberWords = {\n        zero: 0,\n        one: 1,\n        two: 2,\n        three: 3,\n        four: 4,\n        five: 5,\n        six: 6,\n        seven: 7,\n        eight: 8,\n        nine: 9,\n        ten: 10, // Add more as needed\n    };\n\n    const lowerCaseWord = word.toLowerCase();\n    return numberWords[lowerCaseWord] || NaN;\n}\n\n// if (relays != null && relays != undefined && relays != \"0\") {\n//     let i = 0;\n//     msg.payload.relays = [];\n\n//     while (i < relays.length) {\n//         msg.payload.relays[i] = {};\n//         msg.payload.relays[i].id = \"Relay\"+wordToNumber(relays[i])\n//         msg.payload.relays[i].state = global.get(relays[i]);\n//         msg.payload.relays[i].name = global.get(\"N\" + relays[i]);\n//         //msg.payload.relays[i].autooff = global.get(relays[i] + \"offauto\") ?? 0;\n//         i++;\n//     }\n// }\n\n// if (wrelays != null && wrelays != undefined && wrelays != \"0\") {\n//     let i = 0;\n//     msg.payload.wrelays = [];\n\n//     while (i < wrelays.length) {\n//         msg.payload.wrelays[i] = {};\n//         msg.payload.wrelays[i].id = \"WifiRelay\"+wordToNumber(wrelays[i].substring(1))\n//         msg.payload.wrelays[i].state = global.get(wrelays[i]);\n//         msg.payload.wrelays[i].name = global.get(\"N\" + wrelays[i]);\n//         msg.payload.wrelays[i].firmware = global.get(\"wrelay\" + wordToNumber(wrelays[i].substring(1))+\"_firmware\");\n//         //msg.payload.wrelays[i].autooff = global.get(wrelays[i] + \"offauto\") ?? 0;\n//         i++;\n//     }\n// }\n\n// if (dimmer != null && dimmer != undefined && dimmer != \"0\") {\n//     let i = 0;\n//     msg.payload.dimmer = [];\n\n//     while (i < dimmer.length) {\n//         msg.payload.dimmer[i] = {};\n//         msg.payload.dimmer[i].id = \"dimmer\"+(parseInt(dimmer[i].substring(6))+1)\n//         msg.payload.dimmer[i].state = global.get(dimmer[i]);\n//         msg.payload.dimmer[i].name = global.get(\"N\" + dimmer[i]);\n//         //msg.payload.dimmer[i].autooff = global.get(dimmer[i] + \"offauto\") ?? 0;\n//         i++;\n//     }\n// }\n\nif (temp != null && temp != undefined && temp != \"0\") {\n    /*let i = 0;\n    msg.payload.temp = [];\n\n    while (i < temp.length) {\n        msg.payload.temp[i] = {};\n        msg.payload.temp[i].id = \"temp\"+parseInt(temp[i].substring(4))\n        msg.payload.temp[i].state = global.get(temp[i])\n        msg.payload.temp[i].name = global.get(\"N\" + temp[i]);\n        i++;\n    }\n    */\n    \n    msg.payload.temp = [\n        {\n        \"id\":\"temp1\",\n        \"state\":global.get(\"temp1\").toString(),\n        \"name\":global.get(\"Ntemp1\"),\n    },\n     {\n        \"id\":\"temp2\",\n        \"state\":global.get(\"temp2\").toString(),\n        \"name\":global.get(\"Ntemp2\"),\n    }\n    ];\n\n}\nif (level != null && level != undefined && level != \"0\") {\n    let i = 0;\n    msg.payload.level = [];\n\n    while (i < level.length) {\n        msg.payload.level[i] = {};\n        msg.payload.level[i].id = \"level\"+parseInt(level[i].substring(5))\n        msg.payload.level[i].state = global.get(\"Level\"+level[i].substring(level[i].length-1));\n        msg.payload.level[i].name = global.get(\"NLevel\" + level[i].substring(level[i].length - 1));\n        i++;\n    }\n}\nif (batt != null && batt != undefined && batt != \"0\" || batt != 0 && batt == 1) {\n        msg.payload.batt = {\n        \"VoltB\": global.get(\"QUCC_Volt_ges\"),\n        \"Ampere\": global.get(\"QUCC_Amp_ges\"),\n        \"battsoc\": global.get(\"QUCC_SOC\")\n        }\n}\n\n\n\nreturn msg;\n\n\n   ",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 550,
        "y": 3260,
        "wires": [
            [
                "081e13488093c513",
                "73d2e22811d81706"
            ]
        ]
    }
]