Ankündigung

Einklappen
Keine Ankündigung bisher.

Werte aus MySQL an smarthome.py übergeben

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

    Werte aus MySQL an smarthome.py übergeben

    Hallo zusammen,



    ich suche nach einer Möglichkeit Werte, die ich mittels python Skript aus einer MySQL-Datenbank ausgelesen und z.T. Weiterverarbeitet habe an smarthome zu übergeben (Zum Verständnis: es handelt sich um Stromaufnahme und Wärmeerzeugung). Diese Werte sollten alle 30 Minuten aktualisiert werden (Kürzeres Intervall möglich, In dem Bereich aber wenig sinnvoll).

    Ich denke ich muss eine items.conf anlegen die in etwa so aussehen wird:

    Code:
    [Zaehlerstaende]
        [[wphtakt]]
            name = aktueller Zählerstand WP HT
            type = num
        [[wpntakt]]
            name = aktueller Zählerstand WP NT
            type = num
        [[wphtbw]]
            name = Zählerstand WP HT vor einer Woche
             type = num
    .
    .
    .
    Wie kann ich aber die Werte aus meinem Auswerteskript nun an die Items binden und aktualisieren? Kann ich das mit einer Logic machen, und wie muss diese aufgebaut sein. Hier noch das Skript zum Auslesen der Datenbank.

    Code:
    #! /usr/bin/python
    from datetime import datetime
    from time import *
    import time
    import MySQLdb
    #channel id = 3 ist Waermepumpe HT id = 4 Waermepumpe NT
    #Variablendefinition
    dt = datetime.now()
    lt = localtime()
    year, month, day = lt[0:3]
    dtyearbegin = datetime(year, 1, 1)
    utakt = time.mktime(dt.timetuple()) * 1000
    utminusweek = utakt - (7 * 86400000)
    utminusmonth = utakt - (30 * 86400000)
    utminusyear = utakt - (365 * 86400000)
    utyearbegin = time.mktime(dtyearbegin.timetuple()) * 1000
    UTYearBegin = str(utyearbegin)
    UTminusWeek = str(utminusweek)
    UTminusMonth = str(utminusmonth)
    UTminusYear = str(utminusyear)
    UTakt = str(utakt)
    
    print("UTminusYear:" , UTminusYear)
    print("UTYearBegin:" , UTYearBegin)
    
    connection = MySQLdb.connect(
         host="127.0.0.1",
         db="database",
         user="user", passwd="passwd"
        )
    cursor = connection.cursor()
    
    
    
    
    #Stromzaehler WP zu den Zeitpunkten jetzt, vor einer Woche, Vor einem Monat, Jahresbeginn auslesen
    cursor.execute("""SELECT * FROM `data` where `timestamp` > """ + UTminusMonth + """ and channel_id = 4 order by `timestamp` asc limit 1""")
    ergebnis = cursor.fetchone()
    id, channel_id, timestamp, value = ergebnis[0:4]
    WPNTutminusmonth = value
    cursor.execute("""SELECT * FROM `data` where `timestamp` > """ + UTminusWeek + """ and channel_id = 4 order by `timestamp` asc limit 1""")
    ergebnis = cursor.fetchone()
    id, channel_id, timestamp, value = ergebnis[0:4]
    WPNTutminusweek = value
    cursor.execute("""SELECT * FROM `data` where `timestamp` < """ + UTakt + """ and channel_id = 4 order by `timestamp` desc limit 1""")
    ergebnis = cursor.fetchone()
    id, channel_id, timestamp, value = ergebnis[0:4]
    WPNTutakt = value
    cursor.execute("""SELECT * FROM `data` where `timestamp` > """ + UTminusYear + """ and channel_id = 4 order by `timestamp` asc limit 1""")
    ergebnis = cursor.fetchone()
    id, channel_id, timestamp, value = ergebnis[0:4]
    WPNTutminusyear = value
    cursor.execute("""SELECT * FROM `data` where `timestamp` > """ + UTYearBegin + """ and channel_id = 4 order by `timestamp` asc limit 1""")
    ergebnis = cursor.fetchone()
    id, channel_id, timestamp, value = ergebnis[0:4]
    WPNTutyearbegin = value
    
    cursor.execute("""SELECT * FROM `data` where `timestamp` > """ + UTminusMonth + """ and channel_id = 3 order by `timestamp` asc limit 1""")
    ergebnis = cursor.fetchone()
    id, channel_id, timestamp, value = ergebnis[0:4]
    WPHTutminusmonth = value
    cursor.execute("""SELECT * FROM `data` where `timestamp` > """ + UTminusWeek + """ and channel_id = 3 order by `timestamp` asc limit 1""")
    ergebnis = cursor.fetchone()
    id, channel_id, timestamp, value = ergebnis[0:4]
    WPHTutminusweek = value
    cursor.execute("""SELECT * FROM `data` where `timestamp` < """ + UTakt + """ and channel_id = 3 order by `timestamp` desc limit 1""")
    ergebnis = cursor.fetchone()
    id, channel_id, timestamp, value = ergebnis[0:4]
    WPHTutakt = value
    cursor.execute("""SELECT * FROM `data` where `timestamp` > """ + UTminusYear + """ and channel_id = 3 order by `timestamp` asc limit 1""")
    ergebnis = cursor.fetchone()
    id, channel_id, timestamp, value = ergebnis[0:4]
    WPHTutminusyear = value
    cursor.execute("""SELECT * FROM `data` where `timestamp` > """ + UTYearBegin + """ and channel_id = 3 order by `timestamp` asc limit 1""")
    ergebnis = cursor.fetchone()
    id, channel_id, timestamp, value = ergebnis[0:4]
    WPHTutyearbegin = value


    Vielen Dank für die Hilfe!



    Stefan
    Zuletzt geändert von himself; 03.11.2016, 18:15.

    #2
    Du kannst in einer Logik beliebigen Pythoncode verwenden. Den Wert des Items setzt Du dann z.B. so:
    PHP-Code:
    cursor.execute("""SELECT * FROM `data` where `timestamp` > """ UTminusMonth """ and channel_id = 4 order by `timestamp` asc limit 1""")
    ergebnis cursor.fetchone()
    sh.Zaehlerstaende.wphtakt(ergebnis
    Die Items musst Du natürlich vorher anlegen.
    Die Datei speicherst Du dann unter logics/mysqlabfrage.py in etc/logic.conf musst Du dann noch die logic noch aufführen, z.B. so:
    PHP-Code:
    [mysqlabfrage]    
    filename mysqlabfrage.py    
    cycle 
    1800 
    cycle gibt die Dauer in Sekunden an, die zwischen zwei Aufrufen liegen, in diesem Fall wären es 30 Minuten.
    Zuletzt geändert von Marcov; 03.11.2016, 14:08.

    Kommentar


      #3
      So einfach kann es sein. Danke Marcov!

      Kommentar


        #4
        Also wenn Dir das zu einfach ist, dann mache doch ein Plugin, kannst dann in einem Item jeweils in einem Parameter eine SQL Abfrage eintragen und das Item wird dann automatisch abgefragt:
        https://github.com/mknx/smarthome/wi...ugin-5-minutes

        Kommentar


          #5
          Da glaube ich hast du mich falsch verstanden. Die Lösung war einfach und ziemlich straight forward. Drauf gekommen bin ich trotzdem nicht :-). Sollte ich also ein plugin dazu erstellen wollen würde mein nächster Thread hier wohl nicht lange auf sich warten lassen...

          Kommentar

          Lädt...
          X