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. NodeRED Logging mit InfluxDB 2.0

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    NodeRED Logging mit InfluxDB 2.0

    This topic has been deleted. Only users with topic management privileges can see it.
    • mickym
      mickym Most Active @mike1976 last edited by mickym

      @mike1976 Ehrlich gesagt - verstehe ich nicht was Du meinst oder was Du willst - und ob Du das Prinzip verstanden hast.

      Wenn Du Ausgaben filtern willst, dann musst Du dich mit der Flux Sprache ab Version 2 - da bin ich ganz schlecht. Kannst Du aber ggf. die Syntax aus der GUI ermitteln.

      Ansonsten definierst Du das measurement in der Node selbst. Du kannst dann in dem measurement - je nachdem wieviel unterschiedliche Arten Du misst - das designen. Du könntest zwar 2 Felder verwenden - aber eigentlich würde man ggf. besser designen - nur die Temperatur und den Ort.

      Also überleg Dir alle Felder die mit jeder Nachricht kommen und nutze lieber Tags für den Ort. Time ist unsinnig, weil diese ja in einer Influx-DB automatisch enthalten ist.

      Wenn ein Gerät zum Beipsiel temperatur und luftfeuchtigkeit misst, dann hast Du als Felder Luftfeuchtigkeit und Temperatur, als Tag zum Beispiel den Ort.

      Die Filter in der GUI sind missverständlich.

      Measurement - ist vielmehr die Art der Messung und der Typ des Gerätes
      Field = Felder die von einem Gerät kommen
      Tag = frei definierbar - könnte Dein Ort sein, woher das Gerät kommt.

      Das ganze wird dann über 2 Arrays wie beschrieben definiert. Felder sind also Messungen, Tags haben beschreibenden Charakter. Hier ein Beispiel:

      71896a65-e2e9-4d83-b8b9-19781fa5416c-image.png

      measurement = ist quasi Deine Tabelle
      field = sind Spalten/Felder in der Tabelle - hier Temperatur, Luftfeuchtigkeit
      tag = Raum (frei beschreibbar) um Messungen zu gruppieren.

      M 1 Reply Last reply Reply Quote 0
      • M
        mike1976 @mickym last edited by mike1976

        @mickym
        hm... Also die Filter machen mich fertig 🙂
        measurement sollte doch eigentlich die Mess/Einheit sein.

        Okay habe gerade dein Beispiel gestestet, kommt so ca. hin.
        measurement ist eindeutig 2 deutig 🙂

        Ich logge auf einem Anderen Pi werte (auch mit Node-red) da schreibe sie aber in eine Textdatei, diese importiere ich 1x täglich per telegraf in Influx.
        Da habe ich mir die Textdatei (Syntax) so zusammen gebaut:

        "ms/sec" + "," + "Info=" + "log1" + "," + "Ort=" + "Dach" + "," + "Gerät=" + "" + " " + "L3=" + l3 + " "
        

        da legt Influx Brav die Filter so an, dachte mit Node-Red direkt bringe ich das auch rüber.

        Wollte es bei diesem Pi direkt Testen mit der Influx-node (wegen echtzeit log)
        Aber mit deinem Vorschlag/Lösung kann ich zur not auch leben.

        Danke für deine schnelle Antwort.
        LG

        Bezüglich Timestamp, da hast natürlich recht, war noch vom Testen drinn.

        Bin noch beim Testen um die Optimale Lösung zu finden.

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

          @mike1976 Wie gesagt - ist einfacher - wenn Du Deine Textdatei postest bzw. die Daten um einen vernünftigen Vorschlag zu machen.

          M 1 Reply Last reply Reply Quote 0
          • M
            mike1976 @mickym last edited by mike1976

            @mickym
            so sieht es mit der Textdatei aus:

            influx home.png

            man sieht dann auch schön die Beschriftung in dem Graph.

            so sieht die datei aus:
            Leistung Zuhaus Tag-2024-02-12.txt

            Hoffe es ist jetzt besser verstädlich.

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

              @mike1976 Na bei dem Gesamt bin ich mir nicht sicher. Aber ich denke ich würde wohl bei dieser Konstellation,

              w,Info=1min,Ort=Zuhause,Standort=VerteilerEG L3=156.2 1707692455004000000
              w,Info=1min,Ort=Zuhause,Standort=VerteilerEG L2=5 1707692460008000000
              w,Info=1min,Ort=Zuhause,Standort=VerteilerEG L1=132.2 1707692460008000000
              w,Info=1min,Ort=Zuhause,Standort=VerteilerEG gesammt=293.4 1707692460008000000
              

              wenn nur gesammt, L1-L3 und was dahinter steht ist wohl ein timestamp und kann ignoriert werden - die anderen Teile würde ich als tags verwenden. Ich probiere mal einen kleinen Flow- um das mit einer InjectNode zu simulieren.

              M 1 Reply Last reply Reply Quote 0
              • M
                mike1976 @mickym last edited by mike1976

                @mickym
                den timestamp brauche ich ja nur in der textdatei damit influx weis wann der wert geloggt wurde.
                Das Format des timestamp ist in diesem fall "ns" da influx standart bei text file import "ns" hat.

                Habe jetzt mal folgende funktin getestet:

                msg.topic="InfluxData"
                let l1=global.get('leistung_l1')
                let l2=global.get('leistung_l2')
                let l3=global.get('leistung_l3')
                let gesammt=global.get('leistung')
                let time=global.get('timestamp')
                
                msg.payload= [
                
                        {
                        "L1": l1,
                        "L2": l2,
                        "L3": l3,        
                        "Gesammt": gesammt
                        },
                        {
                        "Info": "1min",
                        "Ort": "Zuhause",
                        "Standort": "VerteilerEG"
                
                        }]       
                
                
                
                return msg;
                

                Ergebins:

                influx home 2.png

                Kommt der Sache Schon sehr nahe 🙂

                Danke für deinen Denk anstoß

                LG

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

                  @mike1976 Genau - das sollte es sein nur ist ja Dein l1, l2 etc. in unterschiedl. Datensätzen - ich werde mal was versuchen ohne function nodes.

                  Schau mal, ob Dir der Flow hilft:

                  cde12446-1ce3-43cc-bb70-9b3fda88d2f6-image.png

                  [{"id":"d3afebbee1d3ec66","type":"inject","z":"5ad55a7b0d4580eb","name":"trigger","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":170,"y":2380,"wires":[["5b6cb80943fdfd9c"]]},{"id":"5b6cb80943fdfd9c","type":"template","z":"5ad55a7b0d4580eb","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"w,Info=1min,Ort=Zuhause,Standort=VerteilerEG L3=156.2 1707692455004000000\nw,Info=1min,Ort=Zuhause,Standort=VerteilerEG L2=5 1707692460008000000\nw,Info=1min,Ort=Zuhause,Standort=VerteilerEG L1=132.2 1707692460008000000\nw,Info=1min,Ort=Zuhause,Standort=VerteilerEG gesammt=293.4 1707692460008000000","output":"str","x":320,"y":2380,"wires":[["49edc1b856184d32","a12ffaac172399ff"]]},{"id":"49edc1b856184d32","type":"debug","z":"5ad55a7b0d4580eb","name":"Input","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":490,"y":2340,"wires":[]},{"id":"a12ffaac172399ff","type":"csv","z":"5ad55a7b0d4580eb","name":"","sep":" ","hdrin":"","hdrout":"none","multi":"mult","ret":"\\n","temp":"tags,data,ts","skip":"0","strings":true,"include_empty_strings":"","include_null_values":"","x":490,"y":2380,"wires":[["8d3b69a0890d633e"]]},{"id":"f0189a352393d30a","type":"debug","z":"5ad55a7b0d4580eb","name":"Array for Influx","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":920,"y":2320,"wires":[]},{"id":"8d3b69a0890d633e","type":"change","z":"5ad55a7b0d4580eb","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.{\t   \"measurement\":\"textfile\",\t   \"fields\":{\t       $split(data,\"=\")[0]: $split(data,\"=\")[1]\t   },\t   \"tags\":{\t       \"Info\":(tags~>/Info=(.*?),/).groups[0],\t       \"Ort\":(tags~>/Ort=(.*?),/).groups[0],\t       \"Standort\":(tags~>/Standort=(.*)/).groups[0]\t   },\t   \"timestamp\":ts\t}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":670,"y":2380,"wires":[["f0189a352393d30a","ad7e3d4485de600e"]]}]
                  

                  hier ist der Link zum Ausprobieren von JSONATA: https://try.jsonata.org/1Ec_JbVT_
                  mit Deinen Daten aus der CSV Node:

                  c792e0af-2ff0-4c9c-a6d2-4a962dfb0934-image.png

                  Evetuell musst Du dann die Influx Batch Node verwenden, wenn Du den timestamp mit geben willst.

                  5b290b9f-8f7e-463b-a387-10ab53bea459-image.png

                  Dann muss allerdings das Objekt komplexer dargestellt werden. Bin mir nicht sicher aber ich ändere den Flow nochmal mit dem timestamp für die Batchverarbeitung.

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

                    So hier mal ein Flow um Deine Textdaten mit Übernahme der Timestamps via Batch Node (die braucht man wohl, um den Timestamp zu übernehmen)

                    f3ab6717-dff6-4f8b-a275-797c60154b29-image.png

                    Hier der Flow:

                    de4c01ef-05f4-4e13-86e0-84a625eefbfc-image.png
                    Wichtig ist, dass Du bei Dein Timestamp mit der Einheit in der Node stimmt also bei Dir anscheinend Nanosekunden:

                    9d7ebcc2-bea2-4cbd-87a7-5fa243d99cdc-image.png

                    Und hier zum Import:

                    [{"id":"108b7d476c65f996","type":"inject","z":"5ad55a7b0d4580eb","name":"trigger","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":210,"y":2540,"wires":[["08d0613c649c80b4"]]},{"id":"08d0613c649c80b4","type":"template","z":"5ad55a7b0d4580eb","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"w,Info=1min,Ort=Zuhause,Standort=VerteilerEG L3=156.2 1707692455004000000\nw,Info=1min,Ort=Zuhause,Standort=VerteilerEG L2=5 1707692460008000000\nw,Info=1min,Ort=Zuhause,Standort=VerteilerEG L1=132.2 1707692460008000000\nw,Info=1min,Ort=Zuhause,Standort=VerteilerEG gesammt=293.4 1707692460008000000","output":"str","x":360,"y":2540,"wires":[["acbcf020990f69a3","10e58d987e9b5665"]]},{"id":"acbcf020990f69a3","type":"debug","z":"5ad55a7b0d4580eb","name":"Input","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":530,"y":2500,"wires":[]},{"id":"10e58d987e9b5665","type":"csv","z":"5ad55a7b0d4580eb","name":"","sep":" ","hdrin":"","hdrout":"none","multi":"mult","ret":"\\n","temp":"tags,data,ts","skip":"0","strings":true,"include_empty_strings":"","include_null_values":"","x":530,"y":2540,"wires":[["084a40eb306c40db"]]},{"id":"084a40eb306c40db","type":"change","z":"5ad55a7b0d4580eb","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.{\t \"measurement\":\"textfile\",\t \"fields\":{\t $split(data,\"=\")[0]: $split(data,\"=\")[1]\t },\t \"tags\":{\t \"Info\":(tags~>/Info=(.*?),/).groups[0],\t \"Ort\":(tags~>/Ort=(.*?),/).groups[0],\t \"Standort\":(tags~>/Standort=(.*)/).groups[0]\t },\t \"timestamp\":ts\t}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":710,"y":2540,"wires":[["aea41aa4fef0a8eb"]]},{"id":"aea41aa4fef0a8eb","type":"debug","z":"5ad55a7b0d4580eb","name":"Array for Influx","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":960,"y":2480,"wires":[]}]
                    

                    Es sieht jedenfalls so aus, als ob der timestamp damit übernommen wird:

                    1cbc1584-ad79-4243-ba62-e09a2fdf6eb3-image.png

                    Der Vollständigkeit nochmal das JSONATA zum Spielen: https://try.jsonata.org/vg-2ha01s

                    Das mit dem leeren Standort ist im Exportcode bereits korrigiert

                    M 1 Reply Last reply Reply Quote 0
                    • M
                      mike1976 @mickym last edited by

                      @mickym
                      Hallo, sorry erst jetzt wieder Zeit gehabt.

                      Vielen Dank für dein Test Flow.
                      Leider ist anscheinend bei der Kommunikation was danebengegangen.

                      Ich lese nicht die Textdatei ein, die wird separat gespeichert. Das war nur ein Muster wie Influx die daten annimmt.

                      Ich schreiben die Werte jetzt, sowie du im oberen Post von mir sehen kannst, in der Funtkion, direkt von einer Globalen Variable in Flux rein.

                      Aber alles gut, mit der Funktion geht es eigentlich genau so wie ich das haben will.

                      Wieso bist du eigentlich so gegen die Funktion-Node?

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

                        @mike1976 sagte in NodeRED Logging mit InfluxDB 2.0:

                        Wieso bist du eigentlich so gegen die Funktion-Node?

                        Weil Du im Prinzip einen kompletten Flow in Javascript in eine function Node packen kannst und du damit den Sinn von Node Red der grafischen Programmierung mit seinen Debugging Möglichkeiten ad absurdum führst. Viel Spaß bei Debuggen in einer Function Node. Außerdem ist JSONATA so genial - dass Du damit ein Viertel des Codes brauchst, den Du mit Javascript brauchst.

                        Es gibt bestimmte Funktionen, wie den NodeKontext, das nutzen externen NodeJS Module oder asynchrone Verarbeitung für die man function Nodes braucht und es sinnvoll ist, diese zu nutzen. Alles andere geht mit Standardnodes einfacher, kürzer insbesondere mit der genialen JSONATA implementierung.

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        1.1k
                        Online

                        31.7k
                        Users

                        79.7k
                        Topics

                        1.3m
                        Posts

                        4
                        14
                        1140
                        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