Weiter zum Inhalt
  • Home
  • Aktuell
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Node-Red
  5. ich brauche etwas Nachhilfe mit Node Red und RS232

NEWS

  • Monatsrückblick Juli / August 2026 ist online!
    BluefoxB
    Bluefox
    10
    1
    1.0k

  • Der neue Monatsrückblick für Mai und Juni 2026 ist online!
    BluefoxB
    Bluefox
    8
    1
    1.4k

  • wichtiges UPDATE für controller 7.2.2 im stable
    HomoranH
    Homoran
    11
    1
    3.9k

ich brauche etwas Nachhilfe mit Node Red und RS232

Geplant Angeheftet Gesperrt Verschoben Node-Red
77 Beiträge 6 Kommentatoren 1.2k Aufrufe 4 Beobachtet
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • Marc BergM Marc Berg

    @andibr

    ich sprach auch von der "Aufteilung", dort die 250ms setzen.

    A Offline
    A Offline
    andibr
    schrieb am zuletzt editiert von
    #8

    @Marc-Berg
    du meinst so?
    Bildschirmfoto vom 2026-08-08 14-52-13.png

    Nur bringt das leider auch nur ein Teil

    Bin mir aber gerade noch am überlegen wie ich diese ASCII String nun in ein eingermassen brauchbares Zeugs verwandeln kann.
    Der String ist ab der 3.Zeile immer identisch aufgeteilt, leider mit Leerzeichen und nichts schlauen drin und erst noch nicht immer gleich viele Stellen.

    1 Antwort Letzte Antwort
    0
    • HomoranH Homoran

      @andibr
      [OT]
      Hast du dieses
      2377.jpg
      Kabel?

      A Offline
      A Offline
      andibr
      schrieb am zuletzt editiert von andibr
      #9

      @Homoran
      Nee, nicht ganz meines sieht etwas wilder aus:
      20260807_094759.jpg

      Ist aber im Prinzip genau das selbe:
      ein aktives USB Verlängerungskabel - eine USBzuRS232 (mit FTF8I5L-Chip) - uraltes Cisco Firewall Console Kabel.

      Der USBzuRS232 hat folgende Spez:
      T: Bus=01 Lev=02 Prnt=10 Port=03 Cnt=01 Dev#= 11 Spd=12 MxCh= 0
      D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
      P: Vendor=0403 ProdID=6001 Rev=06.00
      S: Manufacturer=FTDI
      S: Product=USB Serial Converter
      S: SerialNumber=FTFS8I5L
      C: #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=44mA
      I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ftdi_sio
      E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
      E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms

      Ohne das lange USB Kabel kann ich mit dieser Kombination auch mit dem Pytes-Tool BMSQ.... und einem Windows direkt auf die 48100R zugreifen. Darum weiss ich das die Kombi ja funktioniert. Irgendwo habe ich etwas gelesen von einem "RS232-Null-Modemkabel". Aber das steht ja sehr selten auf den Kabel drauf.

      Das ganze steckt jetzt am Proxmox Host und ist an den Node-Red Container durchgereicht mit mode=0777. Es scheint zumindest teilweise zu funktionieren. Wobei ich nicht ganz abschätzen kann, ob es nun an der Verkabelung, BMS oder Node-Red liegt wieso da teilweise unterschiedliche Resultate ankommen.

      A 1 Antwort Letzte Antwort
      0
      • A andibr

        @Homoran
        Nee, nicht ganz meines sieht etwas wilder aus:
        20260807_094759.jpg

        Ist aber im Prinzip genau das selbe:
        ein aktives USB Verlängerungskabel - eine USBzuRS232 (mit FTF8I5L-Chip) - uraltes Cisco Firewall Console Kabel.

        Der USBzuRS232 hat folgende Spez:
        T: Bus=01 Lev=02 Prnt=10 Port=03 Cnt=01 Dev#= 11 Spd=12 MxCh= 0
        D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
        P: Vendor=0403 ProdID=6001 Rev=06.00
        S: Manufacturer=FTDI
        S: Product=USB Serial Converter
        S: SerialNumber=FTFS8I5L
        C: #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=44mA
        I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ftdi_sio
        E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
        E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms

        Ohne das lange USB Kabel kann ich mit dieser Kombination auch mit dem Pytes-Tool BMSQ.... und einem Windows direkt auf die 48100R zugreifen. Darum weiss ich das die Kombi ja funktioniert. Irgendwo habe ich etwas gelesen von einem "RS232-Null-Modemkabel". Aber das steht ja sehr selten auf den Kabel drauf.

        Das ganze steckt jetzt am Proxmox Host und ist an den Node-Red Container durchgereicht mit mode=0777. Es scheint zumindest teilweise zu funktionieren. Wobei ich nicht ganz abschätzen kann, ob es nun an der Verkabelung, BMS oder Node-Red liegt wieso da teilweise unterschiedliche Resultate ankommen.

        A Offline
        A Offline
        andibr
        schrieb am zuletzt editiert von andibr
        #10

        versteht das jemand?
        Bildschirmfoto vom 2026-08-08 15-28-36.png

        der Node "csv-bearbeiten" ist zwar toll, macht aber irgendwie nicht reglmässig das gleiche?
        Bildschirmfoto vom 2026-08-08 15-29-40.png

        Da ist doch schon eine ganze Menge aufgeteilt, nur eben bei den einzelnen Zellen fehlen irgendwie Inhalte. Irgendwas habe ich falsch eingestellt.

        Zusätzlich sind da im Debug 10 alle 16 Zellen drin, obwohl im Debug 9 nur bis 8 aufgeführt sind, es scheint da irgendwie eine Anzeigekürzung zu geben.

        OliverIOO 1 Antwort Letzte Antwort
        0
        • A andibr

          versteht das jemand?
          Bildschirmfoto vom 2026-08-08 15-28-36.png

          der Node "csv-bearbeiten" ist zwar toll, macht aber irgendwie nicht reglmässig das gleiche?
          Bildschirmfoto vom 2026-08-08 15-29-40.png

          Da ist doch schon eine ganze Menge aufgeteilt, nur eben bei den einzelnen Zellen fehlen irgendwie Inhalte. Irgendwas habe ich falsch eingestellt.

          Zusätzlich sind da im Debug 10 alle 16 Zellen drin, obwohl im Debug 9 nur bis 8 aufgeführt sind, es scheint da irgendwie eine Anzeigekürzung zu geben.

          OliverIOO Offline
          OliverIOO Offline
          OliverIO
          schrieb am zuletzt editiert von OliverIO
          #11

          @andibr

          Schau mal in die Daten per hexadezimal rein.
          Sind das wirklich Leerzeichen oder evtl ein tab (hex glaube ich 09)
          Wenn die Daten tatsächlich mit einer unbestimmten Anzahl von Leerzeichen als trennzeichen kommt, dann ist es ein csv mit fester feldgrösse, dann wirst du zählen müssen und das der csv Node konfigurieren wenn sie das kann.

          Alternativ eine funktions Node, bei der man den Text anhand des Zeilenumbrüche in ein Array füllt und dann jede Zeile mit substring die verschiedenen Felder extrahiert.

          Willst du jede Zeile separat weiter verarbeiten oder die Tabelle als Ganzes?
          Das hängt dann davon ab ob die funktionsnode eine Message oder für jede Zeile eine Message erzeugt.

          Meine Adapter und Widgets
          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
          Links im Profil

          A 1 Antwort Letzte Antwort
          0
          • OliverIOO OliverIO

            @andibr

            Schau mal in die Daten per hexadezimal rein.
            Sind das wirklich Leerzeichen oder evtl ein tab (hex glaube ich 09)
            Wenn die Daten tatsächlich mit einer unbestimmten Anzahl von Leerzeichen als trennzeichen kommt, dann ist es ein csv mit fester feldgrösse, dann wirst du zählen müssen und das der csv Node konfigurieren wenn sie das kann.

            Alternativ eine funktions Node, bei der man den Text anhand des Zeilenumbrüche in ein Array füllt und dann jede Zeile mit substring die verschiedenen Felder extrahiert.

            Willst du jede Zeile separat weiter verarbeiten oder die Tabelle als Ganzes?
            Das hängt dann davon ab ob die funktionsnode eine Message oder für jede Zeile eine Message erzeugt.

            A Offline
            A Offline
            andibr
            schrieb am zuletzt editiert von
            #12

            @OliverIO
            Bin zwar nicht mehr vor dem PC, aber es sind echt Leerzeichen. Habe das ganze mal in Notepad hineinkopiert und die quasi Spalten angeschaut es sind einmal 9 und dann wieder 13 und wieder 9.
            Auch habe ich das ganze mal als csv gespeichert und auch Excell erkennt nicht autmatisch Spalten. Was ich bereits erreicht habe ist, dass ich die Leerzeichen durch ein Semikolon ersetzen konnte. Was ich nun aber nicht schaffe sind die ersten beiden Zeilen wegzulassen und die entsprechenden Werte rauszupicken. Ich bin da mit Node-Red noch Anfänger und habe auch sonst mit Software manchmal meine Mühe.

            Das ganze soll eigentlich einfach meine 8 Akku mit jeweils 16 Zellen auslesen und die Spannung und Ladung in die Datenpunkte füllen. Ob das nun im eigenen Node-Red Container oder im iobroker Container läuft ist mir eigentlich egal. Und ja ich weiss es gibt bereits ein Adapter aber der funktioniert scheinbar bei Pytes nicht mehr oder nicht.

            OliverIOO 2 Antworten Letzte Antwort
            0
            • A andibr

              @OliverIO
              Bin zwar nicht mehr vor dem PC, aber es sind echt Leerzeichen. Habe das ganze mal in Notepad hineinkopiert und die quasi Spalten angeschaut es sind einmal 9 und dann wieder 13 und wieder 9.
              Auch habe ich das ganze mal als csv gespeichert und auch Excell erkennt nicht autmatisch Spalten. Was ich bereits erreicht habe ist, dass ich die Leerzeichen durch ein Semikolon ersetzen konnte. Was ich nun aber nicht schaffe sind die ersten beiden Zeilen wegzulassen und die entsprechenden Werte rauszupicken. Ich bin da mit Node-Red noch Anfänger und habe auch sonst mit Software manchmal meine Mühe.

              Das ganze soll eigentlich einfach meine 8 Akku mit jeweils 16 Zellen auslesen und die Spannung und Ladung in die Datenpunkte füllen. Ob das nun im eigenen Node-Red Container oder im iobroker Container läuft ist mir eigentlich egal. Und ja ich weiss es gibt bereits ein Adapter aber der funktioniert scheinbar bei Pytes nicht mehr oder nicht.

              OliverIOO Offline
              OliverIOO Offline
              OliverIO
              schrieb am zuletzt editiert von
              #13

              @andibr sagte:

              Habe das ganze mal in Notepad hineinkopiert

              das ist gefährlich. du weißt nicht was der anzeigeeditor oder notepad da uU automatisch macht.

              @andibr sagte:

              Auch habe ich das ganze mal als csv gespeichert und auch Excell erkennt nicht autmatisch Spalten

              ja, aber excel kann feste breite schon, muss man aber einstellen, automatisch geht da nichts

              de8dd97a-1ffc-4207-9697-c993ad612465-image.jpeg

              aber du willst ja nicht excel, sondern node red

              stell doch mal den exakten output aus deinem rs232 in einer textdatei zur verfügung.
              also nichts editieren.
              dann mach ich dir eine funktionsnode die das ordentlich verarbeitet

              Meine Adapter und Widgets
              TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
              Links im Profil

              1 Antwort Letzte Antwort
              0
              • A andibr

                @OliverIO
                Bin zwar nicht mehr vor dem PC, aber es sind echt Leerzeichen. Habe das ganze mal in Notepad hineinkopiert und die quasi Spalten angeschaut es sind einmal 9 und dann wieder 13 und wieder 9.
                Auch habe ich das ganze mal als csv gespeichert und auch Excell erkennt nicht autmatisch Spalten. Was ich bereits erreicht habe ist, dass ich die Leerzeichen durch ein Semikolon ersetzen konnte. Was ich nun aber nicht schaffe sind die ersten beiden Zeilen wegzulassen und die entsprechenden Werte rauszupicken. Ich bin da mit Node-Red noch Anfänger und habe auch sonst mit Software manchmal meine Mühe.

                Das ganze soll eigentlich einfach meine 8 Akku mit jeweils 16 Zellen auslesen und die Spannung und Ladung in die Datenpunkte füllen. Ob das nun im eigenen Node-Red Container oder im iobroker Container läuft ist mir eigentlich egal. Und ja ich weiss es gibt bereits ein Adapter aber der funktioniert scheinbar bei Pytes nicht mehr oder nicht.

                OliverIOO Offline
                OliverIOO Offline
                OliverIO
                schrieb am zuletzt editiert von OliverIO
                #14

                @andibr

                habe mir mal aus deinem screenhot oben die daten extrahiert. aber wie gesagt das ist nur annahme und folgenden testflow gemacht

                [
                   {
                       "id": "593468e.75a0498",
                       "type": "tab",
                       "label": "Flow 1",
                       "disabled": false,
                       "info": ""
                   },
                   {
                       "id": "6602913b9103c8e9",
                       "type": "function",
                       "z": "593468e.75a0498",
                       "name": "bereitstellung text",
                       "func": "msg.payload = `@\nBattery  Volt     Tempr     Base State   Volt. State  Curr. State  Temp. State  Coulomb\n0        3467     29000     Idle         Normal       Normal       Normal       97%       95988 mAH\n1        3474     29000     Idle         Normal       Normal       Normal       97%       96070 mAH\n2        3463     29000     Idle         Normal       Normal       Normal       96%       95549 mAH\n3        3473     29000     Idle         Normal       Normal       Normal       97%       96070 mAH\n4        3468     29000     Idle         Normal       Normal       Normal       97%       95906 mAH\n5        3465     28000     Idle         Normal       Normal       Normal       96%       95329 mAH\n6        3459     28000     Idle         Normal       Normal       Normal       96%       95220 mAH\n7        3471     28000     Idle         Normal       Normal       Normal       97%       95906 mAH\n`;\n\nreturn msg;",
                       "outputs": 1,
                       "timeout": 0,
                       "noerr": 0,
                       "initialize": "",
                       "finalize": "",
                       "libs": [],
                       "x": 130,
                       "y": 120,
                       "wires": [
                           [
                               "2df68931298f6d99"
                           ]
                       ]
                   },
                   {
                       "id": "2df68931298f6d99",
                       "type": "function",
                       "z": "593468e.75a0498",
                       "name": "convert to msgs",
                       "func": "const text = msg.payload;\n\nif (typeof text !== \"string\") {\n    node.error(\"msg.payload ist kein String\", msg);\n    return null;\n}\n\n// In einzelne Zeilen zerlegen\nconst lines = text\n    .split(/\\r?\\n/)\n    .map(line => line.trim())\n    .filter(line => line !== \"\");\n\n// Nur Zeilen berücksichtigen, die mit einer Batterienummer beginnen\nconst dataLines = lines.filter(line => /^\\d+\\s/.test(line));\n\nconst messages = [];\n\nfor (const line of dataLines) {\n\n    // Spalten sind durch mindestens 2 Leerzeichen getrennt\n    const columns = line.split(/\\s{2,}/);\n\n    if (columns.length < 9) {\n        node.warn(\"Zeile konnte nicht verarbeitet werden: \" + line);\n        continue;\n    }\n\n    const battery = {\n        battery: Number(columns[0]),\n        volt: Number(columns[1]),\n        tempr: Number(columns[2]),\n        baseState: columns[3],\n        voltState: columns[4],\n        currState: columns[5],\n        tempState: columns[6],\n        coulomb: Number(columns[7].replace(\"%\", \"\")),\n        capacity: Number(columns[8].replace(/[^\\d]/g, \"\"))\n    };\n\n    messages.push({\n        ...msg,\n        payload: battery\n    });\n}\n\n// Alle Nachrichten nacheinander über denselben Ausgang senden\nreturn [messages];",
                       "outputs": 1,
                       "timeout": 0,
                       "noerr": 0,
                       "initialize": "",
                       "finalize": "",
                       "libs": [],
                       "x": 320,
                       "y": 120,
                       "wires": [
                           [
                               "dd25a6c986c48c9a"
                           ]
                       ]
                   },
                   {
                       "id": "c972ab9ba4b7bebd",
                       "type": "debug",
                       "z": "593468e.75a0498",
                       "name": "debug 1",
                       "active": true,
                       "tosidebar": true,
                       "console": false,
                       "tostatus": false,
                       "complete": "true",
                       "targetType": "full",
                       "statusVal": "",
                       "statusType": "auto",
                       "x": 400,
                       "y": 200,
                       "wires": []
                   },
                   {
                       "id": "a349e5287a176ccf",
                       "type": "inject",
                       "z": "593468e.75a0498",
                       "name": "Start button",
                       "props": [
                           {
                               "p": "payload"
                           },
                           {
                               "p": "topic",
                               "vt": "str"
                           }
                       ],
                       "repeat": "",
                       "crontab": "",
                       "once": false,
                       "onceDelay": 0.1,
                       "topic": "",
                       "payload": "",
                       "payloadType": "date",
                       "x": 110,
                       "y": 60,
                       "wires": [
                           [
                               "6602913b9103c8e9"
                           ]
                       ]
                   },
                   {
                       "id": "941c0f521bd7fa84",
                       "type": "ioBroker out",
                       "z": "593468e.75a0498",
                       "name": "",
                       "topic": "",
                       "ack": "true",
                       "autoCreate": "true",
                       "stateName": "",
                       "role": "",
                       "payloadType": "",
                       "readonly": "",
                       "stateUnit": "",
                       "stateMin": "",
                       "stateMax": "",
                       "x": 420,
                       "y": 240,
                       "wires": []
                   },
                   {
                       "id": "dd25a6c986c48c9a",
                       "type": "function",
                       "z": "593468e.75a0498",
                       "name": "function 1",
                       "func": "const battery = msg.payload;\n\nif (!battery || battery.battery === undefined) {\n    node.error(\"Ungültiges Battery-Objekt\", msg);\n    return null;\n}\n\nconst batteryId = battery.battery;\n\nconst states = [\n    {\n        id: \"voltage\",\n        value: battery.volt,\n        name: \"Voltage\",\n        role: \"value.voltage\",\n        type: \"number\",\n        readonly: true,\n        unit: \"mV\",\n        min: 0\n    },\n    {\n        id: \"temperature\",\n        value: battery.tempr / 1000,\n        name: \"Temperature\",\n        role: \"value.temperature\",\n        type: \"number\",\n        readonly: true,\n        unit: \"°C\"\n    },\n    {\n        id: \"baseState\",\n        value: battery.baseState,\n        name: \"Base State\",\n        role: \"text\",\n        type: \"string\",\n        readonly: true\n    },\n    {\n        id: \"voltageState\",\n        value: battery.voltState,\n        name: \"Voltage State\",\n        role: \"text\",\n        type: \"string\",\n        readonly: true\n    },\n    {\n        id: \"currentState\",\n        value: battery.currState,\n        name: \"Current State\",\n        role: \"text\",\n        type: \"string\",\n        readonly: true\n    },\n    {\n        id: \"temperatureState\",\n        value: battery.tempState,\n        name: \"Temperature State\",\n        role: \"text\",\n        type: \"string\",\n        readonly: true\n    },\n    {\n        id: \"charge\",\n        value: battery.coulomb,\n        name: \"Charge\",\n        role: \"value.battery\",\n        type: \"number\",\n        readonly: true,\n        unit: \"%\",\n        min: 0,\n        max: 100\n    },\n    {\n        id: \"capacity\",\n        value: battery.capacity,\n        name: \"Capacity\",\n        role: \"value\",\n        type: \"number\",\n        readonly: true,\n        unit: \"mAh\",\n        min: 0\n    }\n];\n\nconst messages = [];\n\nfor (const state of states) {\n    const out = {\n        topic: `0_userdata.0.noderedbattery.${batteryId}.${state.id}`,\n        payload: state.value,\n\n        stateName: state.name,\n        stateRole: state.role,\n        stateType: state.type,\n        stateReadonly: state.readonly\n    };\n\n    if (state.unit !== undefined) {\n        out.stateUnit = state.unit;\n    }\n\n    if (state.min !== undefined) {\n        out.stateMin = state.min;\n    }\n\n    if (state.max !== undefined) {\n        out.stateMax = state.max;\n    }\n\n    messages.push(out);\n}\n\nreturn [messages];",
                       "outputs": 1,
                       "timeout": 0,
                       "noerr": 0,
                       "initialize": "",
                       "finalize": "",
                       "libs": [],
                       "x": 160,
                       "y": 200,
                       "wires": [
                           [
                               "941c0f521bd7fa84",
                               "c972ab9ba4b7bebd"
                           ]
                       ]
                   }
                ]
                

                cb1bd8c0-3762-40d6-a8d1-b723eab43c91-image.jpeg

                1.das erste ist ein inject node zum manuellen starten des flows, den brauchst du nicht. bei dir wird aus der rs232 getriggert
                2.diese node stellt den test text bereit, bei dir wäre das dann die rs232 node
                3.hier wird nun aus dem ankommenden text die daten aufbereitet

                • verarbeitet wird nur wenn text kommt
                • text muss mindestens 9 zeichen lang sein
                • text wird dann in einzelne zeilen aufgeteilt evtl leerzeilen werden ausgefiltert
                • jede zeile wird mit regex in spalten aufgeteilt, dabei fliegen die leezeichen raus
                • jeder match wird dann in ein battery objekt in das entsprechende feld gelegt
                • aus jedem zeilen objekt wird dann ein eigenes messag objekt erzeugt
                • wenn alle zeilen verarbeitet sind, werden alle messages an node red zum weiterverarbeiten zurückgegeben
                1. debug node: die gibt dann für jede einzelne message (also jede zeile) eine nachricht im debug fenster (käfer symbol) aus. vgl screenshot

                danach darfst du damit machen was du willst :)
                also bspw ein battery objekt nehmen, aus den daten den datenpunkt ableiten (also das ist eine eigene node, bei dem du den datenpunktnamen und den zu schreibenden inhalt ermittelst) und dann mit der iobroker out node an iobroker senden

                Nachtrag:
                da ich gerade in spiellaune war habe ich dir deinen flow noch zu ende gemacht
                in der zusätzlichen node function 1 (habe sie jetzt nicht benannt)
                wird das battery objekt jetzt so aufbereitet, das es durch iobroker out direkt geschrieben wird
                Ich habe bei mir mal als hauptobjekt
                0_userdata.0.noderedbattery
                genommen.

                in den node red instanz einstellungen musst du dann noch die folgende option aktivieren
                55095627-51ff-4a83-83fb-bf59c2ab5aa8-image.jpeg

                das sieht dann so aus
                f3f93369-7869-4e4d-aaea-64ef8a7061cb-image.jpeg

                versuche aber jede einzelne node zu verstehen was die macht, sonst kannst du die nicht anpassen.

                Meine Adapter und Widgets
                TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                Links im Profil

                1 Antwort Letzte Antwort
                0
                • A Offline
                  A Offline
                  andibr
                  schrieb am zuletzt editiert von
                  #15

                  Vielen Dank, bin gerade unterwegs, werde das aber morgen mal testen. Der Inhalt des Debug sieht schon sehr vielversprechend aus. Damit lässt sich glaub dann relativ einfach ein Datenpunkt für den Iobroker erstellen. Ich meinte ich habe solche Filter auch schon gebaut beim auslesen der Victron Forcast aus dem VRM.
                  Ich werde auf alle Fälle mal den ganzen String nochmals "nackt" hier einstellen.
                  Mit den Terminal Tools lassen sich den BMS noch ganz viele Dinge entlocken, habe unteranderem festgestellt, dass meine 8 Pytes mehrere verschiedene BMS Versionen und auch entsprechend verschiedene Firmeware haben. Sogar solche die ich zusammen gekauft habe.

                  OliverIOO HomoranH 2 Antworten Letzte Antwort
                  0
                  • A andibr

                    Vielen Dank, bin gerade unterwegs, werde das aber morgen mal testen. Der Inhalt des Debug sieht schon sehr vielversprechend aus. Damit lässt sich glaub dann relativ einfach ein Datenpunkt für den Iobroker erstellen. Ich meinte ich habe solche Filter auch schon gebaut beim auslesen der Victron Forcast aus dem VRM.
                    Ich werde auf alle Fälle mal den ganzen String nochmals "nackt" hier einstellen.
                    Mit den Terminal Tools lassen sich den BMS noch ganz viele Dinge entlocken, habe unteranderem festgestellt, dass meine 8 Pytes mehrere verschiedene BMS Versionen und auch entsprechend verschiedene Firmeware haben. Sogar solche die ich zusammen gekauft habe.

                    OliverIOO Offline
                    OliverIOO Offline
                    OliverIO
                    schrieb am zuletzt editiert von OliverIO
                    #16

                    @andibr sagte:

                    relativ einfach ein Datenpunkt für den Iobroker

                    ist schon fertig. macht es bei mir schon so und ist im obigen flow enthalten.
                    habe aber gerade festgestellt, das das mit in neuen flow importieren nicht richtig klappt.
                    flow oben heißt
                    flow 1
                    wenn du den schon hast, dann vorher umbenennen

                    Meine Adapter und Widgets
                    TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                    Links im Profil

                    1 Antwort Letzte Antwort
                    0
                    • A Offline
                      A Offline
                      andibr
                      schrieb am zuletzt editiert von
                      #17

                      Nee, bin unterwegs, vor morgen komme ich kaum mehr beim PC vorbei. Danke

                      1 Antwort Letzte Antwort
                      0
                      • A andibr

                        Vielen Dank, bin gerade unterwegs, werde das aber morgen mal testen. Der Inhalt des Debug sieht schon sehr vielversprechend aus. Damit lässt sich glaub dann relativ einfach ein Datenpunkt für den Iobroker erstellen. Ich meinte ich habe solche Filter auch schon gebaut beim auslesen der Victron Forcast aus dem VRM.
                        Ich werde auf alle Fälle mal den ganzen String nochmals "nackt" hier einstellen.
                        Mit den Terminal Tools lassen sich den BMS noch ganz viele Dinge entlocken, habe unteranderem festgestellt, dass meine 8 Pytes mehrere verschiedene BMS Versionen und auch entsprechend verschiedene Firmeware haben. Sogar solche die ich zusammen gekauft habe.

                        HomoranH Offline
                        HomoranH Offline
                        Homoran
                        schrieb am zuletzt editiert von
                        #18

                        @andibr sagte:

                        beim auslesen der Victron Forcast aus dem VRM.

                        Wieder [OT]
                        Hängt die pytes bereits per CAN am BMS-CAN vom Cerbo?
                        Und zusätzlich gehst du an den rj45 für RS232?
                        Geht das problemlos?
                        Hab mich das nämlich noch nicht getraut.

                        kein Support per PN! - Fragen im Forum stellen - Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                        Das Forum freut sich über eine Spende. Benutzt dazu den Spendenbutton oben rechts. Danke!
                        der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                        A 1 Antwort Letzte Antwort
                        0
                        • HomoranH Homoran

                          @andibr sagte:

                          beim auslesen der Victron Forcast aus dem VRM.

                          Wieder [OT]
                          Hängt die pytes bereits per CAN am BMS-CAN vom Cerbo?
                          Und zusätzlich gehst du an den rj45 für RS232?
                          Geht das problemlos?
                          Hab mich das nämlich noch nicht getraut.

                          A Offline
                          A Offline
                          andibr
                          schrieb am zuletzt editiert von andibr
                          #19

                          @Homoran
                          Absolut richtig erkannt. Mein Cerbo GX kommuniziert weiterhin über den BMS-CAN direckt mit dem Master BMS und holt sich die Daten die es braucht.

                          Mein Ansatz ist eben, dass Victron und Pytes zusammen die Sache machen sollen und ich eigentlich nur ein Visualisierung der Zellen haben will. Weil die Erfahrung der letzten 1 1/2 Jahren hat mir gezeigt, dass die beiden das sehr gut machen und ich da keinerlei Eingriffe machen muss.
                          Wenn ich letzten Sonntag nicht etwas vorlaut gewesen wäre in einer Diskussion um die angebliche "Bombe und Brandbeschleuniger" in meinem Keller, würden wir hier kaum diskutieren.
                          Ein absoluter Verbrennerfan wollte mir erklären das alles zu gefährlich ist und sich nie rechnen würde. Da habe ich eben behauptet das mein Akku besser überwacht wird als sein Benzintank. Nun muss ich halt Beweise liefern.

                          Ich werde das ganze nochmals zusammenfassen und in einen kompletten Eintrag schreiben, dass auch jemand ohne alles zu lesen etwas versteht.

                          OliverIOO HomoranH 2 Antworten Letzte Antwort
                          0
                          • A andibr

                            @Homoran
                            Absolut richtig erkannt. Mein Cerbo GX kommuniziert weiterhin über den BMS-CAN direckt mit dem Master BMS und holt sich die Daten die es braucht.

                            Mein Ansatz ist eben, dass Victron und Pytes zusammen die Sache machen sollen und ich eigentlich nur ein Visualisierung der Zellen haben will. Weil die Erfahrung der letzten 1 1/2 Jahren hat mir gezeigt, dass die beiden das sehr gut machen und ich da keinerlei Eingriffe machen muss.
                            Wenn ich letzten Sonntag nicht etwas vorlaut gewesen wäre in einer Diskussion um die angebliche "Bombe und Brandbeschleuniger" in meinem Keller, würden wir hier kaum diskutieren.
                            Ein absoluter Verbrennerfan wollte mir erklären das alles zu gefährlich ist und sich nie rechnen würde. Da habe ich eben behauptet das mein Akku besser überwacht wird als sein Benzintank. Nun muss ich halt Beweise liefern.

                            Ich werde das ganze nochmals zusammenfassen und in einen kompletten Eintrag schreiben, dass auch jemand ohne alles zu lesen etwas versteht.

                            OliverIOO Offline
                            OliverIOO Offline
                            OliverIO
                            schrieb am zuletzt editiert von OliverIO
                            #20

                            @andibr

                            Ein absoluter Verbrennerfan wollte mir erklären das alles zu gefährlich ist und sich nie rechnen würde.

                            Wenn es die Kategorie von Menschen ist, was ich aktuell vor Auge hab, merk dir, wenn es dir zu viel wird:
                            Hör rechtzeitig auf mit diskutieren. Einige von dieser Kategorie wirst du nie überzeugen/zufriedenstellen stellen

                            Meine Adapter und Widgets
                            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                            Links im Profil

                            A 1 Antwort Letzte Antwort
                            1
                            • OliverIOO OliverIO

                              @andibr

                              Ein absoluter Verbrennerfan wollte mir erklären das alles zu gefährlich ist und sich nie rechnen würde.

                              Wenn es die Kategorie von Menschen ist, was ich aktuell vor Auge hab, merk dir, wenn es dir zu viel wird:
                              Hör rechtzeitig auf mit diskutieren. Einige von dieser Kategorie wirst du nie überzeugen/zufriedenstellen stellen

                              A Offline
                              A Offline
                              andibr
                              schrieb am zuletzt editiert von
                              #21

                              @OliverIO
                              Da wirst du absolut Recht habe, nur ist es etwas schwierig wenn das der Pate eines meiner Kinder ist. Da kann man nur versuchen nicht darüber zu sprechen. Aber wenn er damit beginnt ist es dann etwas heikel.

                              A 1 Antwort Letzte Antwort
                              0
                              • A andibr

                                @Homoran
                                Absolut richtig erkannt. Mein Cerbo GX kommuniziert weiterhin über den BMS-CAN direckt mit dem Master BMS und holt sich die Daten die es braucht.

                                Mein Ansatz ist eben, dass Victron und Pytes zusammen die Sache machen sollen und ich eigentlich nur ein Visualisierung der Zellen haben will. Weil die Erfahrung der letzten 1 1/2 Jahren hat mir gezeigt, dass die beiden das sehr gut machen und ich da keinerlei Eingriffe machen muss.
                                Wenn ich letzten Sonntag nicht etwas vorlaut gewesen wäre in einer Diskussion um die angebliche "Bombe und Brandbeschleuniger" in meinem Keller, würden wir hier kaum diskutieren.
                                Ein absoluter Verbrennerfan wollte mir erklären das alles zu gefährlich ist und sich nie rechnen würde. Da habe ich eben behauptet das mein Akku besser überwacht wird als sein Benzintank. Nun muss ich halt Beweise liefern.

                                Ich werde das ganze nochmals zusammenfassen und in einen kompletten Eintrag schreiben, dass auch jemand ohne alles zu lesen etwas versteht.

                                HomoranH Offline
                                HomoranH Offline
                                Homoran
                                schrieb am zuletzt editiert von
                                #22

                                @andibr sagte:

                                die angebliche "Bombe und Brandbeschleuniger" in meinem Keller

                                Dann kennt der den Unterschied zwischen Li-Ion und LFP nicht.
                                Der soll sich mal die videos ansehen, in denen die Chinesen auf die LFP Zellen mit Pistolen schießen...ohne Konsequenzen!

                                @andibr sagte:

                                und ich eigentlich nur ein Visualisierung der Zellen haben will.

                                Genau darum geht's mir auch.

                                Ich hab schon reichlich Informationen
                                2389.jpg

                                Wüsste aber auch gerne mehr über die Einzelzellen.

                                Danke!

                                kein Support per PN! - Fragen im Forum stellen - Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                                Das Forum freut sich über eine Spende. Benutzt dazu den Spendenbutton oben rechts. Danke!
                                der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                                A 1 Antwort Letzte Antwort
                                0
                                • A andibr

                                  @OliverIO
                                  Da wirst du absolut Recht habe, nur ist es etwas schwierig wenn das der Pate eines meiner Kinder ist. Da kann man nur versuchen nicht darüber zu sprechen. Aber wenn er damit beginnt ist es dann etwas heikel.

                                  A Offline
                                  A Offline
                                  andibr
                                  schrieb am zuletzt editiert von andibr
                                  #23

                                  Ich habe den Flow einfach mal rasch bei mir importiert und den aktuellen Output aus der Schnittstelle per copie-paste reingefügt, aber da kommt etwas Müll raus. Die Sortierung kommt irgendwie durcheinander.

                                  5658dee2-ab1c-4313-997a-8b9b340301d9-image.jpeg

                                  Wie bekomme ich einen HEX Output?

                                  Edit: habe da gerade noch was herausgefunden:
                                  Bildschirmfoto vom 2026-08-09 11-32-18.png

                                  Zum Glück gibt es noch brauchbare Terminal-Software: jede Zeile endet mit 0X00D 0X00D 0X00A (den letzten sieht man nicht). Die "Leerzeichen sind alle 0X020
                                  Das ganze habe ich jetzt mit folgendem Flow erzeugt: (ist eigentlich ganz einfach)
                                  Bildschirmfoto vom 2026-08-09 11-37-08.png
                                  Dann kann man beim Node "write file" angeben wohin

                                  Edit2:
                                  mit dieser Art kann man sich ein kompletes File mit allen Parameter von allen Zellen erstellen, denn Node-Red ist so schlau und öffnet das File und fügt den neuen Teil unten an und schliesst es wieder.

                                  Komando "help"

                                  @
                                  Local command:
                                  bat      Battery data show - bat [pwr][index]
                                  data     History data load - data [event/history][item]
                                  datalist Show recorded data - datalist {event/history}{item}}
                                  disp     Display Info at regular intervals - disp [(pwrs pwrNo)/val]/[(bats batNo)/volt/curr/temp]
                                  help     Help [cmd]
                                  info     Device infomation - info
                                  log      Log information show - log
                                  login    Login Admin mode - login [password]
                                  logout   user mode  - logout
                                  pwr      Power data show - pwr [index]
                                  shut     Shut down - shut
                                  soh      State of health - soh [addr]
                                  stat     Statistic data show - stat
                                  time     Time - time [year] [month] [day] [hour] [minute] [second]
                                  trst     Test Soft Reset - trst
                                  updata   updata system - updata
                                  ver      firmware info - ver
                                  **********************************************************
                                  Remote command:
                                  Press [Enter] to be continued,other key to exit
                                  
                                  OliverIOO 1 Antwort Letzte Antwort
                                  0
                                  • HomoranH Homoran

                                    @andibr sagte:

                                    die angebliche "Bombe und Brandbeschleuniger" in meinem Keller

                                    Dann kennt der den Unterschied zwischen Li-Ion und LFP nicht.
                                    Der soll sich mal die videos ansehen, in denen die Chinesen auf die LFP Zellen mit Pistolen schießen...ohne Konsequenzen!

                                    @andibr sagte:

                                    und ich eigentlich nur ein Visualisierung der Zellen haben will.

                                    Genau darum geht's mir auch.

                                    Ich hab schon reichlich Informationen
                                    2389.jpg

                                    Wüsste aber auch gerne mehr über die Einzelzellen.

                                    Danke!

                                    A Offline
                                    A Offline
                                    andibr
                                    schrieb am zuletzt editiert von
                                    #24

                                    @Homoran
                                    So wie ich das chemische Verständnis dieser Person einschätze kann er den Unterschied zwischen den verschiedenen Zell-Chemien gar nicht erkennen. Das beste, aber auch irgendwie übliche, Arrgument war dann die "Kinderarbeit" zur Kobalt gewinnung. Spätestens da habe ich begriffen das er nicht will. Möchte eigentlich nicht wissen wieviel "Sklavenarbeit" im Oel-Sektor drin steckt.

                                    Aber es bringt nichts mit solchen Leute über solche Dinge zu sprechen, irgenwiw kann man nur Müde lächeln und sich fragen wie soviel Unwissen und Desinteresse her kommt, aber trotzdem damit diskutieren wollen.

                                    Hast du diese Infos alle aus dem Cerbo, ich gehe davon aus per Modbus aus den Register? Da hole ich auch ein paar DInge raus, habe aber festgestellt, dass es via MQTT fast zuverläsiger kommt.
                                    Zudem gibt es mit der "MQTT-Bridge" die Möglichkeit, den ganzen Cerbo zu sich in einen eigenen Broker zu holen.

                                    HomoranH 1 Antwort Letzte Antwort
                                    1
                                    • A andibr

                                      Ich habe den Flow einfach mal rasch bei mir importiert und den aktuellen Output aus der Schnittstelle per copie-paste reingefügt, aber da kommt etwas Müll raus. Die Sortierung kommt irgendwie durcheinander.

                                      5658dee2-ab1c-4313-997a-8b9b340301d9-image.jpeg

                                      Wie bekomme ich einen HEX Output?

                                      Edit: habe da gerade noch was herausgefunden:
                                      Bildschirmfoto vom 2026-08-09 11-32-18.png

                                      Zum Glück gibt es noch brauchbare Terminal-Software: jede Zeile endet mit 0X00D 0X00D 0X00A (den letzten sieht man nicht). Die "Leerzeichen sind alle 0X020
                                      Das ganze habe ich jetzt mit folgendem Flow erzeugt: (ist eigentlich ganz einfach)
                                      Bildschirmfoto vom 2026-08-09 11-37-08.png
                                      Dann kann man beim Node "write file" angeben wohin

                                      Edit2:
                                      mit dieser Art kann man sich ein kompletes File mit allen Parameter von allen Zellen erstellen, denn Node-Red ist so schlau und öffnet das File und fügt den neuen Teil unten an und schliesst es wieder.

                                      Komando "help"

                                      @
                                      Local command:
                                      bat      Battery data show - bat [pwr][index]
                                      data     History data load - data [event/history][item]
                                      datalist Show recorded data - datalist {event/history}{item}}
                                      disp     Display Info at regular intervals - disp [(pwrs pwrNo)/val]/[(bats batNo)/volt/curr/temp]
                                      help     Help [cmd]
                                      info     Device infomation - info
                                      log      Log information show - log
                                      login    Login Admin mode - login [password]
                                      logout   user mode  - logout
                                      pwr      Power data show - pwr [index]
                                      shut     Shut down - shut
                                      soh      State of health - soh [addr]
                                      stat     Statistic data show - stat
                                      time     Time - time [year] [month] [day] [hour] [minute] [second]
                                      trst     Test Soft Reset - trst
                                      updata   updata system - updata
                                      ver      firmware info - ver
                                      **********************************************************
                                      Remote command:
                                      Press [Enter] to be continued,other key to exit
                                      
                                      OliverIOO Offline
                                      OliverIOO Offline
                                      OliverIO
                                      schrieb am zuletzt editiert von OliverIO
                                      #25

                                      @andibr

                                      hm eigentlich kein müll nur nicht die letzte version

                                      [
                                         {
                                             "id": "593468e.75a0498",
                                             "type": "tab",
                                             "label": "Flow 1",
                                             "disabled": false,
                                             "info": ""
                                         },
                                         {
                                             "id": "6602913b9103c8e9",
                                             "type": "function",
                                             "z": "593468e.75a0498",
                                             "name": "bereitstellung text",
                                             "func": "msg.payload = `@\nBattery  Volt     Tempr     Base State   Volt. State  Curr. State  Temp. State  Coulomb\n0        3467     29000     Idle         Normal       Normal       Normal       97%       95988 mAH\n1        3474     29000     Idle         Normal       Normal       Normal       97%       96070 mAH\n2        3463     29000     Idle         Normal       Normal       Normal       96%       95549 mAH\n3        3473     29000     Idle         Normal       Normal       Normal       97%       96070 mAH\n4        3468     29000     Idle         Normal       Normal       Normal       97%       95906 mAH\n5        3465     28000     Idle         Normal       Normal       Normal       96%       95329 mAH\n6        3459     28000     Idle         Normal       Normal       Normal       96%       95220 mAH\n7        3471     28000     Idle         Normal       Normal       Normal       97%       95906 mAH\n`;\n\nreturn msg;",
                                             "outputs": 1,
                                             "timeout": 0,
                                             "noerr": 0,
                                             "initialize": "",
                                             "finalize": "",
                                             "libs": [],
                                             "x": 130,
                                             "y": 120,
                                             "wires": [
                                                 [
                                                     "2df68931298f6d99"
                                                 ]
                                             ]
                                         },
                                         {
                                             "id": "2df68931298f6d99",
                                             "type": "function",
                                             "z": "593468e.75a0498",
                                             "name": "convert to msgs",
                                             "func": "const text = msg.payload;\n\nif (typeof text !== \"string\") {\n    node.error(\"msg.payload ist kein String\", msg);\n    return null;\n}\n\n// In einzelne Zeilen zerlegen\nconst lines = text\n    .split(/\\r?\\n/)\n    .map(line => line.trim())\n    .filter(line => line !== \"\");\n\n// Nur Zeilen berücksichtigen, die mit einer Batterienummer beginnen\nconst dataLines = lines.filter(line => /^\\d+\\s/.test(line));\n\nconst messages = [];\n\nfor (const line of dataLines) {\n\n    // Spalten sind durch mindestens 2 Leerzeichen getrennt\n    const columns = line.split(/\\s{2,}/);\n\n    if (columns.length < 9) {\n        node.warn(\"Zeile konnte nicht verarbeitet werden: \" + line);\n        continue;\n    }\n\n    const battery = {\n        battery: Number(columns[0]),\n        volt: Number(columns[1]),\n        tempr: Number(columns[2]),\n        baseState: columns[3],\n        voltState: columns[4],\n        currState: columns[5],\n        tempState: columns[6],\n        coulomb: Number(columns[7].replace(\"%\", \"\")),\n        capacity: Number(columns[8].replace(/[^\\d]/g, \"\"))\n    };\n\n    messages.push({\n        ...msg,\n        payload: battery\n    });\n}\n\n// Alle Nachrichten nacheinander über denselben Ausgang senden\nreturn [messages];",
                                             "outputs": 1,
                                             "timeout": 0,
                                             "noerr": 0,
                                             "initialize": "",
                                             "finalize": "",
                                             "libs": [],
                                             "x": 320,
                                             "y": 120,
                                             "wires": [
                                                 [
                                                     "dd25a6c986c48c9a"
                                                 ]
                                             ]
                                         },
                                         {
                                             "id": "c972ab9ba4b7bebd",
                                             "type": "debug",
                                             "z": "593468e.75a0498",
                                             "name": "debug 1",
                                             "active": true,
                                             "tosidebar": true,
                                             "console": false,
                                             "tostatus": false,
                                             "complete": "true",
                                             "targetType": "full",
                                             "statusVal": "",
                                             "statusType": "auto",
                                             "x": 400,
                                             "y": 200,
                                             "wires": []
                                         },
                                         {
                                             "id": "a349e5287a176ccf",
                                             "type": "inject",
                                             "z": "593468e.75a0498",
                                             "name": "Start button",
                                             "props": [
                                                 {
                                                     "p": "payload"
                                                 },
                                                 {
                                                     "p": "topic",
                                                     "vt": "str"
                                                 }
                                             ],
                                             "repeat": "",
                                             "crontab": "",
                                             "once": false,
                                             "onceDelay": 0.1,
                                             "topic": "",
                                             "payload": "",
                                             "payloadType": "date",
                                             "x": 110,
                                             "y": 60,
                                             "wires": [
                                                 [
                                                     "6602913b9103c8e9"
                                                 ]
                                             ]
                                         },
                                         {
                                             "id": "941c0f521bd7fa84",
                                             "type": "ioBroker out",
                                             "z": "593468e.75a0498",
                                             "name": "",
                                             "topic": "",
                                             "ack": "true",
                                             "autoCreate": "true",
                                             "stateName": "",
                                             "role": "",
                                             "payloadType": "",
                                             "readonly": "",
                                             "stateUnit": "",
                                             "stateMin": "",
                                             "stateMax": "",
                                             "x": 420,
                                             "y": 240,
                                             "wires": []
                                         },
                                         {
                                             "id": "dd25a6c986c48c9a",
                                             "type": "function",
                                             "z": "593468e.75a0498",
                                             "name": "function 1",
                                             "func": "const battery = msg.payload;\n\nif (!battery || battery.battery === undefined) {\n    node.error(\"Ungültiges Battery-Objekt\", msg);\n    return null;\n}\n\nconst batteryId = battery.battery;\n\nconst states = [\n    {\n        id: \"voltage\",\n        value: battery.volt,\n        name: \"Voltage\",\n        role: \"value.voltage\",\n        type: \"number\",\n        readonly: true,\n        unit: \"mV\",\n        min: 0\n    },\n    {\n        id: \"temperature\",\n        value: battery.tempr / 1000,\n        name: \"Temperature\",\n        role: \"value.temperature\",\n        type: \"number\",\n        readonly: true,\n        unit: \"°C\"\n    },\n    {\n        id: \"baseState\",\n        value: battery.baseState,\n        name: \"Base State\",\n        role: \"text\",\n        type: \"string\",\n        readonly: true\n    },\n    {\n        id: \"voltageState\",\n        value: battery.voltState,\n        name: \"Voltage State\",\n        role: \"text\",\n        type: \"string\",\n        readonly: true\n    },\n    {\n        id: \"currentState\",\n        value: battery.currState,\n        name: \"Current State\",\n        role: \"text\",\n        type: \"string\",\n        readonly: true\n    },\n    {\n        id: \"temperatureState\",\n        value: battery.tempState,\n        name: \"Temperature State\",\n        role: \"text\",\n        type: \"string\",\n        readonly: true\n    },\n    {\n        id: \"charge\",\n        value: battery.coulomb,\n        name: \"Charge\",\n        role: \"value.battery\",\n        type: \"number\",\n        readonly: true,\n        unit: \"%\",\n        min: 0,\n        max: 100\n    },\n    {\n        id: \"capacity\",\n        value: battery.capacity,\n        name: \"Capacity\",\n        role: \"value\",\n        type: \"number\",\n        readonly: true,\n        unit: \"mAh\",\n        min: 0\n    }\n];\n\nconst messages = [];\n\nfor (const state of states) {\n    const out = {\n        topic: `0_userdata.0.noderedbattery.${batteryId}.${state.id}`,\n        payload: state.value,\n\n        stateName: state.name,\n        stateRole: state.role,\n        stateType: state.type,\n        stateReadonly: state.readonly\n    };\n\n    if (state.unit !== undefined) {\n        out.stateUnit = state.unit;\n    }\n\n    if (state.min !== undefined) {\n        out.stateMin = state.min;\n    }\n\n    if (state.max !== undefined) {\n        out.stateMax = state.max;\n    }\n\n    messages.push(out);\n}\n\nreturn [messages];",
                                             "outputs": 1,
                                             "timeout": 0,
                                             "noerr": 0,
                                             "initialize": "",
                                             "finalize": "",
                                             "libs": [],
                                             "x": 160,
                                             "y": 200,
                                             "wires": [
                                                 [
                                                     "941c0f521bd7fa84",
                                                     "c972ab9ba4b7bebd"
                                                 ]
                                             ]
                                         }
                                      ]
                                      

                                      hier dann noch 2 extra nodes für den hexoutput

                                      [
                                         {
                                             "id": "dab2b49175d7bf2f",
                                             "type": "function",
                                             "z": "593468e.75a0498",
                                             "name": "to hex",
                                             "func": "let buf;\n\nif (Buffer.isBuffer(msg.payload)) {\n    buf = msg.payload;\n} else {\n    buf = Buffer.from(msg.payload, \"latin1\");\n}\n\nmsg.payload = Array.from(buf)\n    .map(b => b.toString(16).padStart(2, \"0\"))\n    .join(\" \");\n\nreturn msg;",
                                             "outputs": 1,
                                             "timeout": 0,
                                             "noerr": 0,
                                             "initialize": "",
                                             "finalize": "",
                                             "libs": [],
                                             "x": 150,
                                             "y": 340,
                                             "wires": [
                                                 [
                                                     "3f831e8c6ac1095e"
                                                 ]
                                             ]
                                         },
                                         {
                                             "id": "3f831e8c6ac1095e",
                                             "type": "debug",
                                             "z": "593468e.75a0498",
                                             "name": "debug 2",
                                             "active": true,
                                             "tosidebar": true,
                                             "console": false,
                                             "tostatus": false,
                                             "complete": "payload",
                                             "targetType": "msg",
                                             "statusVal": "",
                                             "statusType": "auto",
                                             "x": 300,
                                             "y": 340,
                                             "wires": []
                                         }
                                      ]
                                      

                                      die function node einfach mit dem ausgang der rs232 node verbinden.
                                      da ich nicht weiß was für ein datentyp aus rs232 rauskommt kann diese mit Buffer und mit string umgehen
                                      Ausgabe sieht dann so aus
                                      b5edaf7c-005b-4cfa-93e3-0000f122a749-image.jpeg
                                      das ist zwar gekürzt (...) aber das reicht zum analysieren

                                      bitte als markieren und als text hier reinstellen

                                      Meine Adapter und Widgets
                                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                                      Links im Profil

                                      A 1 Antwort Letzte Antwort
                                      0
                                      • A andibr

                                        @Homoran
                                        So wie ich das chemische Verständnis dieser Person einschätze kann er den Unterschied zwischen den verschiedenen Zell-Chemien gar nicht erkennen. Das beste, aber auch irgendwie übliche, Arrgument war dann die "Kinderarbeit" zur Kobalt gewinnung. Spätestens da habe ich begriffen das er nicht will. Möchte eigentlich nicht wissen wieviel "Sklavenarbeit" im Oel-Sektor drin steckt.

                                        Aber es bringt nichts mit solchen Leute über solche Dinge zu sprechen, irgenwiw kann man nur Müde lächeln und sich fragen wie soviel Unwissen und Desinteresse her kommt, aber trotzdem damit diskutieren wollen.

                                        Hast du diese Infos alle aus dem Cerbo, ich gehe davon aus per Modbus aus den Register? Da hole ich auch ein paar DInge raus, habe aber festgestellt, dass es via MQTT fast zuverläsiger kommt.
                                        Zudem gibt es mit der "MQTT-Bridge" die Möglichkeit, den ganzen Cerbo zu sich in einen eigenen Broker zu holen.

                                        HomoranH Offline
                                        HomoranH Offline
                                        Homoran
                                        schrieb am zuletzt editiert von Homoran
                                        #26

                                        @andibr sagte:

                                        diese Infos alle aus dem Cerbo, ich gehe davon aus per Modbus aus den Register

                                        Ich auch
                                        Restlaufzeit ist über ein Blockly gerechnet
                                        Bis minimal SoC bei Entladung, bis max SoC (96%bei 56V) bei Ladung

                                        Wirkungsgrad auch: Verhältnis eingespeicherte Energie zu ausgespeicherter Energie

                                        @andibr sagte:

                                        diese Infos alle aus dem Cerbo, ich gehe davon aus per Modbus aus den Register

                                        Ich im Prinzip auch

                                        Restlaufzeit ist über ein Blockly gerechnet
                                        Bis minimal SoC bei Entladung, bis max SoC (96%bei 56V) bei Ladung

                                        Und Zyklen ist ebenfalls einfach ein counter der bei erreichen einer vollen Kapazität hochzählt

                                        kein Support per PN! - Fragen im Forum stellen - Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.
                                        Das Forum freut sich über eine Spende. Benutzt dazu den Spendenbutton oben rechts. Danke!
                                        der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                                        1 Antwort Letzte Antwort
                                        0
                                        • OliverIOO OliverIO

                                          @andibr

                                          hm eigentlich kein müll nur nicht die letzte version

                                          [
                                             {
                                                 "id": "593468e.75a0498",
                                                 "type": "tab",
                                                 "label": "Flow 1",
                                                 "disabled": false,
                                                 "info": ""
                                             },
                                             {
                                                 "id": "6602913b9103c8e9",
                                                 "type": "function",
                                                 "z": "593468e.75a0498",
                                                 "name": "bereitstellung text",
                                                 "func": "msg.payload = `@\nBattery  Volt     Tempr     Base State   Volt. State  Curr. State  Temp. State  Coulomb\n0        3467     29000     Idle         Normal       Normal       Normal       97%       95988 mAH\n1        3474     29000     Idle         Normal       Normal       Normal       97%       96070 mAH\n2        3463     29000     Idle         Normal       Normal       Normal       96%       95549 mAH\n3        3473     29000     Idle         Normal       Normal       Normal       97%       96070 mAH\n4        3468     29000     Idle         Normal       Normal       Normal       97%       95906 mAH\n5        3465     28000     Idle         Normal       Normal       Normal       96%       95329 mAH\n6        3459     28000     Idle         Normal       Normal       Normal       96%       95220 mAH\n7        3471     28000     Idle         Normal       Normal       Normal       97%       95906 mAH\n`;\n\nreturn msg;",
                                                 "outputs": 1,
                                                 "timeout": 0,
                                                 "noerr": 0,
                                                 "initialize": "",
                                                 "finalize": "",
                                                 "libs": [],
                                                 "x": 130,
                                                 "y": 120,
                                                 "wires": [
                                                     [
                                                         "2df68931298f6d99"
                                                     ]
                                                 ]
                                             },
                                             {
                                                 "id": "2df68931298f6d99",
                                                 "type": "function",
                                                 "z": "593468e.75a0498",
                                                 "name": "convert to msgs",
                                                 "func": "const text = msg.payload;\n\nif (typeof text !== \"string\") {\n    node.error(\"msg.payload ist kein String\", msg);\n    return null;\n}\n\n// In einzelne Zeilen zerlegen\nconst lines = text\n    .split(/\\r?\\n/)\n    .map(line => line.trim())\n    .filter(line => line !== \"\");\n\n// Nur Zeilen berücksichtigen, die mit einer Batterienummer beginnen\nconst dataLines = lines.filter(line => /^\\d+\\s/.test(line));\n\nconst messages = [];\n\nfor (const line of dataLines) {\n\n    // Spalten sind durch mindestens 2 Leerzeichen getrennt\n    const columns = line.split(/\\s{2,}/);\n\n    if (columns.length < 9) {\n        node.warn(\"Zeile konnte nicht verarbeitet werden: \" + line);\n        continue;\n    }\n\n    const battery = {\n        battery: Number(columns[0]),\n        volt: Number(columns[1]),\n        tempr: Number(columns[2]),\n        baseState: columns[3],\n        voltState: columns[4],\n        currState: columns[5],\n        tempState: columns[6],\n        coulomb: Number(columns[7].replace(\"%\", \"\")),\n        capacity: Number(columns[8].replace(/[^\\d]/g, \"\"))\n    };\n\n    messages.push({\n        ...msg,\n        payload: battery\n    });\n}\n\n// Alle Nachrichten nacheinander über denselben Ausgang senden\nreturn [messages];",
                                                 "outputs": 1,
                                                 "timeout": 0,
                                                 "noerr": 0,
                                                 "initialize": "",
                                                 "finalize": "",
                                                 "libs": [],
                                                 "x": 320,
                                                 "y": 120,
                                                 "wires": [
                                                     [
                                                         "dd25a6c986c48c9a"
                                                     ]
                                                 ]
                                             },
                                             {
                                                 "id": "c972ab9ba4b7bebd",
                                                 "type": "debug",
                                                 "z": "593468e.75a0498",
                                                 "name": "debug 1",
                                                 "active": true,
                                                 "tosidebar": true,
                                                 "console": false,
                                                 "tostatus": false,
                                                 "complete": "true",
                                                 "targetType": "full",
                                                 "statusVal": "",
                                                 "statusType": "auto",
                                                 "x": 400,
                                                 "y": 200,
                                                 "wires": []
                                             },
                                             {
                                                 "id": "a349e5287a176ccf",
                                                 "type": "inject",
                                                 "z": "593468e.75a0498",
                                                 "name": "Start button",
                                                 "props": [
                                                     {
                                                         "p": "payload"
                                                     },
                                                     {
                                                         "p": "topic",
                                                         "vt": "str"
                                                     }
                                                 ],
                                                 "repeat": "",
                                                 "crontab": "",
                                                 "once": false,
                                                 "onceDelay": 0.1,
                                                 "topic": "",
                                                 "payload": "",
                                                 "payloadType": "date",
                                                 "x": 110,
                                                 "y": 60,
                                                 "wires": [
                                                     [
                                                         "6602913b9103c8e9"
                                                     ]
                                                 ]
                                             },
                                             {
                                                 "id": "941c0f521bd7fa84",
                                                 "type": "ioBroker out",
                                                 "z": "593468e.75a0498",
                                                 "name": "",
                                                 "topic": "",
                                                 "ack": "true",
                                                 "autoCreate": "true",
                                                 "stateName": "",
                                                 "role": "",
                                                 "payloadType": "",
                                                 "readonly": "",
                                                 "stateUnit": "",
                                                 "stateMin": "",
                                                 "stateMax": "",
                                                 "x": 420,
                                                 "y": 240,
                                                 "wires": []
                                             },
                                             {
                                                 "id": "dd25a6c986c48c9a",
                                                 "type": "function",
                                                 "z": "593468e.75a0498",
                                                 "name": "function 1",
                                                 "func": "const battery = msg.payload;\n\nif (!battery || battery.battery === undefined) {\n    node.error(\"Ungültiges Battery-Objekt\", msg);\n    return null;\n}\n\nconst batteryId = battery.battery;\n\nconst states = [\n    {\n        id: \"voltage\",\n        value: battery.volt,\n        name: \"Voltage\",\n        role: \"value.voltage\",\n        type: \"number\",\n        readonly: true,\n        unit: \"mV\",\n        min: 0\n    },\n    {\n        id: \"temperature\",\n        value: battery.tempr / 1000,\n        name: \"Temperature\",\n        role: \"value.temperature\",\n        type: \"number\",\n        readonly: true,\n        unit: \"°C\"\n    },\n    {\n        id: \"baseState\",\n        value: battery.baseState,\n        name: \"Base State\",\n        role: \"text\",\n        type: \"string\",\n        readonly: true\n    },\n    {\n        id: \"voltageState\",\n        value: battery.voltState,\n        name: \"Voltage State\",\n        role: \"text\",\n        type: \"string\",\n        readonly: true\n    },\n    {\n        id: \"currentState\",\n        value: battery.currState,\n        name: \"Current State\",\n        role: \"text\",\n        type: \"string\",\n        readonly: true\n    },\n    {\n        id: \"temperatureState\",\n        value: battery.tempState,\n        name: \"Temperature State\",\n        role: \"text\",\n        type: \"string\",\n        readonly: true\n    },\n    {\n        id: \"charge\",\n        value: battery.coulomb,\n        name: \"Charge\",\n        role: \"value.battery\",\n        type: \"number\",\n        readonly: true,\n        unit: \"%\",\n        min: 0,\n        max: 100\n    },\n    {\n        id: \"capacity\",\n        value: battery.capacity,\n        name: \"Capacity\",\n        role: \"value\",\n        type: \"number\",\n        readonly: true,\n        unit: \"mAh\",\n        min: 0\n    }\n];\n\nconst messages = [];\n\nfor (const state of states) {\n    const out = {\n        topic: `0_userdata.0.noderedbattery.${batteryId}.${state.id}`,\n        payload: state.value,\n\n        stateName: state.name,\n        stateRole: state.role,\n        stateType: state.type,\n        stateReadonly: state.readonly\n    };\n\n    if (state.unit !== undefined) {\n        out.stateUnit = state.unit;\n    }\n\n    if (state.min !== undefined) {\n        out.stateMin = state.min;\n    }\n\n    if (state.max !== undefined) {\n        out.stateMax = state.max;\n    }\n\n    messages.push(out);\n}\n\nreturn [messages];",
                                                 "outputs": 1,
                                                 "timeout": 0,
                                                 "noerr": 0,
                                                 "initialize": "",
                                                 "finalize": "",
                                                 "libs": [],
                                                 "x": 160,
                                                 "y": 200,
                                                 "wires": [
                                                     [
                                                         "941c0f521bd7fa84",
                                                         "c972ab9ba4b7bebd"
                                                     ]
                                                 ]
                                             }
                                          ]
                                          

                                          hier dann noch 2 extra nodes für den hexoutput

                                          [
                                             {
                                                 "id": "dab2b49175d7bf2f",
                                                 "type": "function",
                                                 "z": "593468e.75a0498",
                                                 "name": "to hex",
                                                 "func": "let buf;\n\nif (Buffer.isBuffer(msg.payload)) {\n    buf = msg.payload;\n} else {\n    buf = Buffer.from(msg.payload, \"latin1\");\n}\n\nmsg.payload = Array.from(buf)\n    .map(b => b.toString(16).padStart(2, \"0\"))\n    .join(\" \");\n\nreturn msg;",
                                                 "outputs": 1,
                                                 "timeout": 0,
                                                 "noerr": 0,
                                                 "initialize": "",
                                                 "finalize": "",
                                                 "libs": [],
                                                 "x": 150,
                                                 "y": 340,
                                                 "wires": [
                                                     [
                                                         "3f831e8c6ac1095e"
                                                     ]
                                                 ]
                                             },
                                             {
                                                 "id": "3f831e8c6ac1095e",
                                                 "type": "debug",
                                                 "z": "593468e.75a0498",
                                                 "name": "debug 2",
                                                 "active": true,
                                                 "tosidebar": true,
                                                 "console": false,
                                                 "tostatus": false,
                                                 "complete": "payload",
                                                 "targetType": "msg",
                                                 "statusVal": "",
                                                 "statusType": "auto",
                                                 "x": 300,
                                                 "y": 340,
                                                 "wires": []
                                             }
                                          ]
                                          

                                          die function node einfach mit dem ausgang der rs232 node verbinden.
                                          da ich nicht weiß was für ein datentyp aus rs232 rauskommt kann diese mit Buffer und mit string umgehen
                                          Ausgabe sieht dann so aus
                                          b5edaf7c-005b-4cfa-93e3-0000f122a749-image.jpeg
                                          das ist zwar gekürzt (...) aber das reicht zum analysieren

                                          bitte als markieren und als text hier reinstellen

                                          A Offline
                                          A Offline
                                          andibr
                                          schrieb am zuletzt editiert von andibr
                                          #27

                                          @OliverIO sagte:

                                          40 0d 0d 0a 42 61 74 74 65 72 79 20 20 56 6f 6c 74 20 20 20 20 20 54 65 6d 70 72 20 20 20 20 42 61 73 65 20 53 74 61 74 65 20 20 20 56 6f 6c 74 2e 20 53 74 61 74 65 20 20 43 75 72 72 2e 20 53 74 61 74 65 20 20 54 65 6d 70 2e 20 53 74 61 74 65 20 20 43 6f 75 6c 6f 6d 62 20 20 20 20 20 0d 0d 0a 30 20 20 20 20 20 20 20 20 33 34 36 35 20 20 20 20 20 32 39 30 30 30 20 20 20 20 49 64 6c 65 20 20 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 20 20 20 20 20 20 20 20 39 36 25 20 20 20 20 20 20 39 35 32 35 38 20 6d 41 48 0d 0d 0a 31 20 20 20 20 20 20 20 20 33 34 36 39 20 20 20 20 20 32 39 30 30 30 20 20 20 20 49 64 6c 65 20 20 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 20 20 20 20 20 20 20 20 39 37 25 20 20 20 20 20 20 39 36 30 33 36 20 6d 41 48 0d 0d 0a 32 20 20 20 20 20 20 20 20 33 34 36 30 20 20 20 20 20 32 39 30 30 30 20 20 20 20 49 64 6c 65 20 20 2...
                                          

                                          Du meinst so?

                                          Edit:
                                          Also ich habe jetzt mal den Flow von dir einfach importiert und gestartet, das sieht im Iobroker sehr gut aus. Also müssen wir die Aufbereitung des payload aus dem RS232 Node noch irgendwie anderst machen. Ich frage mich gerade ob der aufbereitung auch gleich noch die Batterie-Nr. vom aufruf mit geben könnten? Denn es sind jetzt bei mir ja 8 Batterien an je 16 Zellen. Sprich in den Datenpunkten müsste ja dann auch irgendwo noch das "bat x" drin stehen. Ich weiss das gibt unendliche viele Datenpunkte, aber es sind da bei mir ja auch 128 einzelne Zellen. Einzelne Datenpunkte werden nie jemand interessieren, aber es wird einfacher sein, die einfach drin zu lassen?

                                          OliverIOO 1 Antwort Letzte Antwort
                                          0

                                          Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

                                          Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

                                          Mit deinem Input könnte dieser Beitrag noch besser werden 💗

                                          Registrieren Anmelden
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          264

                                          Online

                                          33.1k

                                          Benutzende

                                          83.7k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2026
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe