Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie Daten in eine MySQL Datenbank schreiben

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

    Wie Daten in eine MySQL Datenbank schreiben

    Hallo,
    wie genau schreibe ich Daten in eine MySQL Datenbank?
    Ich möchte Temperaturwerte regelmäßig (z.B. aller 15 min) in eine Datenbank schreiben und diese dann als Graf anzeigen zu lassen.
    Nehmen wir an, Datenbank ist durch das Plugin angebunden, MySQL Statement bekomme ich sicher auch hin. Nur wie genau könnte der Befehl dazu aussehen und wo soll es am besten rein (Item, Logik)?
    Könnte mir bitte jemand ein Beispiel dazu geben?

    Ganz lieben Dank
    Gruß Haxley

    #2
    Wieso nutzt Du nicht das Database Plugin?! Oder geht es um das regelmäßige Schreiben? wo ist da der mehrwert?


    https://www.smarthomeng.de/welches-d...-ich-verwenden
    https://www.smarthomeng.de/database-...-mysql-mariadb
    Zuletzt geändert von psilo; 19.12.2018, 10:59.

    Kommentar


      #3

      Wie genau könnte der Befehl aussehen, den Wert (Temperatur) in die DB in regelmäßigen Abständen zu schreiben?
      Könnte mir bitte jemand ein Beispiel dazu geben?

      Ganz lieben Dank!
      Gruß Haxley

      Zuletzt geändert von Haxley; 19.12.2018, 14:27.

      Kommentar


        #4
        Zitat von Haxley Beitrag anzeigen
        (Das Auslesen mach ich übrigens per PHP, das ist kein Problem.)
        Dir ist aber schon bewusst, dass das hier ein smarthomeNG Support-Forum ist, in dem es um shNG und seine Plugins geht - und nicht das php Anfängerforum?

        Im Item:
        Code:
        database: true
        bzw.
        Code:
        database: init
        Fertig. Den Rest macht das SQL Plugin.

        /tom

        Kommentar


          #5
          Es ärgert mich wenn man nicht liest was andere schreiben. Wo liegt Deine Motivation zu antworten? Ich würde das schon fast als SPAM bezeichnen.
          Hää? Das verstehe ich nicht? Ich spamme? Was spamme ich? Wieso lese ich nicht was andere schreiben? Ich habe sehr wohl gelesen, was Du schreibst. Vielleicht war es schlichtweg nicht klar verständlich??

          Nehmen wir an, Datenbank ist durch das Plugin angebunden
          Durch welches Plugin? Deines eigenes? Das InfluxDB Plugin?! Das xyz Plugin?
          Anmerkung: Das Database Plugin bindet in dem Sinne keine Datenbank an. Die Anbindung ist in der Lib db.py unter https://github.com/smarthomeNG/smart...ster/lib/db.py realisiert. Daher ist Dein Satz leider komplett sinnfrei, sorry!!! Das Database Plugin sorgt dafür, dass für Items Werte persistiert werden, also imho genau das, was Du willst.

          Ich hab geschrieben: Temperaturwerte regelmäßig (z.B. aller 15 min) in eine Datenbank schreiben und diese dann als Graf anzeigen zu lassen
          Sind das, was die SV in Verbindung mit SmartHomeNG/Database/Websocket Plugin anzeigt, keine Graphen (siehe screenshot)? Bei jeder Wertänderung wird über das DB Plugin persistiert. Mit enforce_updates auch beim Senden gleicher Werte. Das ist dann zwar nicht "alle 15 Minuten", aber Du hast ja trotzdem die Info, wie lange der Wert gleich geblieben ist. Ich verstehe daher erneut nicht, was Du eigentlich willst. Notfalls setze enfoce_updates und bau ne Logik die alle 15 Minuten sh.item(sh.item()) macht.. Das macht imho aber exakt NULL Sinn.

          graphen.JPG

          PS: Für Dich wäre vermutlich auch die Option influxdb + grafana interessant. Ich werde das jetzt aber nicht im Detail erklären, da mir ehrlich gesagt meine Zeit zu schade ist, für meine Antworten auch noch schief angeschrieben zu werden...

          PPS: jetzt lese ich das auch mit PHP.. Sorry Du bist hier komplett falsch.. Aber Deine Unhöflichkeiten kannst Du Dir trotzdem sparen!
          Zuletzt geändert von psilo; 19.12.2018, 14:04.

          Kommentar


            #6
            Haxley Bitte mäßige Dich im Ton!
            Viele Grüße
            Martin

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

            Kommentar


              #7
              Ich denk hier gab es paar Missverständnisse.
              Zitat von psilo Beitrag anzeigen
              PPS: jetzt lese ich das auch mit PHP.. Sorry Du bist hier komplett falsch.. Aber Deine Unhöflichkeiten kannst Du Dir trotzdem sparen!
              Das war auch nicht angefragt. War nur die Erklärung was dann damit passiert, da es ja unklar war wozu ich das mache.

              Verstehe ich das richtig, dass das Plugin sqlite_visu2_8 dann via Item
              "database: true"bzw. "database: init" die Daten permanent bei jeder Änderung in die DB schreibt? Wo genau wäre das beschrieben wie genau die Spalten heißen müssen und welcher Wert wohin geschrieben wird?
              Gerade bei einer Temperatur würde das natürlich die Datenbank schnell sehr anwachsen lassen.
              Gibts da noch andere Möglichkeiten den Wert nur aller 15 Min in die DB zu schreiben?

              Danke Euch

              Kommentar


                #8
                Verstehe ich das richtig, dass das Plugin sqlite_visu2_8 dann via Item
                "database: true"bzw. "database: init" die Daten permanent bei jeder Änderung in die DB schreibt?
                Nein das verstehst Du teilweise falsch, das sqlite_visu2_8 schreibt nur in eine SQlite Datenbank und nicht über das Itemattribut "database", welches Database-Plugin spezifisch ist.. Nähres steht auch in den README's der Plugins!

                https://github.com/smarthomeNG/plugi...aster/database
                https://github.com/smarthomeNG/plugi...sqlite_visu2_8

                Das Database Plugin HINGEGEN schreibt diese Daten in eine beliebige (sqlite, mysql/mariadb, postgresql, ...) Datenbank (über die von mir genannte Lib) und sollte verwendet werden, da die sqlite Plugin rausfliegen werden.
                Für numerische Werte könnte wie gesagt auch Influxdb (eigenes Plugin) interessant sein.

                https://github.com/smarthomeNG/plugi...aster/influxdb

                Wie man das Database Plugin einrichtet siehst Du in dem von mir oben geposteten Blogartikel. Das Database Plugin legt auch die Tabellenstruktur an. Also brauchst Du keine Beschreibung ,-) Um zu verstehen was Sache ist, reicht nach erzeugen der Datenbank durch das Database Plugin, dort reinzuschauen.. Es gibt nur 2 Tabellen die mit etwas gesundem Menschenverstand zu verstehen sind. Zudem gibt es eine WebGUI für das Database Plugin.

                webgui.JPG

                Struktur:

                dbstruktur.JPG
                Zuletzt geändert von psilo; 19.12.2018, 14:35.

                Kommentar


                  #9
                  Jetzt hab ich es verstanden. Danke Dir und sorry für das Missverständniss.

                  Kommentar


                    #10
                    Hallo Zusammen,

                    schön das ich über den Thread gestolpert bin :-) und etwas über das Database Plugin lese (welches mir vorher nicht so bewusst war), das muss ich mir später mal genau anschauen.

                    Ich hätte aber mal eine Frage, welche auch in Richtung Datenbank geht, da ich mich gerade mit dem Thema und SHNG beschäftige.

                    Zum spielen hab ich einfach mal angefangen die Temperatur meines Raspis in eine MariaDB zu schreiben via Python Skript. Dies hat nun auch endlich funktioniert.
                    Das Skript sollte eigentlich als Logik mit Crontab dann in SHNG laufen. Leider läuft das Skript was ohne SHNG läuft in SHNG nicht.

                    Nun würde mich generell mal interessieren worauf muss man bei python skripten im Zusammenhang mit SHNG achten. Welche besonderheiten gibt es? Ist dies irgendwo beschrieben.

                    Nun zu meinem Code:
                    Code:
                    #/usr/local/smarthome/logics/tempwatch.py
                    #!/usr/bin/env python
                    
                    import os
                    import time #für den Zeitstempel
                    timestr = time.strftime("%d.%m.%Y %H:%M:%S") #der Zeitstempel als String
                    item = "CPU RPI SmartHomeNG"    
                    
                    def measure_temp():
                            temp = os.popen("vcgencmd measure_temp").readline()
                            return (temp.replace("temp=",""))
                            
                    def sqlconnection():
                            import pymysql
                            import pymysql.cursors  
                            connection = pymysql.connect(host='192.168.178.53',           #Hostname
                                                 port=3307,                                                           #Port
                                                 user='tempwatch',                                               #User
                                                 password='XXX',                                                 #Password                          
                                                 db='tempwatch',                                                  #Database
                                                 charset='utf8mb4',
                                                 cursorclass=pymysql.cursors.DictCursor)
                            print ("connect successful!!")
                            with connection:
                                cur = connection.cursor()
                                cur.execute("INSERT INTO tempwatch (item, value) VALUES ('CPU Temp RPI SmartHomeNG', %s)", measure_temp())
                                print ("added values successful!!")
                    
                    sqlconnection()
                    Wie gesagt direkt im Interpreter läuft es, der SHNG Log wirft mir jedoch vor das measure_temp nicht defniert ist:

                    Code:
                    2018-12-20  13:29:01 ERROR    logics.tempwatch  Logic: logics.tempwatch, File: /usr/local/smarthome/logics/tempwatch.py, Line: 26, Method: sqlconnection, Exception: name 'measure_temp' is not defined
                    Traceback (most recent call last):
                      File "/usr/local/smarthome/lib/scheduler.py", line 493, in _task
                        exec(obj.bytecode)
                      File "/usr/local/smarthome/logics/tempwatch.py", line 35, in <module>
                        sqlconnection()
                      File "/usr/local/smarthome/logics/tempwatch.py", line 26, in sqlconnection
                        cur.execute("INSERT INTO tempwatch (item, value) VALUES ('CPU Temp RPI SmartHomeNG', %s)", measure_temp())
                    NameError: name 'measure_temp' is not defined
                    Was Python betrifft so habe ich noch jede Menge Fragezeichen vor meinen Augen, aber würde gerne vestehen auf was ich hier achten muss in Bezug PY und SHNG.
                    Gibt es hier Besonderheiten?

                    Viele Grüße
                    Jannis

                    Kommentar


                      #11
                      Setz doch mal unter dein measure_temp ein logger.info(measure_temp()) und schau ins Log von smarthome. Funzt das? Bei mir nämlich schon.
                      Theoretisch müsste bei Logiken das import in die Funktion rein, aber os ist ohnehin schon mit im Boot, kann man sich also sparen.

                      ABER: Die Logik ist wie in den Beiträgen zuvor erklärt gänzlich überflüssig, wenn du das database plugin mit einem cycle nutzt. Damit der Wert der Temperatur in ein Item geschrieben wird, kannst du dann wieder eine Logik hernehmen oder ein eval.

                      Die Logik würde so aussehen:
                      Code:
                      sh.temperaturitem(os.popen("vcgencmd measure_temp").readline().replace("temp=",""))

                      Kommentar


                        #12
                        Hi Onkelandy , danke für deine Info, das Datebank Plugin hab ich leider noch nicht zum laufen bekommen. (https://knx-user-forum.de/forum/supp...-plugin/page12)
                        Code:
                        2018-12-10 20:43:00 ERROR root Database [Database]: Could not connect to the database: object supporting the buffer API required 2018-12-10 20:43:00 ERROR plugins.database Database: initialization failed: object supporting the buffer API required 2018-12-10 20:44:00 ERROR root Database [Database]: Could not connect to the database: object supporting the buffer API required 2018-12-10 20:44:00 ERROR plugins.database Database: initialization failed: object supporting the buffer API required
                        Nun aber zu o. s. denn auch dies würde ich auch wenn es mit dem DB Plugin nicht benötigt wird gerne rein zum lernen zum laufen bekommen.

                        Wo genau setze ich logger.info(measure_temp()) Einige Versuche haben mich im Log nicht weitergebracht und ich bekomme nach wie vor nur den o. g. Fehler.

                        Viele Grüße & frohe Festtage
                        Jannis

                        Kommentar


                          #13
                          startrix was für ein item willst du da denn schreiben??? falls das type dict oder list ist -> geht nicht!

                          https://www.google.com/search?q=obje...hrome&ie=UTF-8

                          Ansonsten helfen sicherlich Dinge wie 1) Konfiguration des Plugins 2) Verwendete Python Lib 3) Konfiguration der Datenbank und 4) ob Du gleich von Anfang an Items reinschreiben willst, oder die Datenbank erstmal nur ohne Items in die plugin.yaml konfiguriert hast ganz entscheidend bei der Problemlösung..
                          Achja 5: legt er in der Datenbank die 3 Tabellen an, oder ist die Datenbank leer? Das hat schorge im anderen Thread auch nicht wirkl. beantwortet

                          Ausser natürlich, einer der Nutzer hier spendiert mir zu Weihnachten eine funktionierende Glaskugel!
                          Zuletzt geändert von psilo; 23.12.2018, 15:33.

                          Kommentar


                            #14
                            psilo - sobald ich eine funktionierende Glaskugel habe, schick ich dir eine nach München. Versprochen.

                            Deine Antwort bezieht sich auf das Database Plugin, das verstehe ich richtig?

                            Bisher möchte ich noch gar kein Item in die DB über das Plugin schreiben.
                            Ich habe bisher lediglich in der \etc\plugin.yaml folgendes für das DB Plugin konfiguriert:

                            Code:
                            database:
                                class_name: Database
                                class_path: plugins.database
                                driver: pymysql
                                connect:
                                  - host:192.168.178.53
                                  - port:3307
                                  - user:smarthome_db
                                  - 'passwd:12345'
                                  - db:smarthome_db
                                instance: mariadb
                            Wenn ich nun den SmartHomeNG Dienst neustarte bekomme ich diesen Fehler im Log File:
                            Code:
                            2018-12-23  15:08:06 ERROR    root              Database [Database]: Could not connect to the database: object supporting the buffer API required
                            2018-12-23  15:08:06 ERROR    plugins.database  Database: initialization failed: object supporting the buffer API required
                            Was meinst du mit der verwendeten Python Lib 3? Welche Python Version ich nutze?

                            Code:
                             [smarthome@SmartHomeNG ../local/smarthome/logics]$ python --version
                            Python 2.7.13
                             [smarthome@SmartHomeNG ../local/smarthome/logics]$ python3 --version
                            Python 3.5.3
                            Lt. SmartHomeNG Backend wird Python 3 benutzt, oder sehe ich das falsch?
                            Python Version: 3.5.3 final
                            Was möchtest du bzgl. der Konfiguration der Datenbank wissen? Bisher ist nur die Datenbank in Maria DB angelegt und ein User für SmartHome. Es ist noch keine Tabelle angelegt.

                            Viele Grüße Jannis

                            Kommentar


                              #15

                              Was meinst du mit der verwendeten Python Lib 3? Welche Python Version ich nutze?
                              pymysql meine ich damit.

                              Welche Version? Bist du sicher, dass kein einziges Item ein database@mariadb: xyz hat?!

                              Vielleicht gibt es seit neustem Probleme beim initialen Anlegen der Tabellen. Ich teste mal mit frischer db..

                              Kommentar

                              Lädt...
                              X