Pekaway Connect: die neue App

Ich habs gerade ausprobiert es gehen nur 4 Temps

[
    {
        "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        \"id\":\"temp3\",\n        \"state\":global.get(\"temp3\").toString(),\n        \"name\":global.get(\"Ntemp3\"),\n    },\n     {\n        \"id\":\"temp4\",\n        \"state\":global.get(\"temp4\").toString(),\n        \"name\":global.get(\"Ntemp4\"),\n    }\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"
            ]
        ]
    }
]
1 Like

@ahtdf ich bin Sprachlos! Muss noch Kleinigkeit ändern, Batt Status passt bei mir natürlich nicht, aber es ist jetzt schon Genial!!!

ja sorry da ist natürlich mein QUCC BMS drinne.
aber das kannst du ja auf Mainbat ändern

Erledigt! Genial, Vielen Dank Arno.
Das hätte ich alleine niemals gekonnt!!!

1 Like

Moin,

Leider hat dies bei mir nicht geholfen.

→ gibt es die neue Software für die alte IOT-brige bereits, und wie flasht man diese?
Gruß, Stefan

Hallo, ich bekomme immer einen Fehler beim Flashen mit dem neuesten Balena Etwcher:


Ich habe die SD Karte bereits formatiert.

Hallo, mit dem Image Tool für raspberry pi imager funktioniert es ohne Probleme. https://www.raspberrypi.com/software/

Moin,
während meiner 2 Monatigen Auszeit, habe ich nun auch zeit gefunden etwas mit dem System zu spielen.
Auch die Äderung auf String, hilf bei mir nichts.
Die Heizung kann ich weiterhin nur über das WEB Interface bedienen.
In der PKW App ist bei der Heizung nichts zu sehen.
Gibt es ggf. noch einen anderen Lösungsansatz?

Gruß Alex

Zeig mal bitte was bei dir in der Node steht

Hi,

Anbei ein Bild von den settings

Auf welcher Version bist du?

In der neusten Version steht das drin:

if (global.get(“heater_runtime”) == undefined || global.get(“heater_runtime”) == null || global.get(“heater_runtime”) == “cancel”) {global.set(“heater_runtime”, 0)}
msg.payload = {
“heatertoggle”:global.get(“HeaterToggle”),
“heatstatus”:global.get(“heatstatus”),
“heattemp”:global.get(“heattemp”).toString(),
“heatvolt”:global.get(“heatvolt”),
“heatfan”:global.get(“heatfan”).toString(),
“heatglow”:global.get(“heatpump”),
“heatwpump”:global.get(“heatwpump”),
“heaterror”:global.get(“heaterror”),
“targettemp_vanpi”:Number(global.get(“settemp”)),
“runtime”:Number(global.get(“heater_runtime”))
};
return msg;

Da sind noch ein paar Variablen dazugekommen, die müssen natürlich da sein.

Ich bin auf version 1.1.2

1 Like

Hatte jetzt nochmal den button online update gedrückt.
1bis 9 durchgelaufen, Pi hat selber neu gestartet, leider bekomme ich jetzt nur noch dieses Bild.
Gibt es eine Rettung aus diesem Modus?

Die App funktioniert erst ab v2.0.0. Das ist offiziell aber erst ab dem VANPI Core Board unterstützt. Es besteht die Möglichkeit, sich das anzupassen auf das ältere Board. Die neue Software v2.0.2 hat eine Funktion, zwischen Relayboard und Core umzuschalten.
Wenn das alles ohne Probleme läuft, kann das Updatescript, auf dass die ältere Software zugreift, mit dem neueren ersetzt werden.

Bei einem Klick auf Update wird immer ein Backup angelegt unter /home/pi/pekaway/nrbackups. Da gibt es eine Datei ‘flows_pekaway_date.json’. Das ist deine Backup Datei. Mit dieser Datei kannst du die Datei ‘flows_pekaway.json’ im Ordner /home/pi/.node-red ersetzen. Dann einmal Node-RED neustarten (oder den Raspberry), dann sollte alles wieder da sein.

Sobald alles in der neuen Software so läuft wie es soll, kannst du dann auf die neuste Version updaten (nur schwarzes Relayboard, nicht das blaue) und dann sollte auch die App mit allen Funktionen nutzbar sein. Außer den Hardwareseitigen Änderungen, den Lagesensor z.B. gibt es ja erst mit dem Core Board.

Das blaue Board geht auch, ist halt etwas mehr zu tun.

Automatisches Update ist mit Vorsicht zu genießen :wink: wegen des Relays
Und natürlich ist nicht alles nutzbar, im Core und im schwarzen Board ist mehr drin.

Ich habe am schwarzen Relaisboard über den UART ein GPS Modul angeschlossen.
Dieses habe ich nach dem Tutorial auf der pekaway Website gemacht.

Die GPS Daten kommen auch an.

Jetzt habe ich versucht diese zu verarbeiten.

Ich verwende die Version 2.0.4. Dort habe ich den GPS Flow abgeändert.

Auf dem Dashboard in der Map zeigt es mir den korrekten Standort an.
In der App kommt nur “keine gültigen GPS Daten gefunden”.

Was habe ich falsch gemacht?

gps.json (3.2 KB)

Hey @Tobi
DIe App fragt über die Api die Variablen an, in die du deine GPS Werte schreibst. Du hast aber in der einen Function Node stehen:

global.set(“gps_updated”) // needed for smartphone app!
global.set(“latitude”)
global.set(“longitude”)

Wenn du Variablen setzt, dann musst du diesen auch einen Wert zuweisen. Z.B. global.set("latitude", msg.latitude)
Damit würde der globalen Variable “latitude” der Wert zugewiesen werden, der aktuell in msg.latitude drin steht. Das ist auch der Wert, den du an die Node für das Dashboard weitergibst, aber er wird in deinem Fall noch nicht in die Variable geschrieben, den die API bzw. die App braucht.

Du bräuchtest also

global.set(“gps_updated”, new Date()) // schreibt das aktuelle Datum
global.set(“latitude”, msg.latitude)
global.set(“longitude”, msg.longitude)

Hi @Vincent

Ich habe mein System jetzt auf 2.0.4 per online Update umgestellt.

Die Connect App ist auch geupdated worden auf 1.0.4.

Ich wundere mich aber, dass in der Anzeige in der App < v2.0.4 angezeigt wird:

Das erklärt vielleicht auch das Problem, das nun keine Steuerung der Heizung mehr möglich ist?

Die Meldung, dass keine Temperatursensoren gefunden werden ist ja falsch. Und über die Weboberfläche lässt sich die Heizung wie gehabt steuern.
Da scheint in der Kommunikation zur App was zu hängen. Die App habe ich als ersten Versuch zur Lösung übrigens auch schon komplett deinstalliert und neu aus dem AppStore installiert.
Das VanPi System wurde auch rebootet.

Ergänzung: auf meinem alten iPhone habe ich die alte App 1.0.3 - diese zeigt sowohl die richtige Version 2.0.4 an als auch die Heizungssteuerung (Autoterm).

Viele Grüße
Jochen

@Stauber besteht die Möglichkeit, dass du da noch irgendwo ein zweites System am Laufen hast, das bei einem Remotezugriff die Antworten liefert?