Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Node-Red
    5. Hilfe bei Node Red Aufgabe

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Hilfe bei Node Red Aufgabe

    This topic has been deleted. Only users with topic management privileges can see it.
    • E
      Elia last edited by Elia

      Hallo allerseits,

      ich bin Anfänger in Node-Red und habe Schwierigkeiten, mir vorzustellen, wie all diese Anforderungen im Detail aussehen könnten. Kann mir vielleicht jemand dabei helfen?

      Vielen Dank!


      ////////////////////////////

      Ziel der Aufgabe ist es, ein Dashboard zu entwickeln, welches die folgenden Anforderungen
      erfüllt.
      Der Nutzer möchte ein übersichtliches Dashboard auf dem er die Temperatur und die
      Auslastung seines Rechners abrufen kann und die Werte über einen Zeitraum von 60
      Sekunden in einem Chart grafisch dargestellt werden sowie die letzten 5 eingegangenen
      Werte mit Ihren Zeitstempels in einer Tabelle anzeigt.
      Über ein Dropdown-Menü sollen Fehlercodes ausgewählt werden können und an weitere
      Instanzen verschickt werden. Dabei soll eine Sendebestätigung in Form einer
      Benachrichtigung auf dem Dashboard angezeigt werden. Um die Übersichtlichkeit zu erhöhen
      und einzelne Teilbereiche voneinander abzugrenzen, sollen die einzelnen Funktionalitäten
      hinter Tabs verborgen werden.
      Daraus ergeben sich folgende Anforderungen:
      • Verbindung zum MQTT-Broker herstellen
      • Aufbereitung der Daten für die weitere Nutzung
      • Chart einrichten
      • Tabelle einrichten
      • Textfelder hinzufügen
      • Dropdownmenü vorbereiten
      • Buttons hinzufügen
      • Benachrichtigung einrichten
      • Mit „ui-control“ Übersicht schaffen
      5.1 Charts und Tabellen: Messwert-Zeitstempel-Paare über MQTT empfangen
      In diesem Abschnitt werden die Daten, die über MQTT gesendet werden, geeignet verarbeitet
      und in einem Chart und einer Tabelle dargestellt sowie neue Nachrichten in einem Textfeld
      ausgegeben.
      5.1.1 Verbindung zum MQTT-Broker herstellen
      Um Daten zu empfangen, muss zuerst die Verbindung zum Broker eingerichtet werden. Dafür
      gibt es einen Node, der als “Subscriber” dient und damit den Datenempfang ermöglicht.
      Durch einen Doppelklick auf den Node können weitere Einstellungen vorgenommen werden.
      Die wichtigen Eigenschaften sind “Topic” und “Server”. Das Topic ist für jeden
      Anwendungsfall unterschiedlich.
      Konzentrieren wir uns in diesem Aufgabenteil vorerst nur auf die Temperatur. Das
      entsprechende Topic ist „red/temp“. Der Server wird in diesem Fall über seine IP mit Port des
      MQTT-Brokers repräsentiert. In diesem Fall wird die IP 193.174.69.5 und der Port 10002
      verwendet. Ggf. abweichende Verbindungsdaten des in diesem Praktikumsversuch
      eingesetzten MQTT-Brokers erhalten Sie von Ihrem Dozenten.
      Um einen neuen Broker hinzuzufügen, muss der Punkt „Neuen Typ ‚mqtt-broker‘
      hinzufügen“ ausgewählt werden. Durch einen Klick auf den Stift rechts daneben können die
      Verbindungsdaten geändert werden. Für diesen Versuch sind nur die IP und der Port von
      Bedeutung. Die Broker-Einstellungen werden über den roten Button „Hinzufügen“
      übernommen. Nach Verlassen des Fensters über „Fertig“ erscheint unterhalb des Node ein
      farbiges Rechteck. Grün bedeutet “Verbunden”, gelb “Verbindungsaufbau” und rot
      “Verbindung unterbrochen”. Um zu überprüfen, ob Daten empfangen werden, kann ein „debug“-Node verwendet werden.
      Dieser Node gibt einfach den empfangenen Payload aus.
      5.1.2 Vorverarbeitung der Daten für die Darstellung in einer Tabelle bzw. Chart
      Da die eingegangenen Daten in dieser Form nicht von der Tabelle/dem Chart verarbeitet
      werden können, müssen die Daten in eine bestimmte Form gebracht werden.
      Die Verwendung von den Nodes „split“ und „join“ ist die einfachste Methode, die
      eingegangenen Daten vorzuverarbeiten. Die eingehenden Daten sind ein String.
      Der „split“-Node ist dafür da diesen String aufzuteilen. In dem Node muss nur das trennende
      Zeichen „ ; “ eingeben werden und die Länge des Arrays, in diesem Fall zwei. Der „join“-
      Node erzeugt aus den einzelnen Nachrichten ein Array, welches die Weitergabe an die Nodes
      vereinfacht. Der Modus wird hierbei auf „manuell“ gesetzt, damit das Array gezielt aufgebaut
      werden kann. Im zweiten Dropdown-Menü muss „Array“ ausgewählt werden und die
      Nachricht soll nach 2 eingehenden Nachrichten weitergeleitet werden.
      Als nächstes betrachten wir die Funktionsknoten, die „function“-Nodes. Hier müssen wir
      zwischen den Nodes für Tabellen und Graphen unterscheiden, da beide eine anderen Payload
      erwarten.
      Wir beginnen zuerst mit der Tabelle. Der „table“-Node speichert keine zuletzt eingegangenen
      Nachrichten. Daher müssen wir selbst dafür sorgen, dass die passende Anzahl an Werte-
      Zeitstempel-Paaren gespeichert wird. Um Variablen zu speichern, gibt es verschiedene
      Sichtbarkeitsbereiche. Für diese Aufgabe nutzen wir „flow“ (siehe Kapitel 6.1). Diese
      Variable wird in einer lokalen Variable hinterlegt, um sie verändern zu können. Beachten Sie,
      dass die Variable sprechend benannt ist, da für Aufgabenpunkt 5.1.6 ein weiteres Array für
      die Tabelle und den Chart benötigt wird. Hier bietet sich eine Queue an, die durch ein Array
      umgesetzt wird, wobei immer das zuerst hinzugefügte Element entfernt wird (FIFO Prinzip).
      Zuvor muss aber das Objekt für die Aufgabe passend vorbereitet werden (siehe Kapitel 6.2.1).
      Um auf die einzelnen Werte des durch den „join“-Node erstellten Arrays zugreifen zu können,
      wird „msg.payload[i]“ genutzt. Dann kann das Objekt dem Array hinzugefügt werden. Wenn
      das Array davor bereits 5 Einträge hatte, muss der erste entfernt werden (siehe Kapitel 6.3).
      Danach kann die lokale Variable wieder an die flow-Variable übergeben werden (siehe
      Kapitel 6.1). Zuletzt muss die Variable in den Payload geschrieben werden, damit das Array
      weitergegben wird.
      Falls das Array geleert werden soll, kann ein „function“-Node genutzt werden, der die flow-
      Variablen auf „null“ setzt. Da wir hierfür keine Daten benötigen, kann ein Inject-Node ohne
      payload zur Aktivierung genutzt werden.
      Der „function“-Node für den Chart sieht ähnlich aus wie der der Tabelle. Der Aufbau der
      Tabellenfunktion kann übernommen werden, muss aber abgeändert werden. Zum Einen
      benötigen wir eine eigene flow-Variable, die die letzten 60 Werte speichert (Annahme: es
      wird einmal pro Sekunde gesendet). Dementsprechend muss auch die Abfrage der Arraylänge
      angepasst werden. Außerdem kann der Node nicht mit Strings umgehen. Daher nutzen wir die
      „parse“-Funktionen, um die gewünschten Datentypen zu erhalten (siehe Kapitel 6.4).
      Außerdem muss der Zeitstempel mit 1000 multipliziert werden, da Node-RED Zeitstempel in
      Millisekunden anzeigt und nicht in Sekunden. Das Array kann allerdings nicht alleine
      übergeben werden, sondern muss in einer vorgegebenen Form eingefügt werden (siehe
      Kapitel 6.5). Auch dieses Array muss in die Payload geschrieben werden.
      Damit ist die Vorbereitung der Daten abgeschlossen.
      5.1.3 Chart-Node einrichten
      Für den Chart-Node benutzen wir die DashboardUI-Palette. Stellen Sie sicher, dass diese auch
      installiert ist (siehe Kapitel 2.3).
      Damit der Chart auf dem Dashboard angezeigt werden kann, muss der Node einer Gruppe
      zugeordnet werden. Da bisher noch keine Gruppe benötigt wurde, muss eine erstellt werden.
      Dazu muss im Dropdown-Menü „neuen Typ ‚dashboard group‘ hinzufügen“ ausgewählt
      werden und auf den Stift daneben auf der rechten Seite geklickt werden. Dieser Gruppe wird
      der Name „Temperatur“ gegeben. Node-RED zeigt die Nodes in verschiedenen „Tabs“ an,
      daher muss auch noch ein neuer Tab hinzugefügt werden. Dies erfolgt ebenfalls über „neuen
      Typ ‚dashboard tab‘ hinzufügen“. Beim Namen sollte darauf geachtet werden, dass dieser
      keine Leerzeichen beinhaltet. Durch „hinzufügen“ werden die Einstellungen übernommen.
      Es sollte außerdem eine Beschriftung hinzugefügt und die x-Achse korrekt konfiguriert
      werden. Beachten Sie außerdem, dass die Option Liniendiagramm ausgewählt ist.
      5.1.4 Tabellen-Node einrichten
      Der Table-Node ist Teil der TableUI-Palette. Der Tabellen-Node wird der selben Gruppe
      hinzugefügt wie der Chart. Außerdem sollte ein sinvoller Name zugewiesen werden.
      Unter Spalten sollen die übergebenen Werte spezifiziert werden, eine Spalte für Value und
      eine für Timestamp. Property muss dem Namen der Variablen entsprechen, welche im JSON-
      Format festgelegt wurde. Der Titel dagegen kann frei gewählt werden und entspricht in der
      Dashboard-Tabelle dem Namen der Spalte. Das Format kann als „HTML“ übernommen
      werden.
      5.1.5 Textfeld hinzufügen
      Das Textfeld ist Teil der DashboardUI-Palette. Für das Textfeld soll eine neue Gruppe
      hinzugefügt werden, die „Nachrichten“ heißt. Das Label dieses Textfeldes soll „Temperatur“
      heißen. Als „value format“ kann einfach msg.payload in doppelten geschweiften Klammern
      angegeben werden. Zur Verdeutlichung, dass es sich um neue Daten handelt, kann weiterer
      Text außerhalb der Klammern hinzugefügt werden. Als Layout eignet sich am besten der
      zuletzt beschriebene Vorschlag, da die eingehenden Daten so am besten dargestellt werden.
      5.1.6 Zweite Tabelle und Chart
      Aufbau und Funktionsweise der zweiten Tabelle decken sich mit den Aufgabenpunkten 5.1.1
      bis 5.1.5. Der einzige Unterschied ist, dass sich Topic und die Namen der flow-Arrays ändern.
      Auch das Textfeld zur Darstellung neuer Nachrichten behält seine bisherige Funktionalität.
      Der payload wird über das Topic „red/cpuusage“ versendet.
      Der zweite Chart soll allerdings nicht nur die Auslastung anzeigen, sondern auch die Werte
      der Temperatur. Die Verarbeitung der Daten kann auf dieselbe Weise durchgeführt werden
      wie zuvor für den ersten Chart. Eine weiterer function-Node führt die payloads der function-
      Nodes des ersten und des zweiten Charts zusammen. Die Syntax bleibt wie in Kapitel 6.5
      beschrieben. Dem Punkt „series“ werden die Namen der beobachteten Graphen übergeben.
      Um „data“ zu befüllen, können wir einfach auf die flow-Variablen der Charts zugreifen.
      Beachten Sie dabei die Reihenfolge, damit Temperatur und Auslastung nicht vertauscht
      werden.
      5.2 Nachrichten senden und empfangen
      Im Folgenden soll das Dropdown-Menü zum Senden von vordefinierten Nachrichten
      eingerichtet werden.
      Das Dropdown-Menü befindet sich unter den Dashboard-Nodes. Der Node soll der Gruppe
      „Nachrichten“ hinzugefügt werden.
      Unter „Optionen“ sollen die folgenden Nachrichten sichtbar sein:
      • Empfangende Daten fehlerhaft
      • MQTT-Verbindung abgebrochen
      • Topic existiert nicht
      • Übertragungsformat ungültig
      Zum Versenden der Nachricht wird ein Button eingefügt, welcher ebenfalls zu der Gruppe
      „Nachrichten“ gehört. Es ist wichtig, dass bei payload „flow.control“ ausgewählt wird, da
      diese Variable die Nachricht beinhaltet.
      Damit die Nachrichten nicht vor dem Klicken des Buttons versendet werden, sollen change-
      Nodes eingesetzt werden. Ein Node wird zwischen das Dropdown-Menü und den Button
      geschaltet. In den Einstellungen ist es wichtig die Reglen auf „Setze flow.control to the value
      msg.payload“ zu setzen. Ein Node als Gegenstück kommt direkt hinter den Button mit den
      Regeln „Setze msg.payload to the value flow.control“. Auf diesen Node folgt ein MQTT out
      Knoten, welcher zur besseren Darstellung auch ein MQTT in besitzt. Nachrichten werden
      über „red/control“ verschickt. Die payload von red/control soll in einen „show notification“-
      Node gehen und somit die gesendete payload ausgeben. Die Anzeigedauer soll hierbei 3
      Sekunden betragen.
      Auf den Button soll außerdem ein function-Node folgen, in dessen Eigenschaften die payload
      auf „Kontrollpaket versendet!“ gesetzt wird und an ein Textfeld weitergeleitet wird. Damit
      der Text nicht dauerhaft angezeigt wird, kann als paralleler Pfad ein Verzögerungs-Node mit
      einer Dauer von 5 Sekunden eingefügt werden. Um die Nachricht zu löschen, folgt darauf ein
      function-Node, der einen leeren payload übergibt.
      Das eigentliche Textfeld soll zur Nachrichten-Gruppe gehören und nur die payload ausgeben
      (siehe 5.1.5). Um nur die payload anzeigen zu lassen, kann das Label weggelassen werden.
      5.3 Übersicht durch Gruppen
      Da das Dashboard durch die vielen verschiedenen Funktionen unübersichtlich wirken könnte,
      sollen im Folgenden die nicht benötigten Gruppen versteckt werden.
      Dazu nutzen wir die „ui control“-Node. In diesen Node führen Verbindungen von vier
      Buttons und eines „inject“-Nodes. Dieser Node sorgt dafür, dass beim Start des Dashboards
      nur eine Gruppe angezeigt wird, indem ein payload übergeben wird (siehe Kapitel 6.6). Als
      initiale Gruppe soll „Temperatur“ ausgewählt sein. Nach dem deploy muss dieser Node
      einmal durch einen Klick auf das Kästchen davor aktiviert werden, damit er seine Funktion
      erfüllen kann.
      Die vier Buttons gehören zu den Themen „Temperatur“, „Auslastung“, „Überblick“ und
      „Nachrichten“. Diese Buttons bekommen ihre eigene Gruppe „Kontrolle“ auf dem Dashboard.
      Diese Gruppe soll immer sichtbar sein. Unter payload kann explizit angegeben werden,
      welche Gruppen angezeigt und welche versteckt werden sollen (siehe Kapitel 6.6).
      Damit sollten alle Anforderungen aus der Aufgabenstellung erfüllt und das entwickelte
      Dashboard kann wie geplant eingesetzt werden.
      6 Nützliche Funktionen und Codebeispiele
      6.1 Variablen außerhalb einer Nachricht sichtbar machen
      Für Variabeln gibt es drei Sichtbarkeitsbereiche: nur für diese Nachricht (msg), nur für diesen
      Flow (flow) und über alle Flows geteilt (global).
      Um ein Array zu erstellen, welches für andere Nodes sichtbar ist und die Daten über die Zeit
      hinweg speichert, kann die Funktion get verwendet werden. Dieser übergibt man einen
      Variablennamen in Hochkommata. Angefügt wird ein doppelter senkrechter Strich und eckige
      Klammern, um ein Array zu definieren. Diese Kombination sorgt dafür, dass ein Array
      angelegt wird, wenn noch keines existiert. Die gespeicherten Daten dieser Funktion müssen in
      eine selbst definierte Variable geschrieben werden.
      Beispiel: var new_table = flow.get(‛array‘) || [];
      Um diese Daten zu speichern, wird der Funktion set erst die zu nutzende Flow-Variable (diese
      wird ebenfalls in Hochkommata geschrieben) und dann die selbst definierte Variable
      übergeben.
      Beispiel: flow.set(‛array‘, new_array);
      6.2 Objekte anlegen
      Um die Daten korrekt zu übergeben, müssen die Objekte in einer speziellen Reihenfolge
      aufgebaut sein.
      6.2.1 Tabelle
      Die Tabelle erwartet folgende Struktur:
      Beispiel: var new_table_object = ({„Value“: [value], „Timestamp“: [timestamp]});
      6.2.2 Chart
      Der Chart erwartet ähnliche Eingaben, nur dass timestamp und value durch „x“ und „y“
      ersetzt werden.
      Beispiel: var new_chart_object = ({„x“: [timestamp], „y“: [value]});
      6.3 Messwert/Zeitstempel-Paare in Array einfügen/entfernen
      Für das Einfügen in das Array wird die Funktion push benutzt.
      Beispiel: new_table.push(object);
      Es gibt verschiedene Funktionen, um ein Element zu entfernen. Da das älteste Element, also
      das, was am längsten im Array verweilt, vorne liegt, kann die Funktion shift verwendet
      werden, wodurch das erste Element entfernt wird.
      Beispiel: new_table.shift();
      Um die Länge des Arrays zu bestimmen, wird die Funktion length eingesetzt.
      Beispiel: table_length = new_table.length();
      6.4 Strings umwandeln
      Um einen String in verschiedene Datentypen umzuwandeln, existieren diverse parse-
      Funktionen.
      Beispiel: new_float = parseFloat(string);
      6.5 Chart-Format
      Der Chart erwartet mindestens folgende Schlüssel.
      Beispiel: var chart_input = [{„series“: [„ „], „data“: [chart_array], „label“: [„ „]}];
      6.6 Payload von Buttons
      Um nur bestimmte Gruppen sichtbar zu machen, kann dem „ui control“-Node ein payload im
      JSON-Format übergeben werden. Der payload sieht z.B. wie folgt aus.
      Beispiel:
      {„group“: {„hide“: [verstecker_Gruppenname], „show“: [gezeigter_Gruppenname]}}
      „versteckter_Gruppenname“ und „gezeigter_Gruppenname“ bestehen dabei aus Tabname und
      Gruppenname:
      „Tabname_Gruppenname“
      „show“ und „hide“ können dabei mehrere Werte durch Komma getrennt beinhalten.

      haselchen 1 Reply Last reply Reply Quote 0
      • haselchen
        haselchen Most Active @Elia last edited by

        @mickym

        Help…i Need somebody….help 😁

        1 Reply Last reply Reply Quote 0
        • mickym
          mickym Most Active last edited by mickym

          Nun ja. Im Prinzip (auch wenn ich manches anders machen würde) ist doch wie in einem Kochbuch alles haarklein beschrieben was man machen soll. Man muss es doch nur umsetzen? Wo kann ich helfen?

          EDIT: Na ja so dringend scheint es ja nicht zu sein, da sich der TE nicht mehr meldet.

          E 1 Reply Last reply Reply Quote 0
          • E
            Elia @mickym last edited by

            @mickym

            sorry für die verspätete Rückmeldung

            ich habe fast alles richtig(wie beschrieben) umgesetzt und trotzdem fehlen mir noch viele Sachen!
            schau dir mal bitte meine Arbeit an.
            sfaf.PNG adwd.PNG 54PNG.PNG
            Das ist der Codeblock in JSON Foramt:

            [{"id":"9feb0d5017d91904","type":"tab","label":"MQTT","disabled":false,"info":"","env":[]},{"id":"e172cbc91f2d372f","type":"mqtt-broker","name":"Info-in","broker":"193.174.69.5","port":"10002","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"3","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"a740103cc1c0f505","type":"ui_base","theme":{"name":"theme-custom","lightTheme":{"default":"#0094CE","baseColor":"#0094CE","baseFont":"Times New Roman,Times,serif","edited":true,"reset":false},"darkTheme":{"default":"#097479","baseColor":"#5f2341","baseFont":"Impact,Impact,Charcoal,sans-serif","edited":true,"reset":false},"customTheme":{"name":"Untitled Theme 1","default":"#4B7930","baseColor":"#4B7930","baseFont":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif","reset":false},"themeState":{"base-color":{"default":"#4B7930","value":"#4B7930","edited":true},"page-titlebar-backgroundColor":{"value":"#4B7930","edited":false},"page-backgroundColor":{"value":"#111111","edited":false},"page-sidebar-backgroundColor":{"value":"#333333","edited":false},"group-textColor":{"value":"#6db046","edited":false},"group-borderColor":{"value":"#555555","edited":false},"group-backgroundColor":{"value":"#333333","edited":false},"widget-textColor":{"value":"#eeeeee","edited":false},"widget-backgroundColor":{"value":"#4b7930","edited":false},"widget-borderColor":{"value":"#333333","edited":false},"base-font":{"value":"-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif"}},"angularTheme":{"primary":"indigo","accents":"blue","warn":"red","background":"grey","palette":"light"}},"site":{"name":"Node-RED Dashboard","hideToolbar":"false","allowSwipe":"true","lockMenu":"false","allowTempTheme":"true","dateFormat":"DD/MM/YYYY","sizes":{"sx":48,"sy":48,"gx":6,"gy":6,"cx":6,"cy":6,"px":0,"py":0}}},{"id":"a99cad6cfe4753de","type":"mqtt-broker","name":"Temperatur","broker":"193.174.69.5","port":"10002","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"3","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"0d2b5638cd5a7cd7","type":"ui_tab","name":"HOME","icon":"dashboard","order":2,"disabled":false,"hidden":false},{"id":"aefce03b6158a82d","type":"ui_group","name":"Nacrichten","tab":"0d2b5638cd5a7cd7","order":3,"disp":true,"width":6,"collapse":false},{"id":"e8c6fdf06e157bcd","type":"ui_group","name":"Ueberblick","tab":"0d2b5638cd5a7cd7","order":4,"disp":true,"width":"6","collapse":false},{"id":"ef2d206e6f3daf7e","type":"ui_group","name":"Temperatur","tab":"0d2b5638cd5a7cd7","order":2,"disp":true,"width":6,"collapse":false},{"id":"13d2bb0ce29cde20","type":"ui_group","name":"Steuerung","tab":"0d2b5638cd5a7cd7","order":1,"disp":true,"width":6,"collapse":false},{"id":"b82ce1da1a36f36a","type":"ui_spacer","z":"9feb0d5017d91904","name":"spacer","group":"aefce03b6158a82d","order":3,"width":6,"height":1},{"id":"2413395a0bbc22e0","type":"debug","z":"9feb0d5017d91904","name":"debug 7","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":340,"y":40,"wires":[]},{"id":"17806628373ccc74","type":"split","z":"9feb0d5017d91904","name":"","splt":";","spltType":"str","arraySplt":"2","arraySpltType":"len","stream":false,"addname":"","x":370,"y":100,"wires":[["5cf4c3601acad5e0","dcf32ca5072d517c"]]},{"id":"5cf4c3601acad5e0","type":"join","z":"9feb0d5017d91904","name":"","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":550,"y":100,"wires":[["6f2ffd9c00b7a70d","a278d424904ad7e9","13a6a57fe6074643","64d3abb0a196cc13"]]},{"id":"6f2ffd9c00b7a70d","type":"function","z":"9feb0d5017d91904","name":"table function node","func":"// Aktuelle Tabelle aus dem Flow-Speicher abrufen oder ein leeres Array erstellen\nvar currentTable = flow.get('tableData') || [];\n\n// Neues Messwert-Zeitstempel-Paar erstellen\nvar newValueTimestamp = {\n    Value: msg.payload.Value,\n    Timestamp: msg.payload.Timestamp\n};\n\n// Das neue Messwert-Zeitstempel-Paar zum Anfang des Arrays hinzufügen\ncurrentTable.unshift(newValueTimestamp);\n\n// Die Tabelle auf maximal 5 Einträge begrenzen\nif (currentTable.length > 5) {\n    currentTable.pop();\n}\n\n// Den aktualisierten Tabelle-Daten wieder in den Flow-Speicher setzen\nflow.set('tableData', currentTable);\n\n// Den Payload auf die aktualisierte Tabelle setzen\nmsg.payload = currentTable;\n\nreturn msg;\n\n//Der Code oben erstellt ein Array namens currentTable, das die in der Tabelle anzuzeigenden Daten enthält. Dieses Array wird im Flow-Speicher gespeichert, sodass es zwischen verschiedenen \"function\"-Nodes und Zeitschritten gemeinsam genutzt werden kann.\n\n//Jedes Mal, wenn neue Messwert-Zeitstempel-Paare empfangen werden, wird ein neues Objekt newValueTimestamp erstellt, das die \"Value\" und \"Timestamp\" Eigenschaften enthält.\n\n//Das neue Messwert-Zeitstempel-Paar wird am Anfang des Arrays currentTable hinzugefügt. Dadurch wird sichergestellt, dass die neuesten Einträge zuerst angezeigt werden.\n\n//Wir überprüfen die Länge des Arrays und entfernen das älteste Element, wenn es mehr als 5 Einträge enthält, um die Anforderungen zu erfüllen.\n\n//Schließlich wird das aktualisierte currentTable-Array im Flow-Speicher aktualisiert, und der Payload wird auf das aktualisierte Array gesetzt.","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":810,"y":100,"wires":[["4f50d9e4be16fb3b","a44b79daab205922"]]},{"id":"dcf32ca5072d517c","type":"debug","z":"9feb0d5017d91904","name":"debug 8","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":520,"y":160,"wires":[]},{"id":"a278d424904ad7e9","type":"debug","z":"9feb0d5017d91904","name":"debug 9","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":800,"y":40,"wires":[]},{"id":"4f50d9e4be16fb3b","type":"ui_table","z":"9feb0d5017d91904","group":"ef2d206e6f3daf7e","name":"","order":1,"width":0,"height":0,"columns":[{"field":"Spalte:JSON","title":"SPALTE","width":"","align":"left","formatter":"html","formatterParams":{"target":"_blank"}},{"field":"Value.JSON ","title":"VALUE ","width":"","align":"left","formatter":"html","formatterParams":{"target":"_blank"}}],"outputs":0,"cts":false,"x":1090,"y":100,"wires":[]},{"id":"a44b79daab205922","type":"debug","z":"9feb0d5017d91904","name":"debug 10","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1080,"y":40,"wires":[]},{"id":"13a6a57fe6074643","type":"function","z":"9feb0d5017d91904","name":"chart function node","func":"// 1. Überprüfen, ob die Flow-Variable \"chartData\" bereits existiert oder ein leeres Array erstellen.\nvar chartData = flow.get('chartData') || [];\n\n// 2. Erstellen Sie ein neues Objekt mit den Werten aus der empfangenen Nachricht.\nvar newValueTimestamp = {\n    x: msg.payload.Timestamp * 1000, // Multiplizieren Sie den Zeitstempel mit 1000, um ihn in Millisekunden umzuwandeln.\n    y: msg.payload.Value\n};\n\n// 3. Fügen Sie das neue Objekt der \"chartData\"-Flow-Variable hinzu.\nchartData.push(newValueTimestamp);\n\n// 4. Stellen Sie sicher, dass die \"chartData\" nur die letzten 60 Einträge behält.\nif (chartData.length > 60) {\n    chartData.shift(); // Entfernen Sie den ältesten Eintrag, um Platz für den neuen zu schaffen.\n}\n\n// 5. Erstellen Sie die Chart-Datenstruktur im JSON-Format.\nvar chartPayload = [\n    {\n        series: [\"Werte\"],\n        data: [chartData],\n        labels: [\"Zeit\"],\n    }\n];\n\n// 6. Aktualisieren Sie die Flow-Variable mit den aktualisierten Chart-Daten.\nflow.set('chartData', chartData);\n\n// 7. Weisen Sie den Chart-Daten die Nachrichten-Payload zu.\nmsg.payload = chartPayload;\n\nreturn msg;\n\n\n//Der Code erstellt eine Flow-Variable namens \"chartData\", um die letzten 60 Werte zu speichern.\n\n//Er erstellt ein neues Objekt mit den Werten aus der empfangenen Nachricht und wandelt den Zeitstempel in Millisekunden um.\n\n//Das neue Objekt wird zur \"chartData\"-Flow-Variable hinzugefügt.\n\n//Der Code stellt sicher, dass nur die letzten 60 Einträge in der Flow-Variable gespeichert sind, wodurch eine FIFO-Queue implementiert wird.\n\n//Er erstellt die Chart-Datenstruktur im JSON-Format, wie in Ihrer Aufgabenstellung gefordert.\n\n//Die Flow-Variable \"chartData\" wird aktualisiert, um die aktuellen Daten zu speichern.\n\n//Schließlich wird die Chart-Datenstruktur an die Nachrichten-Payload übergeben, um sie an einen \"ui_chart\"-Node oder einen geeigneten Chart-Node für Ihr Dashboard weiterzuleiten.","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":810,"y":180,"wires":[["21171abf9686f3c3","dd1e74cea56d2958"]]},{"id":"21171abf9686f3c3","type":"ui_chart","z":"9feb0d5017d91904","name":"","group":"aefce03b6158a82d","order":2,"width":0,"height":0,"label":"Temperaturverlauf","chartType":"line","legend":"true","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"1","ymax":"120","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"1","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#ff80ff","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"x":1070,"y":180,"wires":[["3a8ae4b3201f979a","dd1e74cea56d2958","3c50fedf03f9e063"]]},{"id":"3a8ae4b3201f979a","type":"debug","z":"9feb0d5017d91904","name":"debug 11","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1300,"y":180,"wires":[]},{"id":"e309bc39b72e3f4b","type":"ui_text","z":"9feb0d5017d91904","group":"aefce03b6158a82d","order":4,"width":0,"height":0,"name":"","label":"Temperatur","format":"{{msg.payload}} aktuelle Daten: ","layout":"row-spread","x":370,"y":220,"wires":[]},{"id":"64d3abb0a196cc13","type":"function","z":"9feb0d5017d91904","name":"usage function node","func":"// Annahme: msg.payload enthält die CPU-Auslastungsdaten im JSON-Format\n// Hier wird angenommen, dass die CPU-Auslastung als Zahl vorliegt\n\n// Neues Array für den Chart erstellen\nvar chartData = [];\n\n// Annahme: msg.payload enthält ein Array von CPU-Auslastungsdaten\nfor (var i = 0; i < msg.payload.length; i++) {\n    // Annahme: msg.payload[i].timestamp enthält den Zeitstempel\n    // Annahme: msg.payload[i].usage enthält die CPU-Auslastung\n    chartData.push({\n        x: msg.payload[i].timestamp,\n        y: msg.payload[i].usage\n    });\n}\n\n// Den umgewandelten Chart-Daten im Payload speichern\nmsg.payload = chartData;\n\nreturn msg;\n\n\n//Dieser Code geht davon aus, dass die CPU-Auslastungsdaten in msg.payload als Array von Objekten im JSON-Format vorliegen, wobei jedes Objekt einen Zeitstempel (timestamp) und die CPU-Auslastung (usage) enthält. Der Code erstellt ein neues Array (chartData), das die erforderliche Struktur für den Chart hat und setzt die umgewandelten Daten in den msg.payload.","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":820,"y":260,"wires":[["dd1e74cea56d2958","f6da6dcc83cffd46"]]},{"id":"dd1e74cea56d2958","type":"function","z":"9feb0d5017d91904","name":"function 3","func":"// Daten aus dem \"chart function node\" für Temperatur\nvar chartDataTemperature = flow.get('chartData') || [];\n\n// Daten aus dem \"usage function node\" für CPU-Auslastung\nvar chartDataUsage = flow.get('usageData') || [];\n\n// Annahme: msg.payload enthält die Temperaturdaten im JSON-Format\n// Hier wird angenommen, dass die Temperatur als Zahl vorliegt\n\n// Neues Array für den kombinierten Chart erstellen\nvar combinedChartData = [];\n\n// Annahme: msg.payload enthält ein Array von Temperaturdaten\nfor (var i = 0; i < msg.payload.length; i++) {\n    // Annahme: msg.payload[i].Timestamp enthält den Zeitstempel\n    // Annahme: msg.payload[i].Value enthält die Temperatur\n    combinedChartData.push({\n        x: msg.payload[i].Timestamp * 1000, // Multiplizieren Sie den Zeitstempel mit 1000, um ihn in Millisekunden umzuwandeln.\n        y: msg.payload[i].Value\n    });\n}\n\n// Fügen Sie die Temperaturdaten zum Array für den kombinierten Chart hinzu\ncombinedChartData.push(...chartDataTemperature);\n\n// Fügen Sie die CPU-Auslastungsdaten zum Array für den kombinierten Chart hinzu\ncombinedChartData.push(...chartDataUsage);\n\n// Die Länge des Arrays auf maximal 60 Einträge begrenzen\nif (combinedChartData.length > 60) {\n    combinedChartData = combinedChartData.slice(-60);\n}\n\n// Erstellen Sie die Chart-Datenstruktur im JSON-Format für den neuen Chart\nvar combinedChartPayload = [\n    {\n        series: [\"Temperatur\", \"CPU Auslastung\"],\n        data: [combinedChartData],\n        labels: [\"Zeit\"],\n    }\n];\n\n// Aktualisieren Sie die Flow-Variablen mit den aktualisierten Daten\nflow.set('combinedChartData', combinedChartData);\n\n// Weisen Sie den Chart-Daten die Nachrichten-Payload zu\nmsg.payload = combinedChartPayload;\n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1280,"y":260,"wires":[["605023dfa492ba31","5d9d0ade23ef9a93"]]},{"id":"605023dfa492ba31","type":"ui_chart","z":"9feb0d5017d91904","name":"","group":"e8c6fdf06e157bcd","order":1,"width":0,"height":0,"label":"CPU-TEMP","chartType":"line","legend":"true","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"1","ymax":"120","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"1","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#00ff00","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"x":1470,"y":260,"wires":[["dd1e74cea56d2958","381db56676b671d6","e3e8989def966284"]]},{"id":"43ef798cac2747a2","type":"mqtt in","z":"9feb0d5017d91904","name":"","topic":"red/cpuusage","qos":"2","datatype":"auto-detect","broker":"a99cad6cfe4753de","nl":false,"rap":true,"rh":0,"inputs":0,"x":130,"y":200,"wires":[["c01088ca1c12cb57","17806628373ccc74","e309bc39b72e3f4b"]]},{"id":"c01088ca1c12cb57","type":"debug","z":"9feb0d5017d91904","name":"debug 12","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":320,"y":260,"wires":[]},{"id":"4d69ad0fdeb8f182","type":"ui_dropdown","z":"9feb0d5017d91904","name":"","label":"Nachrichten auswaehlen","tooltip":"","place":"Select option","group":"aefce03b6158a82d","order":1,"width":0,"height":0,"passthru":true,"multiple":false,"options":[{"label":"","value":"Empfangende Daten fehlerhaft","type":"str"},{"label":"","value":"CPU überhitzt","type":"str"},{"label":"","value":"Übertragungsformat ungültig","type":"str"}],"payload":"","topic":"topic","topicType":"msg","x":390,"y":380,"wires":[["a618946bbf59df43","ca8b45229c19651f"]]},{"id":"2d965e5f99f7a9fc","type":"ui_button","z":"9feb0d5017d91904","name":"","group":"aefce03b6158a82d","order":6,"width":0,"height":0,"passthru":true,"label":"Checken","tooltip":"","color":"","bgcolor":"","icon":"","payload":"control","payloadType":"flow","topic":"topic","topicType":"msg","x":960,"y":380,"wires":[["d1f4194daa2a3117","7b0c83a4884010f0","08b72fee678a9928"]]},{"id":"a618946bbf59df43","type":"change","z":"9feb0d5017d91904","name":"Nachricht-umwandlung","rules":[{"t":"set","p":"control","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":740,"y":380,"wires":[["2d965e5f99f7a9fc","a6d9cf88fe66e5e1"]]},{"id":"d1f4194daa2a3117","type":"mqtt out","z":"9feb0d5017d91904","name":"","topic":"red/control","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"e172cbc91f2d372f","x":1170,"y":380,"wires":[]},{"id":"bd140bdabd7706eb","type":"mqtt in","z":"9feb0d5017d91904","name":"","topic":"red/control","qos":"2","datatype":"auto-detect","broker":"e172cbc91f2d372f","nl":false,"rap":true,"rh":0,"inputs":0,"x":1380,"y":600,"wires":[["e559997eb9e65748","26ee14425b9b731a"]]},{"id":"e559997eb9e65748","type":"ui_toast","z":"9feb0d5017d91904","position":"top right","displayTime":"3","highlight":"","sendall":true,"outputs":0,"ok":"OK","cancel":"","raw":false,"topic":"msg.topic","name":"","x":1580,"y":600,"wires":[]},{"id":"7b0c83a4884010f0","type":"function","z":"9feb0d5017d91904","name":"function 4","func":"// Den Payload auf \">Steuerpaket versendet!\" setzen\nmsg.payload = \">Steuerpaket versendet!\";\n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1160,"y":460,"wires":[["5e4ceba81172d441"]]},{"id":"5e4ceba81172d441","type":"delay","z":"9feb0d5017d91904","name":"","pauseType":"rate","timeout":"5","timeoutUnits":"seconds","rate":"1","nbRateUnits":"5","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":true,"allowrate":true,"outputs":1,"x":1380,"y":440,"wires":[["676fa42186e67f05","b4fc2c45b88a4000"]]},{"id":"676fa42186e67f05","type":"function","z":"9feb0d5017d91904","name":"function 5","func":"// Leeren Payload setzen, um die Anzeige zu löschen\nmsg.payload = \"\";\n\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1580,"y":460,"wires":[["d82433be2c36f6bc","f989298e3cac3bb2"]]},{"id":"d82433be2c36f6bc","type":"ui_text","z":"9feb0d5017d91904","group":"aefce03b6158a82d","order":5,"width":0,"height":0,"name":"","label":"Status","format":"{{msg.payload}}","layout":"row-spread","x":1750,"y":460,"wires":[]},{"id":"6c933531f8484a80","type":"ui_ui_control","z":"9feb0d5017d91904","name":"Klick-Liste","events":"all","x":590,"y":720,"wires":[["161eefb76b931db9","b32132e11e919d28","24a18bf9247f511e","ccf3723bea059331"]]},{"id":"161eefb76b931db9","type":"ui_button","z":"9feb0d5017d91904","name":"","group":"13d2bb0ce29cde20","order":1,"width":0,"height":0,"passthru":true,"label":"Temperatur","tooltip":"","color":"gelb","bgcolor":"","icon":"","payload":"{     \"group\": {         \"hide\": [\"Überblick\", \"Nachrichten\"],         \"show\": [\"Temperatur\"]     } }","payloadType":"json","topic":"topic","topicType":"msg","x":890,"y":720,"wires":[["0b7018fc8a9f5f5a"]]},{"id":"24a18bf9247f511e","type":"ui_button","z":"9feb0d5017d91904","name":"","group":"13d2bb0ce29cde20","order":2,"width":0,"height":0,"passthru":true,"label":"Nachrichten","tooltip":"","color":"red","bgcolor":"","icon":"","payload":"{     \"group\": {         \"hide\": [\"Temperatur\", \"Überblick\"],         \"show\": [\"Nachrichten\"]     } }","payloadType":"json","topic":"topic","topicType":"msg","x":890,"y":880,"wires":[["25cad911a8b23f68"]]},{"id":"b32132e11e919d28","type":"ui_button","z":"9feb0d5017d91904","name":"","group":"13d2bb0ce29cde20","order":3,"width":0,"height":0,"passthru":true,"label":"Ueberblick","tooltip":"","color":"green","bgcolor":"","icon":"","payload":"{     \"group\": {         \"hide\": [\"Temperatur\", \"Nachrichten\"],         \"show\": [\"Überblick\"]     } }","payloadType":"json","topic":"topic","topicType":"msg","x":890,"y":800,"wires":[["ce5b613e5e90f203"]]},{"id":"cd61bb48ecc5fa34","type":"inject","z":"9feb0d5017d91904","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":360,"y":720,"wires":[["6c933531f8484a80","6e1e8ea38ae9dec8"]]},{"id":"ce5b613e5e90f203","type":"debug","z":"9feb0d5017d91904","name":"debug 13","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1320,"y":800,"wires":[]},{"id":"25cad911a8b23f68","type":"debug","z":"9feb0d5017d91904","name":"debug 14","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1300,"y":900,"wires":[]},{"id":"0b7018fc8a9f5f5a","type":"debug","z":"9feb0d5017d91904","name":"debug 15","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1300,"y":720,"wires":[]},{"id":"a6d9cf88fe66e5e1","type":"debug","z":"9feb0d5017d91904","name":"debug 16","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":880,"y":440,"wires":[]},{"id":"b4fc2c45b88a4000","type":"debug","z":"9feb0d5017d91904","name":"debug 17","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1540,"y":500,"wires":[]},{"id":"26ee14425b9b731a","type":"debug","z":"9feb0d5017d91904","name":"debug 18","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1540,"y":640,"wires":[]},{"id":"08b72fee678a9928","type":"debug","z":"9feb0d5017d91904","name":"debug 19","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1160,"y":420,"wires":[]},{"id":"ccf3723bea059331","type":"debug","z":"9feb0d5017d91904","name":"debug 20","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":680,"y":640,"wires":[]},{"id":"6e1e8ea38ae9dec8","type":"debug","z":"9feb0d5017d91904","name":"debug 21","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":560,"y":820,"wires":[]},{"id":"ca8b45229c19651f","type":"debug","z":"9feb0d5017d91904","name":"debug 22","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":580,"y":440,"wires":[]},{"id":"381db56676b671d6","type":"debug","z":"9feb0d5017d91904","name":"debug 23","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1620,"y":240,"wires":[]},{"id":"5d9d0ade23ef9a93","type":"debug","z":"9feb0d5017d91904","name":"debug 24","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1420,"y":220,"wires":[]},{"id":"f989298e3cac3bb2","type":"debug","z":"9feb0d5017d91904","name":"debug 25","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1740,"y":520,"wires":[]},{"id":"f6da6dcc83cffd46","type":"debug","z":"9feb0d5017d91904","name":"debug 26","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1000,"y":240,"wires":[]},{"id":"0738c99136f2e37d","type":"mqtt in","z":"9feb0d5017d91904","name":"","topic":"red/temperatur","qos":"2","datatype":"auto-detect","broker":"a99cad6cfe4753de","nl":false,"rap":true,"rh":0,"inputs":0,"x":140,"y":100,"wires":[["2413395a0bbc22e0","17806628373ccc74","e309bc39b72e3f4b"]]},{"id":"e3e8989def966284","type":"mqtt out","z":"9feb0d5017d91904","name":"","topic":"red/cpuusage","qos":"2","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"e172cbc91f2d372f","x":1700,"y":280,"wires":[]},{"id":"3c50fedf03f9e063","type":"mqtt out","z":"9feb0d5017d91904","name":"","topic":"red/cpuusage","qos":"2","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"e172cbc91f2d372f","x":1280,"y":120,"wires":[]},{"id":"6c3b4a3044a86f14","type":"mqtt in","z":"9feb0d5017d91904","name":"","topic":"red/cpuusage","qos":"2","datatype":"auto-detect","broker":"a99cad6cfe4753de","nl":false,"rap":true,"rh":0,"inputs":0,"x":130,"y":380,"wires":[["4d69ad0fdeb8f182"]]},{"id":"e43e352ac64d29f5","type":"mqtt in","z":"9feb0d5017d91904","name":"","topic":"red/cpuusage","qos":"2","datatype":"auto-detect","broker":"a99cad6cfe4753de","nl":false,"rap":true,"rh":0,"inputs":0,"x":250,"y":580,"wires":[[]]},{"id":"4e64ef64ed0a7940","type":"mqtt in","z":"9feb0d5017d91904","name":"","topic":"red/cpuusage","qos":"2","datatype":"auto-detect","broker":"a99cad6cfe4753de","nl":false,"rap":true,"rh":0,"inputs":0,"x":250,"y":640,"wires":[[]]},{"id":"4621c975af23bd92","type":"mqtt in","z":"9feb0d5017d91904","name":"","topic":"red/control","qos":"2","datatype":"auto-detect","broker":"e172cbc91f2d372f","nl":false,"rap":true,"rh":0,"inputs":0,"x":240,"y":520,"wires":[[]]}]
            
            1 Reply Last reply Reply Quote 0
            • mickym
              mickym Most Active last edited by

              Es tut mir leid - aber so kann und will ich eigentlich auch nicht helfen. Ich hab zwar Deinen Flow importiert - aber ich bekomme keine Daten - ausserdem sind bestimmte Dinge einfach fehlerhaft.

              233d9ee6-e00e-4dd8-a363-a177556c9766-image.png

              Wieso schreibt man cpuusage in ein Textfeld für Temperatur - wie gesagt ich bekomme keine Daten und wenn dann muss sich Deine Fragestellung auf ein konkretes Problem beziehen - aber ich werde nicht einfach diese Aufgabe lösen - zudem ich keine Daten bekomme.

              E 1 Reply Last reply Reply Quote 0
              • E
                Elia @mickym last edited by

                @mickym
                🤒
                unabhängig von der Daten , ich habe Gruppen unter den Tab 'Home' erstellt aber trotzdem im Dashboard wird nur die Gruppe 'Temperatur' gezeigt, die frage ist , wo sind die anderen Gruppen und wie kann man die richtig sichtbar machen ?
                Danke im Voraus
                VG

                mickym 1 Reply Last reply Reply Quote 0
                • mickym
                  mickym Most Active @Elia last edited by mickym

                  @elia Kann ich leider nicht nachvollziehen. Ggf. hast Du irgendwie über die uicontrol mal was versteckt - ich sehe alle Gruppen
                  79bad85b-9237-489d-8c27-e62332c580e1-image.png

                  Du musst halt die Gruppennamen ggf. alle in die ui_control Node einspeisen

                  {
                      "group": {
                          "show": [
                              "Ueberblick",
                              "Nacrichten",
                              "Temperatur"
                          ]
                      }
                  }
                  

                  Aber auch mit den ganzen Rechtschreibfehlern, die Du bei der Erstellung der Gruppen gemacht hast

                  44b33747-a659-4805-ac8a-66347f9a91cc-image.png

                  E 1 Reply Last reply Reply Quote 0
                  • E
                    Elia @mickym last edited by

                    @mickym ach 😥 das wusste vom anfang an dass das bei mir irgendwas nicht stimmt !!

                    das was bei mir sichtbar ist adwd.PNG

                    mickym 1 Reply Last reply Reply Quote 0
                    • mickym
                      mickym Most Active @Elia last edited by mickym

                      @elia Dann erstelle die Gruppen halt nochmal neu (z. Bsp. N_Steuerung, N_Nachrichten etc. ) und sie in den Nodes den neuen Gruppen zu - zum Schluss kannst die alten Gruppen im Dashboard ja wieder löschen und die neuen Gruppen wieder umbenennen.

                      Die Fehler kannst ja auch in den Gruppen beheben:

                      f631f86f-b696-4f29-9e04-0b4e6ca847db-image.png

                      E 1 Reply Last reply Reply Quote 0
                      • E
                        Elia @mickym last edited by

                        @mickym ich schau mal , danke sehr

                        Ichweiss LOL 1 Reply Last reply Reply Quote 0
                        • Ichweiss LOL
                          Ichweiss LOL @Elia last edited by Ichweiss LOL

                          @elia

                          @elia said in Hilfe bei Node Red Aufgabe:

                          @mickym ach 😥 das wusste vom anfang an dass das bei mir irgendwas nicht stimmt !!

                          kann mir jemand auch bei NodeRed weiterhelfen ?
                          Gruß
                          Mellisaas.jpg

                          was hat diese meldung für eine bedeutung... nach jedem Deploy keine Fehlermeldung aber nach einem Neustart von Nodered erscheint das und das passwort der Fritzbox in den einstellungen ist auch raus im Flow

                          mickym 1 Reply Last reply Reply Quote 0
                          • mickym
                            mickym Most Active @Ichweiss LOL last edited by

                            @ichweiss-lol Dein Credentials sind halt weg. du musst halt bei Deinen HomeAssistant in der Server Node wieder erneut ein Token generieren und rein machen bzw. für die FritzBox dein Benutzernamen und Passwort neu eingeben.

                            Ichweiss LOL 1 Reply Last reply Reply Quote 0
                            • Ichweiss LOL
                              Ichweiss LOL @mickym last edited by

                              @mickym said in Hilfe bei Node Red Aufgabe:

                              @ichweiss-lol Dein Credentials sind halt weg. du musst halt bei Deinen HomeAssistant in der Server Node wieder erneut ein Token generieren und rein machen bzw. für die FritzBox dein Benutzernamen und Passwort neu eingeben.

                              in der Server Node ? wo finde ich das und wieso Token, habe ich ja noch nie gemacht.

                              mickym 1 Reply Last reply Reply Quote 0
                              • mickym
                                mickym Most Active @Ichweiss LOL last edited by mickym

                                @ichweiss-lol Na sonst kannst auf HA gar nicht zugreifen. Wie soll das denn sonst gehen? Aber es scheint ja dass Deine HA Node funktioniert. Jedenfalls dann halt in der FritzBox Node auch Deine Anmeldedaten eingeben. Normalerweise kannst Du auf HA gar nicht einfach zugreifen - aber vielleicht hast Du auch andere Nodes. Letztlich musst Du halt überall deine Anmeldedaten neu eingeben.

                                Ichweiss LOL 1 Reply Last reply Reply Quote 0
                                • Ichweiss LOL
                                  Ichweiss LOL @mickym last edited by

                                  @mickym said in Hilfe bei Node Red Aufgabe:

                                  @ichweiss-lol Na sonst kannst auf HA gar nicht zugreifen. Wie soll das denn sonst gehen? Aber es scheint ja dass Deine HA Node funktioniert. Jedenfalls dann halt in der FritzBox Node auch Deine Anmeldedaten eingeben. Normalerweise kannst Du auf HA gar nicht einfach zugreifen - aber vielleicht hast Du auch andere Nodes. Letztlich musst Du halt überall deine Anmeldedaten neu eingeben.

                                  es funktioniert alles wunderbar... nur sobald ich NodeRed neustarte ist das Password nicht mehr drin.

                                  mickym 1 Reply Last reply Reply Quote 0
                                  • mickym
                                    mickym Most Active @Ichweiss LOL last edited by

                                    @ichweiss-lol ist das der Nodered Adapter Du musst halt dann ein fixes Passwort für die Verschlüsselung eingeben, wenn Du NodeRed ohne Adapter betriebst.

                                    Ichweiss LOL 1 Reply Last reply Reply Quote 0
                                    • Ichweiss LOL
                                      Ichweiss LOL @mickym last edited by

                                      @mickym said in Hilfe bei Node Red Aufgabe:

                                      @ichweiss-lol ist das der Nodered Adapter Du musst halt dann ein fixes Passwort für die Verschlüsselung eingeben, wenn Du NodeRed ohne Adapter betriebst.

                                      11111111111111111111111.jpg

                                      ein ADDON auf Home assistant

                                      mickym 1 Reply Last reply Reply Quote 0
                                      • mickym
                                        mickym Most Active @Ichweiss LOL last edited by

                                        @ichweiss-lol Dann musst aber bei HomeAssistant nachfragen, wo die settings.js liegt, wenn Du NodeRed als AddOn im HA installierst.

                                        /*******************************************************************************
                                        * Flow File and User Directory Settings
                                        *  - flowFile
                                        *  - credentialSecret
                                        *  - flowFilePretty
                                        *  - userDir
                                        *  - nodesDir
                                        ******************************************************************************/
                                        
                                           /** The file containing the flows. If not set, defaults to flows_<hostname>.json **/
                                           flowFile: 'flows.json',
                                        
                                           /** By default, credentials are encrypted in storage using a generated key. To
                                            * specify your own secret, set the following property.
                                            * If you want to disable encryption of credentials, set this property to false.
                                            * Note: once you set this property, do not change it - doing so will prevent
                                            * node-red from being able to decrypt your existing credentials and they will be
                                            * lost.
                                            */
                                           credentialSecret:
                                        

                                        Entweder man setzt das auf false, wen HA aber hier selbst immer Credentials setzt dann ist flows_cred.json immer anders verschlüsselt und NodeRed kann das nicht mehr entschlüsseln. Das ist aber dann eine Frage für HomeAssistant und nichts mit NodeRed und auch nicht mit iobroker.

                                        1 Reply Last reply Reply Quote 0
                                        • First post
                                          Last post

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        938
                                        Online

                                        31.7k
                                        Users

                                        79.7k
                                        Topics

                                        1.3m
                                        Posts

                                        node-red
                                        4
                                        18
                                        1391
                                        Loading More Posts
                                        • Oldest to Newest
                                        • Newest to Oldest
                                        • Most Votes
                                        Reply
                                        • Reply as topic
                                        Log in to reply
                                        Community
                                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                        The ioBroker Community 2014-2023
                                        logo