Ankündigung

Einklappen
Keine Ankündigung bisher.

Item in MySQL-Befehl

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

    Item in MySQL-Befehl

    Hallo zusammen,

    ich möchte täglich in eine seperate MySQL-Tabelle bestimmte Werte von SmarthomeNG-Items schreiben.

    Hierzu habe ich folgende Logik angelgt und möchte nun beispielhaft das Item stromzaehler.hh.zaehlerstand_ht in die Datenbank schreiben. Ich bekomme das Item nicht in den SQL-Befehl eingefügt bzw. es wird immer die Bezeichnung, aber nicht der Wert des Items eingefügt. Die Werte "10" dienen nur als Platzhalter, diese sollen ebenfalls mit SmarthomeNG-Items befüllt werden.

    Hat jemand einen Tipp, wie ich das Item in das Script einfügen kann? Leider bin ich nicht so der Python-Spezialist und habe bisher noch keinen Hinweis gefunden, wie ich es korrekt eintragen kann.

    Code:
    #!/usr/bin/env python3
    # aufzeichnung.py
    
    import mysql.connector
    
    cnx = mysql.connector.connect(user='***', password='***',
    host='localhost',
    database='smarthome')
    cur = cnx.cursor()
    cur.execute("INSERT INTO `aufzeichnung` (`datum`, `strom_hh`, `strom_emob`, `strom_hh-emob`, `strom_wp_ht`, `strom_wp_nt`, `wp_stunden`, `wp_starts`, `wp_wm`, `wetter_at`, `wasser`) VALUES ('2023-05-30', 'sh.stromzaehler.hh.zaehlerstand_ht()', '10', '10', '10', '10', '10', '10', '10', '10', '10');")
    cnx.commit()
    cnx.close()​
    Auszug aus dem Logfile:
    Code:
    2023-05-30 23:53:18 ERROR logics.aufzeichnung Logic: logics.aufzeichnung, File: /home/smarthome/.local/lib/python3.7/site-packages/mysql/connector/connection.py, Line: 824, Method: _handle_result, Exception: 1366 (22007): Incorrect integer value: 'sh.stromzaehler.hh.zaehlerstand_ht()' for column `smarthome`.`aufzeichnung`.`strom_hh` at row 1
    > Traceback (most recent call last):
    > File "/usr/local/smarthome/lib/scheduler.py", line 640, in _task
    > exec(obj.bytecode)
    > File "/usr/local/smarthome/logics/aufzeichnung.py", line 12, in <module>
    > cur.execute("INSERT INTO `aufzeichnung` (`datum`, `strom_hh`, `strom_emob`, `strom_hh-emob`, `strom_wp_ht`, `strom_wp_nt`, `wp_stunden`, `wp_starts`, `wp_wm`, `wetter_at`, `wasser`) VALUES ('2023-05-30', 'sh.stromzaehler.hh.zaehlerstand_ht()', '10', '10', '10', '10', '10', '10', '10', '10', '10');")
    > File "/home/smarthome/.local/lib/python3.7/site-packages/mysql/connector/cursor.py", line 615, in execute
    > self._handle_result(self._connection.cmd_query(stm t))
    > File "/home/smarthome/.local/lib/python3.7/site-packages/mysql/connector/connection.py", line 1046, in cmd_query
    > result = self._handle_result(self._send_cmd(ServerCmd.QUERY , query))
    > File "/home/smarthome/.local/lib/python3.7/site-packages/mysql/connector/connection.py", line 824, in _handle_result
    > raise get_exception(packet)
    > mysql.connector.errors.DataError: 1366 (22007): Incorrect integer value: 'sh.stromzaehler.hh.zaehlerstand_ht()' for column `smarthome`.`aufzeichnung`.`strom_hh` at row 1​

    #2
    Hi,

    ich würde es eh so lösen wie auch in den offiziellen Examples beschrieben:

    a) Query anlegen mit Platzhalter für die Werte
    b) Cursor ausführen mit Parameter 1 => Query, Parameter 2 => Daten

    Achte auf die Zeile mit Cursor.execute.
    Viel Spaß bei testen.


    from __future__ import print_function
    from datetime import date, datetime, timedelta
    import mysql.connector

    cnx = mysql.connector.connect(user='scott', database='employees')
    cursor = cnx.cursor()

    tomorrow = datetime.now().date() + timedelta(days=1)

    add_employee = ("INSERT INTO employees "
    "(first_name, last_name, hire_date, gender, birth_date) "
    "VALUES (%s, %s, %s, %s, %s)")

    data_employee = ('Geert', 'Vanderkelen', tomorrow, 'M', date(1977, 6, 14))

    # Insert new employee
    cursor.execute(add_employee, data_employee)
    emp_no = cursor.lastrowid

    # Make sure data is committed to the database
    cnx.commit()

    cursor.close()
    cnx.close()​
    Anbei der Link:
    https://dev.mysql.com/doc/connector-...ansaction.html

    Kommentar


      #3
      Hasenradball: Vielen Dank für den Hinweis.

      Ich habe den Code entsprechend angepasst, so funktioniert es.



      Code:
      #!/usr/bin/env python3
      # aufzeichnung.py
      
      from __future__ import print_function
      from datetime import date, datetime, timedelta
      import mysql.connector
      
      cnx = mysql.connector.connect(user='***', password='***',
      host='***.***.***.***',
      database='smarthome')
      cursor = cnx.cursor()
      
      
      add_employee = ("INSERT INTO aufzeichnung "
      "(`strom_hh`, `strom_emob`, `strom_hh-emob`, `strom_wp_ht`, `strom_wp_nt`, `wp_stunden`, `wp_starts`, `wp_wm`, `wetter_at`, `wasser`, `pv_erzeugung`)"
      "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)")
      
      data_employee = (sh.stromzaehler.hh.zaehlerstand_ht(),sh.stromzaeh ler.emob.zaehlerstand(), sh.stromzaehler.emob.wirkleistung(), sh.stromzaehler.wp.zaehlerstand_ht(), sh.stromzaehler.wp.zaehlerstand_nt(), sh.ebus.wp.status.betriebsstunden(), sh.ebus.wp.status.starts(), sh.ebus.wp.werte.fbh_vl_ist(), sh.Wettervorhersage.heute.null_bis_sechs.temperatu r(), sh.wasser.zaehlerstand(), sh.pv.zaehlerstand_erzeugung())
      
      # Insert new employee
      cursor.execute(add_employee, data_employee)
      
      # Make sure data is committed to the database
      cnx.commit()
      
      cursor.close()
      cnx.close()​

      Kommentar


        #4
        Hi,

        ist ja eine gute Nachricht, wenn es funktioniert.
        Ein Hinweis noch.
        Bei so vielen Daten verwende ich meist immer eine sogenannte stored procedure.
        Diese arbeitet bei großen Datenmengen etwas effizienter als der Insert Befehl.

        Grüße

        Kommentar

        Lädt...
        X