Ankündigung

Einklappen
Keine Ankündigung bisher.

Plugin: InfluxDB für schicke Charts mit Grafana

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #31
    @all: wobei man schauen muss, es gibt noch ein weiteres plugin zu dem thema, ich habe aber nur deines relativ schnell zum laufen bekommen. entweder bauen wir beide ein oder machen nen switch. was denkt der rest?

    Kommentar


      #32
      habe das udp influx plugin erweitert, bin gerne bereit zu mergen

      Kommentar


        #33
        hotzen wäre sicher das beste dass ich das andere nicht ohne aufwand benutzen konnte lag meines erachtens daran, dass bei dem standard docker image von influxdb den udp port nicht offen hatte und dort nicht rumkonfiguieren wollte..

        Kommentar


          #34
          Zitat von psilo Beitrag anzeigen
          @all: wobei man schauen muss, es gibt noch ein weiteres plugin zu dem thema, ich habe aber nur deines relativ schnell zum laufen bekommen. entweder bauen wir beide ein oder machen nen switch. was denkt der rest?
          Genau, es gibt noch das UDP-basierte influxdata. Das läuft nach meiner Erfahrung auf Dauer stabiler als meine Version. Von der Konfiguration her ist es allerdings für bestimmte Nutzergruppen schwieriger aufzusetzen.
          Vielleicht kann man ja beide mergen und per config switch umschalten.
          Zuletzt geändert von bmx; 10.04.2017, 08:05.

          Kommentar


            #35
            Was heisst stabiler? Gibt es refactoring Bedarf bei den http callouts? Ist da schon was bekannt, das man beim mergen beachten sollte?

            Kommentar


              #36
              Ich habe folgenden vorschlag

              das man auch in dem plugin das senden via http unterstützt ich habe das mal so bei mir eingebaut. HTTP hat den riesen vorteil das es im Fehlerfall den grund des Fehlers zurückgibt.

              Hintergrund ich habe 3 devices Stromzähler a 60 Metriken die ich alle 10s abfrage das will ich nicht in 180 udp packeten über die items sondern über 3 HTTP calls
              dazu baue ich mir einen langen string mit den daten zusammen und schicke in rüber 3-4kb das hat mit udp irgentwie bei mir nicht so recht funktioniert.

              Code:
                  def __init__(self, smarthome, host='localhost', udp_port=8089, http_port=8086, keyword='influxdb', tags={}, fields={}, value_field='value', influxdb='smarthome'):
                      self.logger = logging.getLogger(__name__)
                      self.logger.info('Init InfluxDB')
              
                      self.host = host
                      self.udp_port = udp_port
                      self.http_port = http_port
                      self.influxdb = influxdb
                      self.keyword = keyword
                      self.tags = tags
                      self.fields = fields
                      self.value_field = value_field
                      self.item_config = {}
              
              ...
              
              def sendhttp( self, data ):            
                      url_string = 'http://{}:{}/write?db=smarthome'.format( self.host, self.http_port, self.influxdb )
                      r = requests.post(url_string, data=data)
                      if( r.status_code != 204 ):
                          self.logger.error( "InfluxDB: request returns http {} [{}]".format(r.status_code, r.text))

              Kommentar


                #37
                Hallo,

                ich habe gerade das Influx Plugin und Grafana nach Anleitung installiert und ausprobiert.
                (Eigentlich habe ich es schon vor langer Zeit, aber ich habe es nicht zuende gebracht).
                Ich finde in Grafana auch tatsächlich Einträge (Items) aus smarthome.py. Allerdings enthalten diese keine Daten.

                Ist es möglich, das Plugin gesprächiger zu machen?
                Oder habt ihr eine andere Idee, wie ich dem Problem auf den Grund gehen kann?
                Die Verbindung mit Influx scheint prinzipiell ja sowohl von sh.py als auch von Grafana aus zu funktionieren.

                Gruß,
                Hendrik

                Kommentar


                  #38
                  Hi,

                  ich würde erst mal schauen ob Daten in der DB ankommen.

                  In der Doku steht wie man CLI aufruft und einen Select macht.
                  https://docs.influxdata.com/influxdb...tting-started/

                  um rauszufinden was geschickt wird. Würde ich mir noch ein logausgabe
                  in die send methode temporär ein logging einbauen.

                  def send( self, data )
                  self.logger.debug( "InfluxDB: sending {}".format(data) )
                  ....


                  VG
                  Jürgen
                  Zuletzt geändert von heckmannju; 11.05.2018, 08:28.

                  Kommentar


                    #39
                    Hallo,

                    danke!
                    Ich bin nicht sicher, ob wir das gleiche Plugin nutzen. Die Methode send habe ich nicht.
                    Unten habe ich mal meinen code angefügt
                    Im log sehe ich:
                    Code:
                    2018-05-13  12:07:21 DEBUG    Scheduler    InfluxDB next time: 2018-05-13 12:07:31+02:00
                    2018-05-13  12:07:31 DEBUG    Scheduler    InfluxDB next time: 2018-05-13 12:07:41+02:00
                    2018-05-13  12:07:33 INFO     logics.UVR   InfluxDB: sending item Haustechnik.UVR.Kollektortemp with value 85.5
                    2018-05-13  12:07:33 INFO     logics.UVR   InfluxDB: sending item Haustechnik.UVR.Aussentemp with value 30.5
                    2018-05-13  12:07:33 INFO     logics.UVR   InfluxDB: sending item Haustechnik.UVR.Solarstr with value 793
                    2018-05-13  12:07:33 INFO     logics.UVR   InfluxDB: sending item Haustechnik.UVR.T_Speicher_2 with value 70.2
                    2018-05-13  12:07:33 INFO     logics.UVR   InfluxDB: sending item Haustechnik.UVR.T_Speicher_3 with value 69.6
                    2018-05-13  12:07:33 INFO     logics.UVR   InfluxDB: sending item Haustechnik.UVR.T_Speicher_4 with value 43.4
                    2018-05-13  12:07:41 DEBUG    Scheduler    InfluxDB next time: 2018-05-13 12:07:51+02:00
                    2018-05-13  12:07:51 DEBUG    Scheduler    InfluxDB next time: 2018-05-13 12:08:01+02:00
                    2018-05-13  12:08:01 DEBUG    Scheduler    InfluxDB next time: 2018-05-13 12:08:11+02:00
                    2018-05-13  12:08:11 DEBUG    Scheduler    InfluxDB next time: 2018-05-13 12:08:21+02:00
                    2018-05-13  12:08:21 DEBUG    Scheduler    InfluxDB next time: 2018-05-13 12:08:31+02:00
                    2018-05-13  12:08:31 DEBUG    Scheduler    InfluxDB next time: 2018-05-13 12:08:41+02:00
                    Ich habe jetzt auch die InfluxDB einmal gelöscht. Ich sehe darin tatsächlich diese Items.
                    Dennoch werden am Graphen keine Werte gezeigt :-(

                    Ich weiß nicht, wie die Syntax für die CLI für meinen Fall aussieht.
                    In der Doku werden ja erst Werte gesetzt und dann abgefragt.
                    Mir fehlt das Äquivalent zu
                    Code:
                     SELECT "host", "region", "value" FROM "cpu"
                    Kannst du mir bitte ein Beispiel geben?

                    Gruß&Danke,
                    Hendrik
                    Zuletzt geändert von henfri; 13.05.2018, 12:05.

                    Kommentar


                      #40
                      In deinem plugin heißt die Methode udp. Kann dir nicht weiter helfen habe Urlaub.

                      Kommentar


                        #41
                        Hallo,

                        Urlaub geht vor ;-)
                        Vielleicht kann mir jemand anderes helfen?
                        Nur zur Sicherheit: Ich nutze dieses Plugin:
                        Code:
                        #!/usr/bin/env python3
                        #########################################################################
                        #  Copyright 2015 Sebastian Kuhn                  sebastian@derseppel.net
                        #########################################################################
                        #  This file is part of SmartHome.py.    http://mknx.github.io/smarthome/
                        #
                        #  SmartHome.py is free software: you can redistribute it and/or modify
                        #  it under the terms of the GNU General Public License as published by
                        #  the Free Software Foundation, either version 3 of the License, or
                        #  (at your option) any later version.
                        #
                        #  SmartHome.py is distributed in the hope that it will be useful,
                        #  but WITHOUT ANY WARRANTY; without even the implied warranty of
                        #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                        #  GNU General Public License for more details.
                        #
                        #  You should have received a copy of the GNU General Public License
                        #  along with SmartHome.py. If not, see <http://www.gnu.org/licenses/>.
                        #########################################################################
                        
                        import logging
                        from influxdb import InfluxDBClient
                        
                        
                        logger = logging.getLogger('')
                        
                        
                        class InfluxDB():
                          def __init__(self, smarthome, influx_host='localhost', influx_port=8086, influx_user='root', influx_pass='root', influx_db='smarthome', influx_keyword='influxdb', influx_update_cyle=10 ):
                            logger.warn('Init InfluxDB')
                            self._sh = smarthome
                            self.influx_host = influx_host
                            self.influx_port = influx_port
                            self.influx_user = influx_user
                            self.influx_pass = influx_pass
                            self.influx_db = influx_db
                            self.influx_keyword = influx_keyword
                            self.influx_update_cyle = influx_update_cyle
                            self.client = None
                            self._items = []
                        
                            # connect to DB
                            self.client = InfluxDBClient(self.influx_host, self.influx_port, self.influx_user, self.influx_pass, self.influx_db)
                            logger.debug("InfluxDBClient("+self.influx_host+", "+str(self.influx_port)+", "+self.influx_user+", "+self.influx_pass+", "+self.influx_db+")")
                            # check if database already exists, if not - create it
                            exists = False
                            dbs = self.client.get_list_database()
                            for db in dbs:
                              if db['name'] == self.influx_db:
                                exists = True
                        
                            if exists == False:
                              logger.debug('Database' + self.influx_db + ' does not exist, creating it.')
                              self.client.create_database( self.influx_db)
                            else:
                              logger.debug('Database' + self.influx_db + ' exists')
                        
                        
                          def run(self):
                            self.alive = True
                            self._sh.scheduler.add('InfluxDB', self._update_values, prio=5, cycle=self.influx_update_cyle)
                        
                          def stop(self):
                            self.alive = False
                        
                          def parse_item(self, item):
                            if self.influx_keyword in item.conf:
                              if item.type() not in ['num', 'bool']:
                                logger.debug("InfluxDB: only supports 'num' and 'bool' as types. Item: {} ".format(item.id()))
                                return
                              self._items.append(item)
                              return self.update_item
                        
                        
                          def update_item(self, item, caller=None, source=None, dest=None):
                            logger.info( "InfluxDB: sending item {0} with value {1}".format(item.id(),item()) )    
                            json_body = [
                            {
                                "measurement": item.id(),
                                "tags": {
                                    "caller": caller,
                                },
                                "fields": {
                                    "value": float(item())
                                }
                            }
                            ]
                            self.client.write_points(json_body)    
                            return None
                        
                          def _update_values(self):
                            return None
                        Anbei noch ein Screenshot aus Grafana.

                        Gruß,
                        Hendrik
                        Angehängte Dateien

                        Kommentar


                          #42
                          Da du die Datenpunkte in Grafana auswählen kannst sollten auch daten vorhanden sein, allerdings zeigt Grafana nur was an, wenn in dem ausgewählten Zeitraum auch Daten gesendet wurden.

                          Wie oft werden deine Temperaturen von der UVR in die Datenbank geschrieben ?
                          z.B: in deinem Logfile sieht man, dass um 12:07:33 Daten in die Datenbank geschrieben wurden, in deinem Grafana Fenster hast du aber einen Zeitraum von 10 min, der erst um 12:19 anfängt, wenn in diesen 10 Minuten keine Daten gesendet werden zeigt Grafana auch nichts an. also entweder Zeitraum vergrößern, oder evtl. mit den Wertdarstellungen etwas experimentieren. Wenn man z.B: nur ein/aus Telegramme visualisieren möchte wie z.B. Pumpen dann hilft es auch, wenn man im select bereich immer den ersten Datenwert anzeigen läßt.

                          Hier zum vergleich meine Werte von der UVR. Ich hab allerdings einen CAN-KNX Adapter von Ta.Co.at verbaut, der mir die Daten im Minutentakt auf den KNX und auch somit in die Datenbank schreibt.



                          Angehängte Dateien

                          Kommentar


                            #43
                            Scheint unzählige Varianten von diesem plugn zu geben....

                            Kommentar


                              #44
                              Deshalb habe ich die Umfrage gestartet. 3 unterschiedliche Influx Plugins kenne ich. Vermutlich gibt es davon noch Derivate.

                              Eine Konsolidierung wäre vermutlich für alle hilfreich.
                              Viele Grüße
                              Martin

                              There is no cloud. It's only someone else's computer.

                              Kommentar


                                #45
                                Zitat von Mike01 Beitrag anzeigen
                                Wie oft werden deine Temperaturen von der UVR in die Datenbank geschrieben ?
                                Alle 300s.
                                Ich habe jetzt mal auf den ganzen Tag rausgezoomt. Hat aber auch nicht geholfen.

                                den Wertdarstellungen etwas experimentieren. Wenn man z.B: nur ein/aus Telegramme visualisieren möchte wie z.B. Pumpen dann hilft es auch, wenn man im select bereich immer den ersten Datenwert anzeigen läßt.
                                Es sind auf jeden Fall Temperatur-Werte die geloggt werden. Da sollten also einige Werte vorhanden sein. Ansonsten siehst du keinen Fehler in meiner Anzeige?
                                Was meinst du mit "immer den ersten Datenwert anzeigen"?


                                Hier zum vergleich meine Werte von der UVR. Ich hab allerdings einen CAN-KNX Adapter von Ta.Co.at verbaut, der mir die Daten im Minutentakt auf den KNX und auch somit in die Datenbank schreibt.
                                Den Adapter habe ich auch. Aber für's auslesen funktioniert mein Plugin gut. Und den BC-E zu konfigurieren macht keinen Spaß. ;-)

                                Gruß,
                                Hendrik

                                Kommentar

                                Lädt...
                                X