New Image 2.10 Update

Servus zusammen

@ Karl

@Vincent

was wurde in dem Neuen Update alles geändert und oder hinzugefügt, kann dazu keine Releasnote finden

Gruß Markus

Da hat sich in der App wieder was getan.
Was mich angeht, Zugriff auf die User-Daten​:+1::+1::+1:
Ich würde mir wünschen, das dass Display genau so aufgebaut ist, am besten mit dem gleichen Datenstamm

zeig mal her bitte

kenn ich nochnicht

Die sind halt jetzt sofort da, ohne erst in das feld zu klicken.

Zum Gruppieren von Attributen ist die nested Ausgabe echt hilfreich. Danke für die Erweiterung. Ich nutze es zur Ausgabe der BMS Daten meiner beiden Batterien:

Diese Lösung ist ok. Eleganter wäre aber sicher, wenn Pekayway direkt von Haus aus, mehrere Batterien unterstützen würde. Dann könnte man die Daten gesammelt dort ausgeben, wo sie hingehören. Also hier:

ui cool sowas brauch ich auch

wie bekomm ich die Daten hier angezeigt @ahtdf @abcklaus

bitte danke

Anleitung von Tristan

danke also soweit würde es funktionieren aber ich bekomme diese anzeige

global.set("customDataForApp", true);

let gruppenDaten = {
        "testrelay1": {
                state: false,
                name: "Test Relay 1"
                // optional: autooff: 0,
                // optional: offtime: 120
        },
        "testrelay2": {
                state: true,
                name: "Test Relay 2"
        }
};

global.set("customDataForApp_key_values", gruppenDaten);
return msg;

Hallo Mario
hier hast du meinen Flow, der funktioniert, da bekommst du sicher schon einige Werte angezeigt.
ich glaube das bei dir die "Gänsefüßchen " fehlen.

[{"id":"b6e238d154109197","type":"inject","z":"26c2c3c7df4ec7de","name":"set configuration","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"5","crontab":"","once":true,"onceDelay":"5","topic":"","payload":"","payloadType":"date","x":190,"y":140,"wires":[["6880477c74edfb35"]]},{"id":"6880477c74edfb35","type":"function","z":"26c2c3c7df4ec7de","name":"custom data","func":"/*******************************************************\n * Richten Sie benutzerdefinierte Schlüsselwertdaten für die App ein \n* -------------------------------------------------------------------- \n* Diese Funktion definiert Ihnen kleine Text- oder Statusfelder \n* möchte im Popup „Benutzerdefinierte Informationen“ der App angezeigt werden. \n* \n* WIE ES FUNKTIONIERT: \n* – Setzen Sie das Flag „customDataForApp“ auf true → aktiviert \n* diese Funktion für die API. \n* – Erstellen Sie ein einfaches JS-Objekt („key_values“), das enthält \n* Ihre benutzerdefinierten Etiketten und ihre Werte. \n* – Speichern Sie das Objekt in der globalen Variablen \n* „customDataForApp_key_values“ → die App übernimmt es \n* automatisch und zeigt es an, wenn es nicht leer ist. \n* \n* Jedes Schlüssel/Wert-Paar wird im Popup als Zeile angezeigt. \n* Werte werden in der App automatisch in Zeichenfolgen umgewandelt. \n*******************************************************/\n\nlet ertragge = global.get (\"VE_Ertrag_gesamt\")\nlet gesamt = \"\";\n\n if (ertragge > 0) {\n    if (ertragge >= 10000) {\n        // Umrechnen in kWh mit einer Nachkommastelle\n        let kwh = (ertragge / 1000).toFixed(1);\n        gesamt = kwh + \"kWh\";\n    } else {\n        gesamt = ertragge.toString() + \"Wh\";\n    }\n}\n\n\n\n// Benutzerdefinierten Datenmodus aktivieren\nglobal.set(\"customDataForApp\", true); // muss wahr sein, damit Daten gesendet werden können\n\n\nlet key_values = {\n\n    \"System1_AGM\":\"Shunt 2x85 Ah\", \n    \"Batterie S1\" :  global.get(\"S1pkwshuntvolt\")+(\" V\"),\n    \"SOC S1\": global.get(\"S1pkwshuntSOC\")+(\" %\"),\n    \"Strom S1\" : global.get(\"S1pkwshuntamps\")+(\" A\") ,\n    \"Leistung S1\": global.get(\"S1pkwshuntPower\") + (\" W\") ,\n    \"external_voltage\" : global.get(\"S1pkwshuntextvolt\") +(\" V\"),\n    \"\":\"\",\n    \"Spannungen\" : \"Alle Batterien\",\n    \"Fahrzeug \" : global.get(\"Booster2InputVoltage\")+(\" \")+(\"V\"),\n    \"Aufbau LifePo4\": global.get(\"Booster1InputVoltage\")+(\" \")+(\"V\"),\n    \"Aufbau AGM\": global.get(\"S1pkwshuntvolt\")+(\" \")+(\"V\"),\n    \" \": \"\",\n    \"Ladegerät\":\"Zustand\",\n    \"Solar_Lader\": global.get(\"BlueSolar_100/30State\"),\n    \"Ladebooster S1 \": global.get(\"Booster1ChargeState\"),\n    \"Ladebooster LiFePo4\": global.get(\"Booster2ChargeState\") ,\n    \"Wechselrichter\": global.get(\"WechselrichterStatus\"),\n    \"230V Ladegerät\": global.get(\"IP22ChargeState\") ,\n    \"  \": \"\",\n    \"Solar\" : \"\",\n    \"Ladespannung\": global.get(\"BlueSolar_100/30Voltage\")+(\" \")+(\"V\"),\n    \"Ladestrom\": global.get(\"BlueSolar_100/30Ladestrom\")+(\" \")+(\"A\"),\n    \"SolarPower\": global.get(\"BlueSolar_100/30Solar_power\")+(\" \")+(\"W\"),\n    \"Ertrag heute\": global.get(\"BlueSolar_100/30ErtragHeute\")+(\" \")+(\"Wh\"),\n    \"Ertrag gestern\": global.get(\"VE_yield_yesterday\")+(\" \")+(\"Wh\"),\n    \"Ertrag gesamt\": gesamt,\n    //\"Ertrag gesamt\": (global.get (\"VE_Ertrag_gesamt\"))+(\" Wh\"),\n    \"Solar max Strom\": global.get(\"VE_solarCurrent_max\")+(\" \")+(\"A\"),\n    \"PV Strom Absolut\": global.get(\"VE_solarCurrent_max_max\") + (\" \") + (\"A\"),\n    \"Solar max Power\": global.get(\"VE_PanelPower_max\")+(\" \")+(\"W\"),\n     \"   \":\"\",\n    \"CPU\": \"Alle Daten\",\n    \"CPU_usage\": global.get(\"rpi_cpu_usage\"),\n    \"CPU Temp PI\": global.get(\"rpi_cpu_temp\")+(\" \")+(\"°C\"),\n    \"Board Temp\": global.get(\"mpu6050_temp\")+(\" \")+(\"°C\"),\n    \"BMS\":\"\",\n    \"BMS Temp min\": global.get(\"QUCC_Temp_MIN\")+(\" \")+(\"°C\"),\n    \"BMS Temp max\": global.get(\"QUCC_Temp_max\")+(\" \")+(\"°C\"),\n\n   /* \"Batterie 2 Soc\" : global.get(\"EcoFlowBatt2Soc\"),\n    \"Batterie 2 Temp\" : \"(fehlt noch)\",\n    //global.get(\"EcoFlowBatt2Temp\"),\n\n    \"Batterie 3 Watts\" : global.get(\"EcoFlowBatt3Watt\"),\n    \"Batterie 3 Volt\" : global.get(\"EcoFlowBatt3\"),\n    \"Batterie 3 Ampere\" : global.get(\"EcoFlowBatt3Curr\"),\n    \"Batterie 3 Soc\" : global.get(\"EcoFlowBatt3Soc\"),\n    \"Batterie 3 Temp\" : \"(fehlt noch)\",\n    // global.get(\"EcoFlowBatt3Temp\"),\n\n    \"Alternator In Watts\" : global.get(\"EcoFlowAltWatts\"),\n    \"Alternator In Volt\": global.get(\"EcoFlowAltVol\"),\n    \"Alternator In Ampere\" : global.get(\"EcoFlowAltCurr\"),\n\n    \"PV Total Watts\" : global.get(\"mppt_pv_watts\"),\n\n    \"PV 1 Watts\" : global.get(\"EcoFlowPv1InWatt\"),\n    \"PV 1 Volt\" : global.get(\"EcoFlowPv1InVol\"),\n    \"PV 1 Ampere\" : global.get(\"EcoFlowPv1InCurr\"),\n\n    \"PV 2 Watts\" : global.get(\"EcoFlowPv2InWatt\"),\n    \"PV 2 Volt\" : global.get(\"EcoFlowPv2InVol\"),\n    \"PV 2 Ampere\" : global.get(\"EcoFlowPv2InCurr\"),\n\n\n    \"AC In Volt\" : global.get(\"EcoFlowAcInVolt\"),\n    \"AC In Ampere\" : global.get(\"EcoFlowAcInCurr\"),\n    \"AC In Watts\": global.get(\"EcoFlowAcInWatt\"),\n    \"AC Out Watts\" : global.get(\"EcoFlowAcOutWatt\"),\n    \"DC Out Watts\" : global.get(\"EcoFlowDcOutWatt\"),\n    \"DC 48 V Out Watts\" : global.get(\"EcoFlow48Watts\"),\n*/\n\n};\n\n// Das Objekt global speichern, damit die API es einschließen kann\nglobal.set(\"customDataForApp_key_values\", key_values);\n\n/******************************************************* \n* HINWEISE: \n* – Schlüssel sollten eindeutig sein; Duplikate werden überschrieben. \n* – Werte können Zeichenfolgen, Zahlen oder alles andere sein \n* macht Sinn – die App behandelt sie als Text. \n* – Um das Senden benutzerdefinierter Daten zu deaktivieren, führen Sie einfach Folgendes aus: \n* global.set(\"customDataForApp\", false); \n* global.set(\"customDataForApp_key_values\", {}); \n*******************************************************/\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":410,"y":140,"wires":[[]]}]

Ich habe es so umgesetzt. Auszug:

// Enable custom data mode
global.set("customDataForApp", true);

// Define your custom data
let key_values = {

    // Nested object example
    "BMS 1": {
        "SoC": BMS1soc + "%",
        "Stromstärke": BMS1amps + "A",
        "Spannung": BMS1_voltage + "V",
        "Zelle 1 (V)": BMS1cell1 /1000 + "V",
        "Zelle 2 (V)": BMS1cell2 / 1000 + "V",
        "Zelle 3 (V)": BMS1cell3 / 1000 + "V",
        "Zelle 4 (V)": BMS1cell4 / 1000 + "V"
    },
    "BMS 2": {
        "SoC": BMS2soc + "%",
        "Stromstärke": BMS2amps + "A",
        "Spannung": BMS2_voltage + "V",
        "Zelle 1 (V)": BMS2cell1 / 1000 + "V",
        "Zelle 2 (V)": BMS2cell2 / 1000 + "V",
        "Zelle 3 (V)": BMS2cell3 / 1000 + "V",
        "Zelle 4 (V)": BMS2cell4 / 1000 + "V"
    }
};

// Save globally so the API can include it
global.set("customDataForApp_key_values", key_values);

sehr interressant

hab dein code 1:1 übernommen und bekomm wieder das selbe bild

hab ein iPhone 17 Pro Max und neueste version von Pekaway Connect

Bei Klaus ist nur ein Auszug, das ist nicht dad ganze Skript.
Für z.B. BMS1soc müsstest du dir noch

let BMS1soc = global.get soc
Oder ähnliches anlegen.
Wenn du bei mir schaust, ich habe das in der gleichen Zeile stehen.
Ist allerdings nicht so schön strukturiert wie bei Klaus :wink:

Ja, korrekt. Ich hatte nur einen Auszug eingestellt, weil die Quelle der BMS Informationen individuell ist. Vollständig schaut es so aus:

/*******************************************************
 * Custom Data for App
 *******************************************************/

// Enable custom data mode
global.set("customDataForApp", true);

/**
 * Liefert einen Wert oder einen Default zurück
 */
function getValue(value, defaultValue = 0) {
    return (value !== undefined && value !== null)
        ? Number(value)
        : defaultValue;
}

/**
 * Formatiert Zellspannung in mV -> V
 */
function formatCellVoltage(value) {
    return (getValue(value) / 1000).toFixed(3) + " V";
}

// BMS1
const BMS1soc = global.get("BMS1soc");
const BMS1amps = global.get("BMS1amps");
const BMS1voltage = global.get("BMS1_voltage");
const BMS1power = global.get("BMS1power");
const BMS1cell1 = global.get("BMS1cell1");
const BMS1cell2 = global.get("BMS1cell2");
const BMS1cell3 = global.get("BMS1cell3");
const BMS1cell4 = global.get("BMS1cell4");

// BMS2
const BMS2soc = global.get("BMS2soc");
const BMS2amps = global.get("BMS2amps");
const BMS2voltage = global.get("BMS2_voltage");
const BMS2power = global.get("BMS2power");
const BMS2cell1 = global.get("BMS2cell1");
const BMS2cell2 = global.get("BMS2cell2");
const BMS2cell3 = global.get("BMS2cell3");
const BMS2cell4 = global.get("BMS2cell4");

// Define custom data
const key_values = {

    "BMS 1": {
        "SoC": getValue(BMS1soc).toFixed(0) + " %",
        "Stromstärke": getValue(BMS1amps).toFixed(1) + " A",
        "Spannung": getValue(BMS1voltage).toFixed(2) + " V",
        "Leistung": getValue(BMS1power).toFixed(0) + " W",
        "Zelle 1": formatCellVoltage(BMS1cell1),
        "Zelle 2": formatCellVoltage(BMS1cell2),
        "Zelle 3": formatCellVoltage(BMS1cell3),
        "Zelle 4": formatCellVoltage(BMS1cell4)
    },

    "BMS 2": {
        "SoC": getValue(BMS2soc).toFixed(0) + " %",
        "Stromstärke": getValue(BMS2amps).toFixed(1) + " A",
        "Spannung": getValue(BMS2voltage).toFixed(2) + " V",
        "Leistung": getValue(BMS2power).toFixed(0) + " W",
        "Zelle 1": formatCellVoltage(BMS2cell1),
        "Zelle 2": formatCellVoltage(BMS2cell2),
        "Zelle 3": formatCellVoltage(BMS2cell3),
        "Zelle 4": formatCellVoltage(BMS2cell4)
    }

};

// Save globally so the API can include it
global.set("customDataForApp_key_values", key_values);

Zum Lesen der BMS Informationen nutze ich “BLE Battery Management System (BMS)” aus dem HACS in Home Assistant. Alles läuft über einen ESPHome Bluetooth Proxy. Home Assistant stellt dann die BMS Daten via MQTT für die Nutzung in Pekaway bereit.

selben Fehler noch immer

irgendwie sieht es aus als würde bei mir die app ein anzeige problem mit objecten haben

Das ist tatsächlich etwas seltsam. Ich habe grad mal genau Dein Coding bei mir eingefügt. Im Resultat schaut es so aus:

Hast du iOS oder Android?

ich nutze iOS.

Viele Grüße

Welche version? Von ios und pekaway connect