E3DC-Modbus, Bit auswerten

Node-RED als CCU3/RaspberryMatic Addon, WebApp, HomeKit, ...

Moderator: Co-Administratoren

Antworten
joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

E3DC-Modbus, Bit auswerten

Beitrag von joesch » 07.03.2024, 14:13

Hallo zusammen!

Aktuell lese ich dank der Veröffentlichungen im Forum erfolgreich die Messwerte eines E3DC aus (Auszug aus der Function-Node):

Code: Alles auswählen

var ui32a = new Uint32Array(msg.payload);

msg1 = {};
msg2 = {};
...
var pvi = 0;
var bat = 0;
...
pvi += ui32a[0];
pvi -= ui32a[1];
bat += ui32a[2];
bat -= ui32a[3];
...
...
msg1.payload = pvi;
msg2.payload = bat;
...
return [msg1,msg2,msg3,msg4,msg5,msg6,msg7,msg8,msg9,msg10];
Dabei handelt es sich um "Zahlenwerte", die ich grafisch darstelle und in Systemvariablen schreibe.
Bei den Werten für die Wallbox werden die jeweiligen Zustände/Flags biteise ausgegeben:
wb01.PNG
wb01.PNG (7.75 KiB) 263 mal betrachtet
wb02.PNG
Kann mir jemand bezügich des "bitweisen" Auslesens der Werte helfen? Sprich wie kann ich auslesen, ob z.B. der Solarmodus aktiv ist (Bit 1)? Wie kann ich das in die Funktion-Node einbauen? Oder sollte man das getrennt aufteilen?
Vielen Dank schon mal für eure Unterstützung!

VG, joesch
System: RaspberryMatic auf Raspberry Pi 3 Model B Rev 1.2 (rpi3) mit RPI-RF-MOD (4.4.22)

mademyday
Beiträge: 272
Registriert: 03.10.2014, 12:46
System: CCU
Wohnort: Enzkreis
Hat sich bedankt: 3 Mal
Danksagung erhalten: 43 Mal

Re: E3DC-Modbus, Bit auswerten

Beitrag von mademyday » 07.03.2024, 16:15

zB bit1:

Code: Alles auswählen

> ( 255 & 0b1 ) !== 0
true
> ( 256 & 0b1 ) !== 0
false
zB bit4:

Code: Alles auswählen

> ( 8 & 0b1000 ) !== 0
true
> ( 7 & 0b1000 ) !== 0
false

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: E3DC-Modbus, Bit auswerten

Beitrag von joesch » 09.03.2024, 15:47

Vielen Dank für deine Rückmeldung! Ich habe das in einem Function-Node wie folgt umgesetzt:

Code: Alles auswählen

var wallboxregister = msg.payload;

msg1 = {};

if (wallboxregister && 0b1000 !== 0) {
    msg1.payload = "Lädt";
}
else{
    msg1.payload = "Lädt nicht";
}

return [msg1];
In die Variable Wallboxregister habe ich zwei verschiedene Beispielwerte als Eingangswert übergeben:
1. Wert: 4131 (Dezimal)
Das müsste binär folgendem Wert entsprechen (wobei das Bit 0 ganz rechts steht (?)):
0001 0000 0010 0011
2. Wert: 4139 (Dezimal)
0001 0000 0010 1011
In der Function-Node werte ich das 4. Bit von rechts aus (entspricht dem Bit3 der Übesicht von E3DC). Jedoch erhalte ich am Ausgang beide Male den Wert "Lädt".

Wo könnte hier mein (Denk-)Fehler liegen?

Vielen Dank und VG, joesch

Benutzeravatar
Henke
Beiträge: 1526
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 141 Mal
Danksagung erhalten: 306 Mal

Re: E3DC-Modbus, Bit auswerten

Beitrag von Henke » 09.03.2024, 16:03

joesch hat geschrieben:
09.03.2024, 15:47
if (wallboxregister && 0b1000 !== 0)

Code: Alles auswählen

if ( (wallboxregister & 0b1000) !== 0)
Weniger Denk als Tippfehler

Nicht getestet, aber sauberer Stil:

Code: Alles auswählen

if ( wallboxregister & 0b1000)

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: E3DC-Modbus, Bit auswerten

Beitrag von joesch » 09.03.2024, 17:46

Vielen Dank! Funktioniert jetzt :-)

joesch
Beiträge: 789
Registriert: 03.02.2007, 14:57
Hat sich bedankt: 64 Mal
Danksagung erhalten: 2 Mal

Re: E3DC-Modbus, Bit auswerten

Beitrag von joesch » 10.03.2024, 09:25

Hier noch mal die Function-Node als "Blaupause" für alle Infos zur Wallbox. Allerdings werden die aktuellen E3DC-WB nur noch ohne Schuko-Steckdose (warum auch immer ...) augeliefert.

Code: Alles auswählen

var wallboxregister = msg.payload;

