Beispiel: Loxone mit node-red auf rPi 3, influxDB und grafana (Visu)

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Xenobiologist
    Lox Guru
    • 15.01.2016
    • 1116

    Beispiel: Loxone mit node-red auf rPi 3, influxDB und grafana (Visu)

    Hallo,

    um den Thread im HowTo bzgl. node-red nicht weiter zu strapazieren, mache ich mal einen eigenen auf.
    Ich habe ein wenig mit node-red und Loxone experimentiert. (Dashboard, FTP, Ausführen von Skripten, etc.)

    Bei diesem Flow habe ich folgende Frage:
    Ich schreibe derzeit 6 Werte exemplarisch in die influxDB. Jede Kennzahl bekommt seinen eigenen Namen bei "Measurement".
    Jetzt wird vermutlich 6 x in die DB geschrieben. Wenn dies stimmt, dann würde ich gern die Speicherkarte entlasten und alle Werte auf einmal schreiben.
    Leider reichen meine Javascript-Kenntnisse noch nicht aus um in einem function-node alle msg.payloads zu einem Array zu vereinen und dann gesammelt an den influxDB-node zu übergeben.
    Hat dies schon mal jemand gemacht? Ist das der richtige Weg?

    Danke!

    So long,
    Mega

    Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
    https://www.loxforum.com/forum/germa...d-grafana-visu
    Mit Loxone einen Windows-PC steuern:
    https://www.loxforum.com/forum/faqs-...indows-steuern
  • Programie
    Dumb Home'r
    • 30.08.2016
    • 27

    #2
    Wow, danke fuer den genialen Tipp mit InfluxDB/Grafana!

    Von Grafana habe ich vorher schon gehoert, aber als ich das gesehen habe musste ich es direkt mal selbst ausprobieren.

    Ich habe das jetzt bei mir so gemacht, dass ich alle Temperaturwerte mit einer einzigen "Stream in" Node aus dem Miniserver auslese. Ich denke mal, damit hat man dann nur einen Request statt fuer jeden Sensor jeweils einen Requests. Zwischen der InfluxDB-Node und der "Stream in" Node habe ich dann noch eine Function-Node gepackt, welche aus der Payload aus der "Stream in" Node entsprechende Tags fuer InfluxDB erstellt.

    Die Funktion sieht so aus:

    Code:
    if (msg.state == "value") {
        return {
            payload: [
                {
                    value: msg.payload
                },
                {
                    room: msg.room,
                    name: msg.topic
                }
            ]
        };
    }
    Das ganze habe ich jetzt schon ein paar Tage aktiv und sieht bisher echt gut aus. Soetwas habe ich lange gesucht!

    Kann man eigentlich auch irgendwie die bisherigen Statistikdaten die aktuell noch auf der SD Karte vom Miniserver liegen in die InfluxDB schreiben?
    Angehängte Dateien

    Kommentar


    • pmayer
      pmayer kommentierte
      Kommentar bearbeiten
      Anmerkung: Es gibt beim Websocket keine "Requests" ;-) Es ist immer ein Event, was gefangen wird. Auf dem Socket bleibt es sich also egal ob du alle Events mit stream-in oder 5 x control-in fängst.
  • Xenobiologist
    Lox Guru
    • 15.01.2016
    • 1116

    #3
    Ja, man kann auch historische Werte in die DB schreiben. Es gibt viele Möglichkeiten, aber du musst natürlich deine Daten auf das neue Format mappen.
    Ein Object zu bauen in dem alle Werte stehen hatte ich auch überlegt.
    Wenn du jetzt allerdings e.g. 7 Werte per StreamIn node holst und wegschreiben willst, dann bekommst du Werte zu unterschiedlichen Zeiten geliefert, oder eben immer alle.
    Das muss synchronisiert werden, oder nicht?
    Entweder du schreibst bei einer Änderung alle Werte weg oder du wartest
    Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
    https://www.loxforum.com/forum/germa...d-grafana-visu
    Mit Loxone einen Windows-PC steuern:
    https://www.loxforum.com/forum/faqs-...indows-steuern

    Kommentar

    • Programie
      Dumb Home'r
      • 30.08.2016
      • 27

      #4
      Zitat von Xenobiologist
      Ja, man kann auch historische Werte in die DB schreiben. Es gibt viele Möglichkeiten, aber du musst natürlich deine Daten auf das neue Format mappen.
      Also die Dateien von der SD Karte nehmen und "von Hand" (per Script) in die InfluxDB schreiben? Also geht es nicht per Miniserver Websocket + Node-RED?

      Zitat von Xenobiologist
      Wenn du jetzt allerdings e.g. 7 Werte per StreamIn node holst und wegschreiben willst, dann bekommst du Werte zu unterschiedlichen Zeiten geliefert, oder eben immer alle.
      Das muss synchronisiert werden, oder nicht?
      Entweder du schreibst bei einer Änderung alle Werte weg oder du wartest
      Bei mir funktioniert das so. Ich verwende die einfache "InfluxDB out" Node und nicht die Batch Variante davon. Dadurch werden zwar mehrere Requests an die InfluxDB gesendet, aber finde ich immer noch besser als mehrere Requests an den Miniserver. Der Miniserver soll sich auf andere Dinge konzentrieren.
      Immer wenn sich der Temperaturwert aendert wird ein (oder auch mehrere wenn sich die Werte von verschiedenen Sensoren geaendert haben) Request an die InfluxDB geschickt. Damit hatte ich bisher aber noch keine Probleme. Wobei meine InfluxDB auch nicht auf einem kleinen Raspberry Pi oder so laeuft sondern auf einem "richtigen" Server der etwas mehr Power hat als der rpi.

      Deine aktuelle Variante schreibt ja auch mit mehreren Requests die Werte in die InfluxDB.
      Zuletzt geändert von Programie; 12.12.2017, 21:27.

      Kommentar

      • Xenobiologist
        Lox Guru
        • 15.01.2016
        • 1116

        #5
        Hmmh, kann man so oder so sehen.
        In meiner Variante wird derzeit 1 zu 1 alles durchgereicht. Wenn sich an einem der Bausteine z.B. die Temperatur ändert wird dieser in die DB geschrieben.
        Bei dir würde ich jetzt vermute, dass eine Änderung an einem Bausteien das Wegschreiben von allen Werten zu diesem Zeitpunkt bewirkt oder?
        Selbst wenn du keine Änderung in anderen Räumen hattest siehst du in Grafana einen neuen Eintrag.

        Richtig? Wenn nicht, dann ist die Lösung besser.

        Zum Schreiben der historischen Daten. Ob nun per Node oder Skript, du musst auf jeden Fall das Mapping machen.
        Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
        https://www.loxforum.com/forum/germa...d-grafana-visu
        Mit Loxone einen Windows-PC steuern:
        https://www.loxforum.com/forum/faqs-...indows-steuern

        Kommentar

        • Programie
          Dumb Home'r
          • 30.08.2016
          • 27

          #6
          Es werden nur die Werte die sich aendern weggeschrieben. Kann man am besten in Grafana sehen wenn man unter "Metrics" fill(none) verwendet (ich habe es sonst auf "fill(previous)") und "Points" als Draw Mode verwendet. Da sind die Punkte nicht alle zur gleichen Zeit sondern jeweils da wo der Sensor die Daten geliefert hat und er sich auch geaendert hat.

          Kommentar

          • Programie
            Dumb Home'r
            • 30.08.2016
            • 27

            #7
            Hab jetzt mal schnell ein kleines Python Script zusammengebastelt welches die Statistiken vom Miniserver in die InfluxDB importiert. Es ist zwar ziemlich Quick 'n Dirty, aber es funktioniert soweit.

            Wenn das Script noch jemand brauchen kann, hier ist es: https://gist.github.com/Programie/65...e4cc0bad16e8c6 (Edit: https://gitlab.com/Programie/LoxoneStats2InfluxDB)
            Zuletzt geändert von Programie; 04.06.2018, 23:39. Grund: GitHub -> GitLab

            Kommentar

            • Gast

              #8
              Hallo,

              vielen Dank für deine Skript, genau nach so etwas habe ich gesucht, aber leider...

              ...funktioniert das Skript bei mir nicht. Bei mir läuft alles auf einem Raspberry PI und ich habe zuerst den Influxdbclient installiert (sudo apt-get install python-influxdb). Das Skript bleibt an der Stelle hängen, an der die Daten in die Datenbank geschrieben werden.

              Läuft das Skript auch unter Windows?

              Wäre schön, wenn du mir weiterhelfen kannst!

              Gruß,

              Markus Assigal

              Kommentar

              • Programie
                Dumb Home'r
                • 30.08.2016
                • 27

                #9
                Du meinst es wird nur "Writing values into measurement '...' with tags ..." ausgegeben und weiter geht es nicht?

                Du koenntest in dem Script in Zeile 57 vor die for-Schleife noch ein "print" reinbauen um zu sehen ob es bis dahin kommt oder davor schon haengt. Wenn es dann davor schon haengt funktioniert schon der /stats call auf den Miniserver nicht.

                Ansonsten wirft Python ja auch einen Stacktrace raus wenn du das Script mit Ctrl+C abbrichst, wo war Python dann genau im Script? Vielleicht hilft das bei der Fehlersuche weiter.

                Ist eben, wie ich es schon geschrieben habe, nur ein Quick 'n Dirty Script welches ich mal eben schnell zusammengeschrieben hab. 😉

                Kommentar

                • Gast

                  #10
                  Hallo,

                  ich habe in zwei Stellen eine Print Anweisung eingefügt, die auch ausgeführt wird (siehe nachfolgenden Auszug aus deinem Programmcode). Ich habe den Screenshot von der Ausführung angefügt. Da ich Laie auf dem Gebiet bin, sagt mir das sehr wenig :-(

                  Vielleicht hast du noch einen Tipp.

                  Gruß,

                  Markus


                  Hier der Auszug aus deinem Code mit meinen Print Anweisungen:

                  def import_stats():
                  try:
                  file_response = requests.get("http://{}/stats/{}".format(miniserver_host, file_name), auth=(miniserver_user, miniserver_password))
                  file_response.raise_for_status()

                  tree = ElementTree.fromstring(file_response.content)

                  json = []
                  print("Beginn For")
                  for stat in tree.iter("S"):
                  time_string = stat.get("T")
                  value_string = stat.get("V")

                  time = datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S").strftime("%Y-%m-%dT%H:%M:%SZ")

                  json.append({
                  "measurement": map_entry["measurement"],
                  "tags": map_entry["tags"],
                  "time": time,
                  "fields": {
                  "value": float(value_string)
                  }
                  })
                  print("Beginn DB")
                  influxdb_client.write_points(json)

                  print("Data written")
                  except KeyboardInterrupt:
                  raise
                  except:
                  print("Exception occured, retrying...")
                  import_stats()

                  Kommentar


                  • Programie
                    Programie kommentierte
                    Kommentar bearbeiten
                    Das Script haengt wohl beim Parsen vom XML. Ist es vielleicht so gross, dass das eine Weile dauert?

                    Du meintest ja auch, du verwendest das auf einem Raspberry Pi. Dann wuerde ich dem Script mal etwas Zeit geben.
                • Xenobiologist
                  Lox Guru
                  • 15.01.2016
                  • 1116

                  #11
                  Wie wäre es mit einem eigenen Thread: Statistken aus dem Miniserver auslesen und bearbeiten?
                  Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
                  https://www.loxforum.com/forum/germa...d-grafana-visu
                  Mit Loxone einen Windows-PC steuern:
                  https://www.loxforum.com/forum/faqs-...indows-steuern

                  Kommentar


                  • Programie
                    Programie kommentierte
                    Kommentar bearbeiten
                    Ist das nicht genau das gleiche Thema wie du das mit diesem Thread gestartet hast? ;-)
                    Ich sehe da aktuell keinen Sinn dabei einen zweiten Thread zum gleichen Thema zu erstellen.

                  • Xenobiologist
                    Xenobiologist kommentierte
                    Kommentar bearbeiten
                    Na ja, der Thread geht um Loxone mit influxDB und Grafana. Der UseCase war Statistiken. Jetzt geht es aber mehr darum, wie mit Statistiken umgegangen wird. Export --> Import. Würde sagen, dein Skript ist eine mögliche Variante, um alte Statistiken mit in den UseCase aufzunehmen.
                    Aber egal :-) Lassen wir es laufen und schauen mal wo es hinführt :-)

                  • Programie
                    Programie kommentierte
                    Kommentar bearbeiten
                    In dem Thread geht es darum wie man die Daten vom Miniserver in die InfluxDB bekommt um diese mit Grafana visuell darzustellen.
                    Mein Script macht ja auch soetwas: Daten vom Miniserver (in diesem Fall die Statistikdaten statt die direkten Sensordaten) werden in die InfluxDB geschrieben um diese mit Grafana visuell darzustellen.

                    Ich habe das Script ja auch nur hier verlinkt, da ich nicht extra dafuer einen neuen Thread aufmachen wollte ("Hab hier ein Script passend zum Thema im anderen Thread.")...

                    Aber ja, mal schauen wo es hinfuehrt. Das ganze waere vielleicht auch ein guter Artikel im Loxwiki. :-)
                • crouser7
                  Extension Master
                  • 06.06.2016
                  • 111

                  #12
                  Ich bin eurer Unterhaltung gespannt gefolgt und werde so etwas in den nächsten Wochen wenn mein Miniserver online geht auch mal versuchen aufzusetzen.
                  Aber wie sieht es damit aus das so etwas vielleicht als generisches Plugin im Loxberry integriert würde?

                  Kommentar

                  • Xenobiologist
                    Lox Guru
                    • 15.01.2016
                    • 1116

                    #13
                    Was genau soll den im Loxberry laufen? Eine Statistikexportfunktion, oder alles zusammen?
                    Export Statistiken und Import in eine influxDB und Bereitstellung von Grafana?
                    Node-RED mit influxDB und Grafana - z.B. Statistiken auslagern:
                    https://www.loxforum.com/forum/germa...d-grafana-visu
                    Mit Loxone einen Windows-PC steuern:
                    https://www.loxforum.com/forum/faqs-...indows-steuern

                    Kommentar

                    • crouser7
                      Extension Master
                      • 06.06.2016
                      • 111

                      #14
                      Das einfachste wäre natürlich alles. Ist nur die Frage wie viel Aufwand das ist.
                      Ich hätte optimaler Weise gesagt es gäbe eine Oberfläche in welcher Man die zu loggenden Werte auswählen kann. Für den letzten Teil vom Thread mit dem Import wäre es nätürlich ein Traum wenn ein Import auch über die Oberfläche möglich wäre.
                      Vielleicht noch als kleines Extra, die InfluxDB wird dann ja vermutlich auf einem Raspberry laufen, vielleicht wäre es cool wenn es eine Option gäbe von der DB ein Backup auf einen FTP Server oder dergleichen zu legen.

                      Kommentar


                      • Programie
                        Programie kommentierte
                        Kommentar bearbeiten
                        Wenn Bedarf an solch einem Importscript, wie ich das schon schnell zusammengeschrieben habe, besteht, wuerde ich das Script auch noch etwas verbessern. Zum Beispiel sollte das Script selbst rausfinden welche Statistiken es gibt und diese dann entsprechend in die InfluxDB importieren. Man muesste dem Script dann nur noch die Daten vom Miniserver und die der InfluxDB geben.
                        Das ganze koennte man dann in ein Loxberry Plugin packen und ueber das Frontend ausfuehrbar machen.
                    • crouser7
                      Extension Master
                      • 06.06.2016
                      • 111

                      #15
                      Damit hätte man dann eine gut aussehende Alternative zur Loxone Statistik die vor allem auch nicht die SD Karte belastet.

                      Kommentar

                      Lädt...