Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • 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. JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.6k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.1k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    2.8k

JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen

Geplant Angeheftet Gesperrt Verschoben Node-Red
node-red
114 Beiträge 13 Kommentatoren 26.5k Aufrufe 12 Watching
  • Ä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.
  • mickymM mickym

    @warp-it Ich denke da bist du in diesem Thread an der falschen Adresse. ;) - Der Subflow macht nichts anderes als ein Objekt zu zerlegen und in eigene Datenpunkte zu schreiben.

    In diesem Objekt sind die Werte ja schon enthalten:
    030f323a-bb6e-4772-a6e1-d770650d1dd2-image.png

    Und dieser Subflow macht nichts weiter als diese Daten auszusplitten. Wie Du auf die anderen Werte kommst, ist eine Modbus Geschichte.

    Aus 37107-37108 hätte ich im Ziel-Array einen dreistelligen negativen Wert erwartet, aber nicht zwei Werte über 65000?

    Sowas kann ich ja gar nicht nachvollziehen. Das würde ich in dem anderen Thread mit den Modbus Spezialisten diskutieren. Falls Du die Buffer Node nutzt, dann muss man halt mit den Daten schauen, was Du da rechnest.

    Dieser Flow - verändert grundsätzlich KEINE Originalwerte.

    W Offline
    W Offline
    warp-it
    schrieb am zuletzt editiert von
    #88

    @mickym said in JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen:

    Der Subflow macht nichts anderes als ein Objekt zu zerlegen und in eigene Datenpunkte zu schreiben.

    In der alten Variante, in der die Felder einzeln ausgelesen werden, scheint aber auch nix gerechnet zu werden:

    0221234a-01f5-4c72-96aa-ff3ecf3fe7e3-image.png

    c212528b-2ebb-417b-bad3-63ca72f41b9d-image.png

    Naja, von der alten Variante wollte ich ja ursprünglich weg, weil wohl durch das gehäufte wiederholte Auslesen der einzelnen Felder haufenweise Logeinträge entstanden sind, die aber durch das von @joschipp empfohlene Update von node-red-contrib-modbus tatsächlich verschwunden sind.

    mickymM 1 Antwort Letzte Antwort
    0
    • W warp-it

      @mickym said in JSON oder JavaScript Objekt in iobroker Datenpunkte zerlegen:

      Der Subflow macht nichts anderes als ein Objekt zu zerlegen und in eigene Datenpunkte zu schreiben.

      In der alten Variante, in der die Felder einzeln ausgelesen werden, scheint aber auch nix gerechnet zu werden:

      0221234a-01f5-4c72-96aa-ff3ecf3fe7e3-image.png

      c212528b-2ebb-417b-bad3-63ca72f41b9d-image.png

      Naja, von der alten Variante wollte ich ja ursprünglich weg, weil wohl durch das gehäufte wiederholte Auslesen der einzelnen Felder haufenweise Logeinträge entstanden sind, die aber durch das von @joschipp empfohlene Update von node-red-contrib-modbus tatsächlich verschwunden sind.

      mickymM Offline
      mickymM Offline
      mickym
      Most Active
      schrieb am zuletzt editiert von
      #89

      @warp-it Nun wie gesagt, wenn es der falsche 32bit Wert ist (be statt le) signed oder unsigned - kann ganz schnell eine komischen Wert erzeugen. Wie gesagt, dein Objekt enthielt ja bereits die 65xxx.

      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

      1 Antwort Letzte Antwort
      0
      • H Offline
        H Offline
        harald07
        schrieb am zuletzt editiert von harald07
        #90

        @mickym Hallo und vielen Dank für das teilen Deines Wissen.

        Ich habe dein Beispiel zum Einlesen einer Ordnerstruktur aus dem ioBroker nach gebaut.
        545e4e74-c3ff-4535-9872-ce45360751fc-image.png

        Als Resultat erhalte ich diese Ausgabe:

        {
            "Dc.Power": -207.4,
            "InstalledCapacity": 1400,
            "ConsumedAmphours": -116,
            "Capacity": 1284,
            "Soc": 92.2,
            "TimeToGo": 768059.9,
            "Balancing": 0,
            "Dc.Voltage": 53.18,
            "Dc.Current": -3.9,
            "Dc.Temperature": 25.4,
            "Info.MaxChargeVoltage": 55.3,
            "Info.MaxChargeCurrent": 340,
            "Info.MaxDischargeCurrent": 425,
            "History.ChargeCycles": 46,
            "History.MinimumVoltage": 34.43,
            "History.MaximumVoltage": 58.77,
            "History.TotalAhDrawn": -60168.2,
            "System.MinVoltageCellId": "P4_Z2",
            "System.MinCellVoltage": 3.322,
            "System.MaxVoltageCellId": "P4_Z1",
            "System.MaxCellVoltage": 3.324,
            "System.NrOfModulesOnline": 5,
            "System.NrOfModulesOffline": 0,
            "System.NrOfModulesBlockingCharge": 0,
            "System.NrOfModulesBlockingDischarge": 0,
            "Io.AllowToCharge": 1,
            "Io.AllowToDischarge": 1,
            "Io.AllowToBalance": 1
        }
        

        Das json möchte per MQTT an an einen Treiber in VenusOS senden. Der Treiber erwartet die Daten in diesem Format:

        {
            "Dc": {
                "Power": 321.6,                       
                "Voltage": 52.7,                      
                "Current": 6.10,                      
                "Temperature": 23                     
            },
            "InstalledCapacity": 200.0,               
            "ConsumedAmphours": 74.5,                 
            "Capacity": 125.5,                        
            "Soc": 63,                                
            "TimeToGo": 43967,                        
            "Balancing": 0,
            "Info": {              
                "MaxChargeVoltage": 55.2,             
                "MaxChargeCurrent": 80.0,             
                "MaxDischargeCurrent": 120.0          
            },
            "History": {
                "ChargeCycles": 5,                    
                "MinimumVoltage": 40.8,               
                "MaximumVoltage": 58.4,               
                "TotalAhDrawn": 1057.3                
            },
            "System": {
                "MinVoltageCellId": "C3",             
                "MinCellVoltage": 3.392,              
                "MaxVoltageCellId": "C15",            
                "MaxCellVoltage": 3.417,                            
        
                "NrOfModulesOnline": 0,               
                "NrOfModulesOffline": 0,              
        
                "NrOfModulesBlockingCharge": 0,       
                "NrOfModulesBlockingDischarge": 0     
            },
            "Io": {
                "AllowToCharge": 0,                   
                "AllowToDischarge": 0,                
                "AllowToBalance": 0,                 
            }
        }
        

        Kannst Du mir sagen wie ich das hinbekommen könnte?

        Viele Grüße
        Harald

        Es ist schon Wahnsinn was mittlerweile alles geht.
        Ich habe inzwischen die Lösung von ChatGPT bekommen. ChatGPT hat einen Code ausgespuckt den ich nur noch in eine function Node kopieren brauchte.

        var inputJson = JSON.parse(msg.payload);
        
        var outputJson = {
            "Dc": {
                "Power": inputJson["Dc.Power"],
                "Voltage": inputJson["Dc.Voltage"],
                "Current": inputJson["Dc.Current"],
                "Temperature": inputJson["Dc.Temperature"]
            },
            "InstalledCapacity": inputJson["InstalledCapacity"],
            "ConsumedAmphours": inputJson["ConsumedAmphours"],
            "Capacity": inputJson["Capacity"],
            "Soc": inputJson["Soc"],
            "TimeToGo": inputJson["TimeToGo"],
            "Balancing": inputJson["Balancing"],
            "Info": {
                "MaxChargeVoltage": inputJson["Info.MaxChargeVoltage"],
                "MaxChargeCurrent": inputJson["Info.MaxChargeCurrent"],
                "MaxDischargeCurrent": inputJson["Info.MaxDischargeCurrent"]
            },
            "History": {
                "ChargeCycles": inputJson["History.ChargeCycles"],
                "MinimumVoltage": inputJson["History.MinimumVoltage"],
                "MaximumVoltage": inputJson["History.MaximumVoltage"],
                "TotalAhDrawn": inputJson["History.TotalAhDrawn"]
            },
            "System": {
                "MinVoltageCellId": inputJson["System.MinVoltageCellId"],
                "MinCellVoltage": inputJson["System.MinCellVoltage"],
                "MaxVoltageCellId": inputJson["System.MaxVoltageCellId"],
                "MaxCellVoltage": inputJson["System.MaxCellVoltage"],
                "NrOfModulesOnline": inputJson["System.NrOfModulesOnline"],
                "NrOfModulesOffline": inputJson["System.NrOfModulesOffline"],
                "NrOfModulesBlockingCharge": inputJson["System.NrOfModulesBlockingCharge"],
                "NrOfModulesBlockingDischarge": inputJson["System.NrOfModulesBlockingDischarge"]
            },
            "Io": {
                "AllowToCharge": inputJson["Io.AllowToCharge"],
                "AllowToDischarge": inputJson["Io.AllowToDischarge"],
                "AllowToBalance": inputJson["Io.AllowToBalance"]
            }
        };
        
        msg.payload = outputJson;
        return msg;
        

        Wahnsinn!!!

        1 Antwort Letzte Antwort
        0
        • mickymM Offline
          mickymM Offline
          mickym
          Most Active
          schrieb am zuletzt editiert von mickym
          #91

          So ich habe wieder mal eine neue Version des Subflows erstellt, der verhindert dass Punkte in den Objekteigenschaften enthalten sind und somit ggf. den iobroker durcheinander bringt.

          Hier nun wieder eine neue Version:

          [
             {
                 "id": "6e802f1553b18149",
                 "type": "subflow",
                 "name": "JSON or Obj to IOBroker",
                 "info": "# Creates an IOBroker tree\n\nThis node creates an IOBroker tree out of an Java-Object or JSON String.\n\nThe object tree will be created under 0_userdata.0\nIn addition to the JSON-String or Java Object as `msg.payload` it is necessary to specify a `msg.top` properity in addition to the msg-Object.\n\nThe object tree will be created under 0_userdata.0\n\nExisting `msg.topic` entries will be deleted.\nAn iobroker-out node has to be appended to this subflow node. It is not part of the subflow itself. No topic should be specified in the iobroker out node.\n\nIs `msg.top` property isn't defined, the `top` property of the subflow-node is used. \n\nIn the properties of the subflow node a new property `keepTopic` has been added. Default is _false_ to keep the current behaviour. If set to _true_ then the originial topic will be placed between the `top` property of the subflow node and the property of the analyzed JSON object.\n\n**Attention:**\nIf msg.top and top is empty, all msg.topics (msg.topic) will be directly prefixed with 0_userdata.0. . \n\n**Update 13.09.2022:**\nSpaces in topics of objects are no longer replaced with underscores in objects. No differences between all data types.\n\n# Erstellt einen Objektbaum im ioBroker\n\nDiese Node erstellt einen Objektbaum im ioBroker aus einem JAVA Objekt bzw. einem JSON String. \n\nDer Baum wird in jedem Fall unter 0_userdata.0 erstellt und zwar unter dem Topic der in` msg.top` mitgegeben wurde. In der `msg.payload` befindet sich dann der JSON String oder das entsprechende Objekt.\n\nExistierende `msg.topic `Einträge werden gelöscht.\nEin entsprechende iobroker-out Node muss an den Flow angehängt werden. Sie ist nicht Bestandteil des Subflows. In dieser iobroker-out Node darf kein Topic angegeben werden. \n\nFalls msg.top nicht definiert wurde, wird der `top`-Wert der Subflow-Node verwendet.\n\nIn den Eigenschaften der Subflow-Node wurde ein neuer Parameter `keepTopic` hinzugefügt. Standardwert ist _false_, um das bisherige Verhalten beizubehalten. Setzt man die Eigenschaft auf _true_, dann wird das originale Topic zwischen der `top` Eigenschaft der Subflow-Node und Eigenschaft des analysierten JSON Objektes eingefügt.\n\n**Achtung:**\nWenn top und msg.top leer ist, werden alle msg.topics (msg.topic) direkt unter dem Präfix 0_userdata.0., angelegt bzw. ausgegeben. \n\n**Update 13.09.2022:**\nLeerzeichen werden in Topics von Objekten nicht mehr durch Unterstriche ersetzt. Es gibt keine Unterschiede mehr zwischen den Datentypen.",
                 "category": "",
                 "in": [
                     {
                         "x": 60,
                         "y": 160,
                         "wires": [
                             {
                                 "id": "554b8c663bcb46c2"
                             }
                         ]
                     }
                 ],
                 "out": [
                     {
                         "x": 2620,
                         "y": 280,
                         "wires": [
                             {
                                 "id": "0962842ebd23e0d7",
                                 "port": 0
                             }
                         ]
                     }
                 ],
                 "env": [
                     {
                         "name": "top",
                         "type": "str",
                         "value": "objRoot"
                     },
                     {
                         "name": "keepTopic",
                         "type": "bool",
                         "value": "false"
                     }
                 ],
                 "meta": {},
                 "color": "#E2D96E",
                 "icon": "node-red/batch.svg"
             },
             {
                 "id": "3e11e8338f694832",
                 "type": "split",
                 "z": "6e802f1553b18149",
                 "name": "split object",
                 "splt": "\\n",
                 "spltType": "str",
                 "arraySplt": 1,
                 "arraySpltType": "len",
                 "stream": false,
                 "addname": "key",
                 "x": 1370,
                 "y": 160,
                 "wires": [
                     [
                         "0562a4249c8b856b"
                     ]
                 ]
             },
             {
                 "id": "0562a4249c8b856b",
                 "type": "change",
                 "z": "6e802f1553b18149",
                 "name": "add key to topic",
                 "rules": [
                     {
                         "t": "set",
                         "p": "stateName",
                         "pt": "msg",
                         "to": "key",
                         "tot": "msg"
                     },
                     {
                         "t": "change",
                         "p": "key",
                         "pt": "msg",
                         "from": ".",
                         "fromt": "str",
                         "to": "_",
                         "tot": "str"
                     },
                     {
                         "t": "set",
                         "p": "topic",
                         "pt": "msg",
                         "to": "topic  & '.' & key",
                         "tot": "jsonata"
                     }
                 ],
                 "action": "",
                 "property": "",
                 "from": "",
                 "to": "",
                 "reg": false,
                 "x": 1560,
                 "y": 160,
                 "wires": [
                     [
                         "ddc90985bef0fafa"
                     ]
                 ]
             },
             {
                 "id": "ddc90985bef0fafa",
                 "type": "switch",
                 "z": "6e802f1553b18149",
                 "name": "is type?",
                 "property": "payload",
                 "propertyType": "msg",
                 "rules": [
                     {
                         "t": "istype",
                         "v": "array",
                         "vt": "array"
                     },
                     {
                         "t": "istype",
                         "v": "object",
                         "vt": "object"
                     },
                     {
                         "t": "else"
                     }
                 ],
                 "checkall": "true",
                 "repair": false,
                 "outputs": 3,
                 "x": 1740,
                 "y": 160,
                 "wires": [
                     [
                         "bfce19b206660fbe"
                     ],
                     [
                         "3e11e8338f694832"
                     ],
                     [
                         "1a8c03d866b85b12"
                     ]
                 ]
             },
             {
                 "id": "bfce19b206660fbe",
                 "type": "split",
                 "z": "6e802f1553b18149",
                 "name": "split array",
                 "splt": "\\n",
                 "spltType": "str",
                 "arraySplt": 1,
                 "arraySpltType": "len",
                 "stream": false,
                 "addname": "",
                 "x": 780,
                 "y": 280,
                 "wires": [
                     [
                         "e89927810c6d75ec"
                     ]
                 ]
             },
             {
                 "id": "e89927810c6d75ec",
                 "type": "change",
                 "z": "6e802f1553b18149",
                 "name": "add index to topic",
                 "rules": [
                     {
                         "t": "set",
                         "p": "topic",
                         "pt": "msg",
                         "to": "topic  & '.' & parts.index",
                         "tot": "jsonata"
                     }
                 ],
                 "action": "",
                 "property": "",
                 "from": "",
                 "to": "",
                 "reg": false,
                 "x": 970,
                 "y": 280,
                 "wires": [
                     [
                         "a4d1a5d04564dc77"
                     ]
                 ]
             },
             {
                 "id": "f5d52c6a57d08904",
                 "type": "change",
                 "z": "6e802f1553b18149",
                 "name": "finalize msg.topic",
                 "rules": [
                     {
                         "t": "set",
                         "p": "top",
                         "pt": "msg",
                         "to": "'0_userdata.0.' & top",
                         "tot": "jsonata"
                     },
                     {
                         "t": "set",
                         "p": "topic",
                         "pt": "msg",
                         "to": "top & '.' & topic",
                         "tot": "jsonata"
                     }
                 ],
                 "action": "",
                 "property": "",
                 "from": "",
                 "to": "",
                 "reg": false,
                 "x": 2170,
                 "y": 240,
                 "wires": [
                     [
                         "0962842ebd23e0d7"
                     ]
                 ]
             },
             {
                 "id": "1a8c03d866b85b12",
                 "type": "switch",
                 "z": "6e802f1553b18149",
                 "name": "is msg.top != null",
                 "property": "top",
                 "propertyType": "msg",
                 "rules": [
                     {
                         "t": "nnull"
                     },
                     {
                         "t": "null"
                     }
                 ],
                 "checkall": "true",
                 "repair": false,
                 "outputs": 2,
                 "x": 1950,
                 "y": 280,
                 "wires": [
                     [
                         "f5d52c6a57d08904"
                     ],
                     [
                         "74c895ce724750de"
                     ]
                 ]
             },
             {
                 "id": "e023fe88445ce43e",
                 "type": "change",
                 "z": "6e802f1553b18149",
                 "name": "",
                 "rules": [
                     {
                         "t": "delete",
                         "p": "topic",
                         "pt": "msg"
                     }
                 ],
                 "action": "",
                 "property": "",
                 "from": "",
                 "to": "",
                 "reg": false,
                 "x": 350,
                 "y": 200,
                 "wires": [
                     [
                         "3649300b4c233b10"
                     ]
                 ]
             },
             {
                 "id": "3649300b4c233b10",
                 "type": "switch",
                 "z": "6e802f1553b18149",
                 "name": "is type?",
                 "property": "payload",
                 "propertyType": "msg",
                 "rules": [
                     {
                         "t": "istype",
                         "v": "json",
                         "vt": "json"
                     },
                     {
                         "t": "istype",
                         "v": "array",
                         "vt": "array"
                     },
                     {
                         "t": "istype",
                         "v": "object",
                         "vt": "object"
                     },
                     {
                         "t": "else"
                     }
                 ],
                 "checkall": "true",
                 "repair": false,
                 "outputs": 4,
                 "x": 600,
                 "y": 160,
                 "wires": [
                     [
                         "fc7913a8524badb7"
                     ],
                     [
                         "bfce19b206660fbe"
                     ],
                     [
                         "3e11e8338f694832"
                     ],
                     [
                         "9ac3cc3681e8b6c6"
                     ]
                 ]
             },
             {
                 "id": "1b8480cd2df7ba3f",
                 "type": "comment",
                 "z": "6e802f1553b18149",
                 "name": "Array",
                 "info": "",
                 "x": 600,
                 "y": 280,
                 "wires": []
             },
             {
                 "id": "b3541807672be040",
                 "type": "comment",
                 "z": "6e802f1553b18149",
                 "name": "object",
                 "info": "",
                 "x": 1340,
                 "y": 100,
                 "wires": []
             },
             {
                 "id": "a4d1a5d04564dc77",
                 "type": "switch",
                 "z": "6e802f1553b18149",
                 "name": "is type?",
                 "property": "payload",
                 "propertyType": "msg",
                 "rules": [
                     {
                         "t": "istype",
                         "v": "object",
                         "vt": "object"
                     },
                     {
                         "t": "istype",
                         "v": "array",
                         "vt": "array"
                     },
                     {
                         "t": "else"
                     }
                 ],
                 "checkall": "true",
                 "repair": false,
                 "outputs": 3,
                 "x": 1160,
                 "y": 280,
                 "wires": [
                     [
                         "3e11e8338f694832"
                     ],
                     [
                         "bfce19b206660fbe"
                     ],
                     [
                         "a096a93bb82b7a93"
                     ]
                 ]
             },
             {
                 "id": "74c895ce724750de",
                 "type": "change",
                 "z": "6e802f1553b18149",
                 "name": "finalize msg.topic",
                 "rules": [
                     {
                         "t": "set",
                         "p": "top",
                         "pt": "msg",
                         "to": "top",
                         "tot": "env"
                     },
                     {
                         "t": "set",
                         "p": "top",
                         "pt": "msg",
                         "to": "'0_userdata.0.' & top",
                         "tot": "jsonata"
                     },
                     {
                         "t": "set",
                         "p": "topic",
                         "pt": "msg",
                         "to": "top & '.' & topic",
                         "tot": "jsonata"
                     }
                 ],
                 "action": "",
                 "property": "",
                 "from": "",
                 "to": "",
                 "reg": false,
                 "x": 2170,
                 "y": 320,
                 "wires": [
                     [
                         "0962842ebd23e0d7"
                     ]
                 ]
             },
             {
                 "id": "554b8c663bcb46c2",
                 "type": "switch",
                 "z": "6e802f1553b18149",
                 "name": "",
                 "property": "keepTopic",
                 "propertyType": "env",
                 "rules": [
                     {
                         "t": "true"
                     },
                     {
                         "t": "false"
                     }
                 ],
                 "checkall": "true",
                 "repair": false,
                 "outputs": 2,
                 "x": 170,
                 "y": 160,
                 "wires": [
                     [
                         "e30ba9f0483285e4"
                     ],
                     [
                         "e023fe88445ce43e"
                     ]
                 ]
             },
             {
                 "id": "e30ba9f0483285e4",
                 "type": "change",
                 "z": "6e802f1553b18149",
                 "name": "",
                 "rules": [
                     {
                         "t": "change",
                         "p": "topic",
                         "pt": "msg",
                         "from": "/",
                         "fromt": "str",
                         "to": ".",
                         "tot": "str"
                     }
                 ],
                 "action": "",
                 "property": "",
                 "from": "",
                 "to": "",
                 "reg": false,
                 "x": 350,
                 "y": 120,
                 "wires": [
                     [
                         "3649300b4c233b10"
                     ]
                 ]
             },
             {
                 "id": "0962842ebd23e0d7",
                 "type": "change",
                 "z": "6e802f1553b18149",
                 "name": "translate invalid chars in topic",
                 "rules": [
                     {
                         "t": "change",
                         "p": "topic",
                         "pt": "msg",
                         "from": "..",
                         "fromt": "str",
                         "to": ".",
                         "tot": "str"
                     },
                     {
                         "t": "change",
                         "p": "topic",
                         "pt": "msg",
                         "from": "€",
                         "fromt": "str",
                         "to": "EUR",
                         "tot": "str"
                     }
                 ],
                 "action": "",
                 "property": "",
                 "from": "",
                 "to": "",
                 "reg": false,
                 "x": 2430,
                 "y": 280,
                 "wires": [
                     []
                 ]
             },
             {
                 "id": "9ac3cc3681e8b6c6",
                 "type": "change",
                 "z": "6e802f1553b18149",
                 "name": "set topic, if empty",
                 "rules": [
                     {
                         "t": "set",
                         "p": "topic",
                         "pt": "msg",
                         "to": "topic ? topic : $type(payload)\t",
                         "tot": "jsonata"
                     }
                 ],
                 "action": "",
                 "property": "",
                 "from": "",
                 "to": "",
                 "reg": false,
                 "x": 950,
                 "y": 200,
                 "wires": [
                     [
                         "a096a93bb82b7a93"
                     ]
                 ]
             },
             {
                 "id": "fc7913a8524badb7",
                 "type": "json",
                 "z": "6e802f1553b18149",
                 "name": "",
                 "property": "payload",
                 "action": "obj",
                 "pretty": false,
                 "x": 750,
                 "y": 100,
                 "wires": [
                     [
                         "d9e7bdd4c48a8aa1"
                     ]
                 ]
             },
             {
                 "id": "d9e7bdd4c48a8aa1",
                 "type": "switch",
                 "z": "6e802f1553b18149",
                 "name": "is type?",
                 "property": "payload",
                 "propertyType": "msg",
                 "rules": [
                     {
                         "t": "istype",
                         "v": "array",
                         "vt": "array"
                     },
                     {
                         "t": "istype",
                         "v": "object",
                         "vt": "object"
                     },
                     {
                         "t": "else"
                     }
                 ],
                 "checkall": "true",
                 "repair": false,
                 "outputs": 3,
                 "x": 900,
                 "y": 100,
                 "wires": [
                     [
                         "1520be42bcc2145e"
                     ],
                     [
                         "1520be42bcc2145e"
                     ],
                     [
                         "9ac3cc3681e8b6c6"
                     ]
                 ]
             },
             {
                 "id": "a096a93bb82b7a93",
                 "type": "junction",
                 "z": "6e802f1553b18149",
                 "x": 1380,
                 "y": 280,
                 "wires": [
                     [
                         "1a8c03d866b85b12"
                     ]
                 ]
             },
             {
                 "id": "1520be42bcc2145e",
                 "type": "junction",
                 "z": "6e802f1553b18149",
                 "x": 480,
                 "y": 20,
                 "wires": [
                     [
                         "3649300b4c233b10"
                     ]
                 ]
             },
             {
                 "id": "8d36fab85a67b5f5",
                 "type": "subflow:6e802f1553b18149",
                 "z": "7e6af0015415146d",
                 "name": "",
                 "x": 550,
                 "y": 3860,
                 "wires": [
                     []
                 ]
             }
          ]
          

          Ein evtl. Update muss wieder selektiv durchgeführt werden, in dem nur der Subflow ersetzt wird. Genau ist es hier beschrieben:
          https://forum.iobroker.net/post/856928

          Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

          1 Antwort Letzte Antwort
          0
          • icebearI Offline
            icebearI Offline
            icebear
            schrieb am zuletzt editiert von
            #92

            Hallo,

            Ich habe mir in Node-Red einen Flow erstellt, der mir die Preise für 'current' , 'today' und 'tomorrow' abholt und in einem Datenpunkt als json ablegt

            siehe hier:tib_Price.png

            jetzt würde ich gerne aus dieser json für 'today' und 'tomorrow' jeweils den 'niedrigsten' , 'höchsten' und den durchschnittlichen Preis extrahieren und in einen eigenen Datenpunkt schreiben.

            Ich hab aber leider keine Ahnung wie ich das anstellen muß, sprich ich weiß wohl das ich das mittels eines function node realisieren kann der die json zerlegt, aber leider gehen mein Kenntnisse nich soweit.

            Vielleicht kann ja einer helfen

            Gruß
            Holger

            mickymM 1 Antwort Letzte Antwort
            0
            • icebearI icebear

              Hallo,

              Ich habe mir in Node-Red einen Flow erstellt, der mir die Preise für 'current' , 'today' und 'tomorrow' abholt und in einem Datenpunkt als json ablegt

              siehe hier:tib_Price.png

              jetzt würde ich gerne aus dieser json für 'today' und 'tomorrow' jeweils den 'niedrigsten' , 'höchsten' und den durchschnittlichen Preis extrahieren und in einen eigenen Datenpunkt schreiben.

              Ich hab aber leider keine Ahnung wie ich das anstellen muß, sprich ich weiß wohl das ich das mittels eines function node realisieren kann der die json zerlegt, aber leider gehen mein Kenntnisse nich soweit.

              Vielleicht kann ja einer helfen

              Gruß
              Holger

              mickymM Offline
              mickymM Offline
              mickym
              Most Active
              schrieb am zuletzt editiert von mickym
              #93

              @icebear Du wandelst den JSON String mit einer JSON Node in ein Objekt um. Dann extrahierst Du den Wert, der Dich interessiert in dem Du die payload auf den Pfad zum den entsprechenden Wert setzt. Du gehst also mit der Maus neben den Wert und kopierst den Pfad und setzt die payload auf diesen Pfad:

              copy path.gif

              Nun hast Du 3 Möglichkeiten:

              1. Das Maximum und Minimum kannst Du entweder kodieren und mit einer Function Node in dem entsprechenden Kontext speichern.
              2. Du kodierst gar nichts und speicherst das Maximum oder Minimum im Flow Kontext.

              In beiden Fällen setzt Du jeden Tag mit einer Inject Node wieder zurück, wenn Du willst.

              1. Du installierst Dir die aggregate Node , die Dir Minimum und Maximum pro Zeiteinheit also pro Tag ausgibt.

              Falls Du Dich für eine der 3 Möglichkeiten entschieden hast, können wir das konkretisieren.

              Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

              icebearI 1 Antwort Letzte Antwort
              0
              • mickymM mickym

                @icebear Du wandelst den JSON String mit einer JSON Node in ein Objekt um. Dann extrahierst Du den Wert, der Dich interessiert in dem Du die payload auf den Pfad zum den entsprechenden Wert setzt. Du gehst also mit der Maus neben den Wert und kopierst den Pfad und setzt die payload auf diesen Pfad:

                copy path.gif

                Nun hast Du 3 Möglichkeiten:

                1. Das Maximum und Minimum kannst Du entweder kodieren und mit einer Function Node in dem entsprechenden Kontext speichern.
                2. Du kodierst gar nichts und speicherst das Maximum oder Minimum im Flow Kontext.

                In beiden Fällen setzt Du jeden Tag mit einer Inject Node wieder zurück, wenn Du willst.

                1. Du installierst Dir die aggregate Node , die Dir Minimum und Maximum pro Zeiteinheit also pro Tag ausgibt.

                Falls Du Dich für eine der 3 Möglichkeiten entschieden hast, können wir das konkretisieren.

                icebearI Offline
                icebearI Offline
                icebear
                schrieb am zuletzt editiert von
                #94

                @mickym

                Ich hatte die aggregate node schon installiert, hatte ich aber garnich auf dem Schirm.

                Ich hab jetzt nochmal einen einfachen flow erstellt, der mir mit einem template node die aktuellen preise von tibber abholt.

                siehe hier:tib_array.png

                wie krieg ich das jetzt in die aggregate node rein

                Gruß
                Holger

                mickymM 1 Antwort Letzte Antwort
                0
                • icebearI icebear

                  @mickym

                  Ich hatte die aggregate node schon installiert, hatte ich aber garnich auf dem Schirm.

                  Ich hab jetzt nochmal einen einfachen flow erstellt, der mir mit einem template node die aktuellen preise von tibber abholt.

                  siehe hier:tib_array.png

                  wie krieg ich das jetzt in die aggregate node rein

                  Gruß
                  Holger

                  mickymM Offline
                  mickymM Offline
                  mickym
                  Most Active
                  schrieb am zuletzt editiert von
                  #95

                  @icebear Klapp die Objekte auf und setze via Change Node die payload auf den Pfad des Wertes im Nachrichtenobjekt, der Dich interessiert wie in meiner Animation gezeigt. Und die payload verbindest dann mit der aggregate Node.

                  Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                  icebearI 1 Antwort Letzte Antwort
                  0
                  • mickymM mickym

                    @icebear Klapp die Objekte auf und setze via Change Node die payload auf den Pfad des Wertes im Nachrichtenobjekt, der Dich interessiert wie in meiner Animation gezeigt. Und die payload verbindest dann mit der aggregate Node.

                    icebearI Offline
                    icebearI Offline
                    icebear
                    schrieb am zuletzt editiert von
                    #96

                    @mickym

                    also ich habs jetzt so gemacht:

                    tib_iob.png

                    keine Ahnung ob das nich noch einfacher oder übersichtlicher geht, aber das Ergebnis stimmt.

                    Gruß
                    Holger

                    mickymM 1 Antwort Letzte Antwort
                    0
                    • icebearI icebear

                      @mickym

                      also ich habs jetzt so gemacht:

                      tib_iob.png

                      keine Ahnung ob das nich noch einfacher oder übersichtlicher geht, aber das Ergebnis stimmt.

                      Gruß
                      Holger

                      mickymM Offline
                      mickymM Offline
                      mickym
                      Most Active
                      schrieb am zuletzt editiert von
                      #97

                      @icebear Nun - ich kannte die Anforderung nicht im Detail. Wenn Du willst, dass ich ggf. eine einfachere Lösung finde, dann exportiere mir doch auf der einen Seite mal alle Nodes hinter dieser tibber-query node und dann mach mal eine Debug Node hinter die tibber-query Node und kopiere mir mal das komplette Objekt hier in code-tags, sodass ich die Ausgabe der tibber-query Node mit einer Inject Node simulieren kann.

                      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                      icebearI 1 Antwort Letzte Antwort
                      0
                      • mickymM mickym

                        @icebear Nun - ich kannte die Anforderung nicht im Detail. Wenn Du willst, dass ich ggf. eine einfachere Lösung finde, dann exportiere mir doch auf der einen Seite mal alle Nodes hinter dieser tibber-query node und dann mach mal eine Debug Node hinter die tibber-query Node und kopiere mir mal das komplette Objekt hier in code-tags, sodass ich die Ausgabe der tibber-query Node mit einer Inject Node simulieren kann.

                        icebearI Offline
                        icebearI Offline
                        icebear
                        schrieb am zuletzt editiert von
                        #98

                        @mickym

                        Vielen Dank erstmal für deine Hilfe.
                        Ich hab mich jetzt doch anders entschieden und nehm die Werte mit den zugehörigen Graphen bzw. Anzeigen aus Grafana.
                        Die 'gauges' Widgets aus iobroker gefallen mir nich so gut und passen nicht zu meiner VIS, da hab ich bei Grafana bessere Darstellungsmöglichkeiten.
                        Das laden dauert zwar ein Mü länger, aber einen Tod muß man ja sterben.

                        Trotzdem nochmal vielen Dank!

                        Gruß Holger

                        1 Antwort Letzte Antwort
                        0
                        • Merlin123M Offline
                          Merlin123M Offline
                          Merlin123
                          schrieb am zuletzt editiert von
                          #99

                          Ok... Kann mal jemand "für Dumme" erklären, wie das funktioniert...
                          Hab bisher mit NodeRed nix am Hut und den nur installiert, um die Daten von Tibber auszulesen (danke an der Stelle für die tolle Beschreibung! ).
                          Jetzt hab ich in IOB nen DP mit dem JSON und würde den gerne zerlegen. Also das die Werte in einzelnen DPs liegen.
                          Das JSON sieht so aus:

                          {"timestamp":"2023-06-19T16:13:37.000+02:00","power":0,"lastMeterConsumption":9194.1692,"accumulatedConsumption":0,"accumulatedProduction":3.5866,"accumulatedConsumptionLastHour":0,"accumulatedProductionLastHour":0.3924,"accumulatedCost":null,"accumulatedReward":null,"currency":null,"minPower":0,"averagePower":0,"maxPower":0,"powerProduction":1290,"minPowerProduction":676,"maxPowerProduction":4514,"lastMeterProduction":19342.1205,"powerFactor":null,"voltagePhase1":null,"voltagePhase2":null,"voltagePhase3":null,"currentL1":null,"currentL2":null,"currentL3":null,"signalStrength":null}
                          

                          Was muss ich da jetzt machen, damit die Daten des JSON in einzelne DPs kommen? Ich hab den Node importiert, verstehe hier aber grad nur Bahnhof :(

                          Beta-Tester

                          mickymM 1 Antwort Letzte Antwort
                          0
                          • Merlin123M Merlin123

                            Ok... Kann mal jemand "für Dumme" erklären, wie das funktioniert...
                            Hab bisher mit NodeRed nix am Hut und den nur installiert, um die Daten von Tibber auszulesen (danke an der Stelle für die tolle Beschreibung! ).
                            Jetzt hab ich in IOB nen DP mit dem JSON und würde den gerne zerlegen. Also das die Werte in einzelnen DPs liegen.
                            Das JSON sieht so aus:

                            {"timestamp":"2023-06-19T16:13:37.000+02:00","power":0,"lastMeterConsumption":9194.1692,"accumulatedConsumption":0,"accumulatedProduction":3.5866,"accumulatedConsumptionLastHour":0,"accumulatedProductionLastHour":0.3924,"accumulatedCost":null,"accumulatedReward":null,"currency":null,"minPower":0,"averagePower":0,"maxPower":0,"powerProduction":1290,"minPowerProduction":676,"maxPowerProduction":4514,"lastMeterProduction":19342.1205,"powerFactor":null,"voltagePhase1":null,"voltagePhase2":null,"voltagePhase3":null,"currentL1":null,"currentL2":null,"currentL3":null,"signalStrength":null}
                            

                            Was muss ich da jetzt machen, damit die Daten des JSON in einzelne DPs kommen? Ich hab den Node importiert, verstehe hier aber grad nur Bahnhof :(

                            mickymM Offline
                            mickymM Offline
                            mickym
                            Most Active
                            schrieb am zuletzt editiert von
                            #100

                            @merlin123 ich kann Dir im Moment nur von unterwegs antworten, deshalb kann ich Dir keine Screenshots schicken. Du ziehst einfach die neue Node auf Deinen Flow und schließt sie an die Node an die Dein JSON rauskommt. Wenn du die Node öffnest dann kannst du einen Ordnernamen angeben unter dem die einzelnen States abgelegt werden sollen. Vorgegeben ist objRoot. Dann schließt Du an diese Node eine iobroker-Out Node an. Dort gibst du an, dass die States erstellt werden sollen, falls sie nicht existieren (in der Adapterkonfiguration muss Fremdobjekte erstellen aktiviert sein), dann solltest du als Typ „value“ angeben und eventuell noch als ReadOnly definieren.

                            Falls das nicht klar ist, melde Duch nochmal, dann melde ich mich am Abend nochmal.

                            Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                            Merlin123M 1 Antwort Letzte Antwort
                            0
                            • mickymM mickym

                              @merlin123 ich kann Dir im Moment nur von unterwegs antworten, deshalb kann ich Dir keine Screenshots schicken. Du ziehst einfach die neue Node auf Deinen Flow und schließt sie an die Node an die Dein JSON rauskommt. Wenn du die Node öffnest dann kannst du einen Ordnernamen angeben unter dem die einzelnen States abgelegt werden sollen. Vorgegeben ist objRoot. Dann schließt Du an diese Node eine iobroker-Out Node an. Dort gibst du an, dass die States erstellt werden sollen, falls sie nicht existieren (in der Adapterkonfiguration muss Fremdobjekte erstellen aktiviert sein), dann solltest du als Typ „value“ angeben und eventuell noch als ReadOnly definieren.

                              Falls das nicht klar ist, melde Duch nochmal, dann melde ich mich am Abend nochmal.

                              Merlin123M Offline
                              Merlin123M Offline
                              Merlin123
                              schrieb am zuletzt editiert von
                              #101

                              @mickym Danke erstmal für die Erklärung. Ich hab mal versucht das umzusetzen, aber es wird nichts angelegt. Vermutlich ne Kleinigkeit....

                              Sieht bei mir jetzt so aus:
                              2023-06-19_18-08-26.png

                              2023-06-19_18-07-55.png

                              2023-06-19_18-09-05.png

                              Beta-Tester

                              mickymM 1 Antwort Letzte Antwort
                              0
                              • Merlin123M Merlin123

                                @mickym Danke erstmal für die Erklärung. Ich hab mal versucht das umzusetzen, aber es wird nichts angelegt. Vermutlich ne Kleinigkeit....

                                Sieht bei mir jetzt so aus:
                                2023-06-19_18-08-26.png

                                2023-06-19_18-07-55.png

                                2023-06-19_18-09-05.png

                                mickymM Offline
                                mickymM Offline
                                mickym
                                Most Active
                                schrieb am zuletzt editiert von mickym
                                #102

                                @merlin123 wenn Fremdobjekte in der Adapterkonfiguration erlaubt sind, dann topic in der iobroker-out Node rauslöschen das topic wird durch die neue Node gesetzt. Readonly würde ich noch setzen. Keep topic in der subflow node auf false lassen. Selbst einen Namen in der iobroker Out Node vergeben oder rauslöschen

                                Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                                Merlin123M E 2 Antworten Letzte Antwort
                                0
                                • mickymM mickym

                                  @merlin123 wenn Fremdobjekte in der Adapterkonfiguration erlaubt sind, dann topic in der iobroker-out Node rauslöschen das topic wird durch die neue Node gesetzt. Readonly würde ich noch setzen. Keep topic in der subflow node auf false lassen. Selbst einen Namen in der iobroker Out Node vergeben oder rauslöschen

                                  Merlin123M Offline
                                  Merlin123M Offline
                                  Merlin123
                                  schrieb am zuletzt editiert von
                                  #103

                                  @mickym Dank Dir vielmals! das topic war das Problem :)

                                  Und allgemein Danke für die Mühe, die Du dir machst :)

                                  Beta-Tester

                                  1 Antwort Letzte Antwort
                                  0
                                  • mickymM mickym

                                    @merlin123 wenn Fremdobjekte in der Adapterkonfiguration erlaubt sind, dann topic in der iobroker-out Node rauslöschen das topic wird durch die neue Node gesetzt. Readonly würde ich noch setzen. Keep topic in der subflow node auf false lassen. Selbst einen Namen in der iobroker Out Node vergeben oder rauslöschen

                                    E Offline
                                    E Offline
                                    Einstein2002
                                    schrieb am zuletzt editiert von
                                    #104

                                    @mickym
                                    Hallo Mickym

                                    so das würde ich jetzt gerne vertiefen und fange mal von oben an zu lesen.

                                    Wenn es dazu Hilfe benötigt werde ich sehr gerne auf Dich zukommen! Wenn ich darf.

                                    Oder hast Du eine bessere Idee wie und wo ich anfangen sollte?

                                    Proxmox, VM`s Windows, IoBroker im unprivilegiert LXC, Openmediavault; LXC `s Tasmota, PiHole, , InfluxDB, Motioneye, WireguardVPN, UniFi:
                                    Smarthome...Sonoff, Alexa, Wled, raspberrymatic,...

                                    mickymM 1 Antwort Letzte Antwort
                                    0
                                    • E Einstein2002

                                      @mickym
                                      Hallo Mickym

                                      so das würde ich jetzt gerne vertiefen und fange mal von oben an zu lesen.

                                      Wenn es dazu Hilfe benötigt werde ich sehr gerne auf Dich zukommen! Wenn ich darf.

                                      Oder hast Du eine bessere Idee wie und wo ich anfangen sollte?

                                      mickymM Offline
                                      mickymM Offline
                                      mickym
                                      Most Active
                                      schrieb am zuletzt editiert von
                                      #105

                                      @einstein2002 Na wenn es Dir nicht nur um das Zerlegen von Objekten geht - dann solltest Du lieber einen eigenen Thread aufmachen und dann können wir das Durchgehen. Was nutzt Du denn bis jetzt für Deine Logikmaschine?

                                      Blockly oder Javascript?

                                      Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                                      E 1 Antwort Letzte Antwort
                                      0
                                      • mickymM mickym

                                        @einstein2002 Na wenn es Dir nicht nur um das Zerlegen von Objekten geht - dann solltest Du lieber einen eigenen Thread aufmachen und dann können wir das Durchgehen. Was nutzt Du denn bis jetzt für Deine Logikmaschine?

                                        Blockly oder Javascript?

                                        E Offline
                                        E Offline
                                        Einstein2002
                                        schrieb am zuletzt editiert von
                                        #106

                                        @mickym
                                        Ich nenne den dann mal Anfänger fragen?? Oder?

                                        Proxmox, VM`s Windows, IoBroker im unprivilegiert LXC, Openmediavault; LXC `s Tasmota, PiHole, , InfluxDB, Motioneye, WireguardVPN, UniFi:
                                        Smarthome...Sonoff, Alexa, Wled, raspberrymatic,...

                                        mickymM 1 Antwort Letzte Antwort
                                        0
                                        • E Einstein2002

                                          @mickym
                                          Ich nenne den dann mal Anfänger fragen?? Oder?

                                          mickymM Offline
                                          mickymM Offline
                                          mickym
                                          Most Active
                                          schrieb am zuletzt editiert von mickym
                                          #107

                                          @einstein2002 Vielleicht NodeRed für Anfänger und dann ins Einsteigerforum. Was nutzt Du denn jetzt?

                                          Du kannst auch erst mal den Artikel lesen - der ist schon bissi älter aber in Summe funktioniert der noch.

                                          https://www.smarthome-tricks.de/uebersicht-iobroker-node-red/

                                          Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                                          E 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          802

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

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

                                          • Du hast noch kein Konto? Registrieren

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