Mit Node-Red auf Victron Cerbo openDTU steuern

Moin, wende mich mal mit einem IPS fernen Thema an euch.
Folgender Hintergrund: mein IP symcon-Dienst ist in diesem Jahr bisher dreimal nachts abgestürzt. In den logs konnte ich keine Fehlerursache feststellen, vielleicht ein PC-Hardwaredefekt (Windows10) ? Nach Neustart des PC läuft IPS wieder für einige Wochen fehlerfrei.
Mit IPS regel ich meine PV-Batterienladung/Entladung,
-Tagsüber wird die Batterie von der PV mit einem Victron MPPT-Laderegler (Kontrolle MPPT/Batterie durch Victron Cerbo GX) bis zu einem SoC von 89% geladen, ist ein weiterer Überschuß vorhanden, wird über openDTU und angeschlossenem Hoymiles-Wechselrichter die Leistung ins Netzt geleitet, mit einer Hysterese von 4% SoC.
Die Entladung erfolgt nachts indem ich über openDTU und dort angeschlossenem Hoymiles-Wechselrichter die Batterie wieder bis auf einen SOC < 15% entlade.
Versagt nun der IPS-Steuerung (Dienst) wird die Batterie zwar durch das BMS geschützt, aber weiter bis auf 0% entladen und abgeschaltet.
Dies möchte ich zur Schonung der Batterie und Aufrechterhaltung der Funktion des Cerbo GX durch Abschaltung der Entladung ab einem SOC<10 verhindern.
Dazu möchte ich auf dem Cerbo GX (dort läuft auch NodeRed) den SOC überwachen und über ein http-request-Node die openDTU/Hoymiles auf Output-Limit von 0% einstellen.
Als zweiten Schritt evtl. auch über eine vor dem Windows-PC vorgeschalteten Shelly-Plug den PC ausschalten / einschalten um den IPS-Dienst wieder zu aktivieren.
Nun sitze ich schon einige Zeit um in NodeRed die Ansteuerung des Output-Limit der openDTU hin zu bekommen, leider krieg ich es nicht zum Laufen.
Ansprechen mit cURL auf dem PC klappt, das Limit kann ich einstellen, d.h. user/password der openDTU und Seriennummer des Hoymiles stimmen.
( curl --include --request POST --data „data={‚serial‘:‚114190xxxxx‘, ‚limit_type‘:1, ‚limit_value‘:99}“ --user „admin:openDTU42“ http://192.168.178.20/api/limit/config )
Setze ich nun die cURL Abfolge in NodeRed um, mit anschließendem http-request, erhalte ich nur ein: „warning , no values found, code 1002“.
Hier die Eingaben in der function von NodeRed (natürlich mit den richtigen Adressen) :
( msg.method = „POST“;
msg.url = ‚http://192.168.178.20/api/limit/config‘;
msg.headers = {
‚Authorization‘: 'Basic '+(Buffer.from(‚admin:openDTU42‘)).toString(‚base64‘)
};
msg.payload = {
‚serial‘: ‚114190xxxxxx‘,
‚limit_type‘: 1,
‚limit_value‘: 55
};
return msg; )

Setze ich falsche Werte in die ‚Authorization‘ erhalte ich überhaupt keine Rückmeldung, also scheint das ja schon mal zu stimmen.
Kenne mich leider mit NodeRed nicht so aus, um den Fehler einzukreisen.
Hat jemand eine Idee oder das schon mal in NodeRed so umgesetzt?
Für eure Hilfe wäre ich dankbar.
Gruß Gerd

Moin, antworte mir mal selbst, vielleicht kann es ja jemand brauchen:
(Danke für den Stupser im Beitrag von jonnycastaway),

  1. in einem function-Node ein Objekt mit der Hoymiles-Snr und dem limit_type und dem limit_value anlegen:
    var Hoymiles_SNR = „114190xxxxxxxxx“;
    var Hoymiles_Limit = 98;
    msg.payload=[{serial:Hoymiles_SNR,
    limit_type:1, // setzen Limit temporär
    limit_value:Hoymiles_Limit}];
    return msg;

  2. den Ausgang der function durch ein json-Node senden.

  3. den Ausgang der json-Node an die nächste function-Node senden :
    var inData = msg.payload;
    var outData = inData.replace(‚[‘, ‚‘).replace(‚]‘, ‚‘);
    var URLopenDTU = „http://192.168.178.20“;
    var NewMsg={};
    NewMsg.method = „POST“;
    NewMsg.url = URLopenDTU + ‚/api/limit/config‘;
    NewMsg.headers = {
    ‚Authorization‘: 'Basic '+(Buffer.from(‚admin:openDTU42‘)).toString(‚base64‘),
    „Content-Type“: „application/x-www-form-urlencoded“
    };
    NewMsg.payload = ‚data=‘ + outData;
    return NewMsg;

  4. Ausgang der function-Node an den http-request , dort die Methode „Durch msg.method festgelegt“ auswählen.

  5. Die Ausgabe sollte dann nach dem Aufruf sein:
    _headers: object
    content-length: „58“
    content-type: „application/json“
    connection: „close“
    accept-ranges: „none“
    x-node-red-request-node: „b32cd434“
    payload: „{„type“:„success“,„message“:„Settings saved!“,„code“:1001}“
    msgid: „0896aad15019f103“
    statusCode: 200

Hoffe das ist verständlich, zumindest bei mir funktionierts.
Gruß Gerd