msg1 = {}; /*Bit 0: Wallbox verfügbar*/
msg2 = {}; /*Bit 1: Solarbetrieb aktiv*/
msg3 = {}; /*Bit 2: Laden abgebrochen*/
msg4 = {}; /*Bit 3: Auto lädt*/
msg5 = {}; /*Bit 4: Typ2-Stecker verriegelt*/
msg6 = {}; /*Bit 5: Typ-2-Stecker gesetckt*/
msg7 = {}; /*Bit 6: Schukosteckdose an*/
msg8 = {}; /*Bit 7: Schukostecker gesteckt*/
msg9 = {}; /*Bit 8: Schukostecker verriegelt*/
msg10 = {}; /*Bit 9: Relais an, 16A. 1phasig, Schuko*/
msg11 = {}; /*Bit 10: Relais an, 16A, 3phasig, Typ 2*/
msg12 = {}; /*Bit 11: Relais an, 32A, 3phasig, Typ 2*/
msg13 = {}; /*Bit 12: (nur) eine Phase aktiv*/

if (wallboxregister & 0b1) {msg1.payload = true;}else{msg1.payload = false;}
if (wallboxregister & 0b10) {msg2.payload = true;}else{msg2.payload = false;}
if (wallboxregister & 0b100) {msg3.payload = true;}else{msg3.payload = false;}
if (wallboxregister & 0b1000) {msg4.payload = true;}else{msg4.payload = false;}
if (wallboxregister & 0b10000) {msg5.payload = true;}else{msg5.payload = false;}
if (wallboxregister & 0b100000) {msg6.payload = true;}else{msg6.payload = false;}
if (wallboxregister & 0b1000000) {msg7.payload = true;}else{msg7.payload = false;}
if (wallboxregister & 0b10000000) {msg8.payload = true;}else{msg8.payload = false;}
if (wallboxregister & 0b100000000) {msg9.payload = true;}else{msg9.payload = false;}
if (wallboxregister & 0b1000000000) {msg10.payload = true;}else{msg10.payload = false;}
if (wallboxregister & 0b10000000000) {msg11.payload = true;}else{msg11.payload = false;}
if (wallboxregister & 0b100000000000) {msg12.payload = true;}else{msg12.payload = false;}
if (wallboxregister & 0b1000000000000) {msg13.payload = true;}else{msg13.payload = false;}

return [msg1,msg2,msg3,msg4,msg5,msg6,msg7,msg8,msg9,msg10,msg11,msg12,msg13];

Tyfys
Beiträge: 551
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 125 Mal

Re: E3DC-Modbus, Bit auswerten

Beitrag von Tyfys » 10.03.2024, 11:05

Wenn es sich um Javascript handelt, müsste es doch auch so ohne if gehen :

Code: Alles auswählen

msg1.payload  = (wallboxregister & 0b1);
msg2.payload  = (wallboxregister & 0b10);
msg3.payload  = (wallboxregister & 0b100);
msg4.payload  = (wallboxregister & 0b1000);
msg5.payload  = (wallboxregister & 0b10000);
msg6.payload  = (wallboxregister & 0b100000);
msg7.payload  = (wallboxregister & 0b1000000);
msg8.payload  = (wallboxregister & 0b10000000);
msg9.payload  = (wallboxregister & 0b100000000);
msg10.payload = (wallboxregister & 0b1000000000);
msg11.payload = (wallboxregister & 0b10000000000);
msg12.payload = (wallboxregister & 0b100000000000);
msg13.payload = (wallboxregister & 0b1000000000000);
Gruß
Harry

Benutzeravatar
Henke
Beiträge: 1526
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 141 Mal
Danksagung erhalten: 306 Mal

Re: E3DC-Modbus, Bit auswerten

Beitrag von Henke » 10.03.2024, 20:34

13 mal das gleiche mit 13 Ausgängen der node und dann beim nächsten mal...

Das geht eleganter. Generell sollte man die Daten einer msg anreichern und die Anzahl der Ausgänge reduzieren:

Code: Alles auswählen

    const WallBoxRegister = {
        Wallbox_verfuegbar: (1 << 0),
        Solarbetrieb_aktiv: (1 << 1),
        Laden_abgebrochen: (1 << 2),
        Auto_laedt: (1 << 3),
        Typ2_Stecker_verriegelt: (1 << 4),
        Typ2_Stecker_geseteckt: (1 << 5),
        Schukosteckdose_an: (1 << 6),
        Schukostecker_gesteckt: (1 << 7),
        Schukostecker_verriegelt: (1 << 8),
        Relais_an_16A_1phasig_Schuko: (1 << 9),
        Relais_an_16A_3phasig_Typ2: (1 << 10),
        Relais_an_32A_3phasig_Typ_2: (1 << 11),
        nur_eine_Phase_aktiv: (1 << 12),
    };
    // msg anreichern
    msg.wallbox = { wert: msg.payload, Wbr: WallBoxRegister };

    // In allen weiteren Nodes können dann Abfragen in diesem Stil laufen:
    if (msg.wallbox.wert & msg.wallbox.Wbr.Auto_laedt)
        if (!(msg.wallbox.wert & msg.wallbox.Wbr.Solarbetrieb_aktiv))
        {
            msg.payload = "Auto lädt, aber kein Solarbetrieb";
            node.send ( [null, { payload: "Nachricht an 2. Ausgang"});
        }
    return msg;

Antworten

Zurück zu „RedMatic“