Jump to content

[Python] Messwerte aus dem Callback weiter verwenden


FD

Recommended Posts

Hallo zusammen,

 

folgende Frage:

Ich würde gerne die Messwerte, die ich über die Callback Funktion erhalte weiter bearbeiten. Sprich: Ich schließe zum Beispiel einen IR-Temperatur-Sensoren sowie einen Temperatur-Sensor an und möchte den Durchschnitt davon berechnen. Dieser Durchschnitt soll sich natürlich zusammen mit den Callback-Werten ebenfalls aktualisieren. Kann mir einer helfen? Stehe wirklich auf dem Schlauch. Vielen Dank! ;D

#!/usr/bin/env python
# -*- coding: utf-8 -*-

HOST = "localhost"
PORT = 4223
UID1 = "oed" # Change XYZ to the UID of your OLED 64x48 Bricklet
UID2 = "co2" # Change XYZ to the UID of your CO2 Bricklet
UID3 = "Temp" # Change XYZ to the UID of your Temperature Bricklet


from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_oled_64x48 import BrickletOLED64x48
from tinkerforge.bricklet_co2 import BrickletCO2
from tinkerforge.bricklet_temperature import BrickletTemperature


   
def cb_temperature(temperature):
        print(str(temperature/100))


def cb_co2_concentration(co2_concentration):
            print(str(co2_concentration))

## dieser Wert X soll sich zum Beispiel an die callbacks anpassen
X = co2_concentration+ (temperature/100)
print (x)
    

if __name__ == "__main__":
    ipcon = IPConnection() # Create IP connection
    oled = BrickletOLED64x48(UID1, ipcon) # Create device object
    co2 = BrickletCO2(UID2, ipcon) # Create device object
    t = BrickletTemperature(UID3, ipcon) # Create device object
    
    
    ipcon.connect(HOST, PORT) # Connect to brickd
    # Don't use device before ipcon is connected

   

    co2.register_callback(co2.CALLBACK_CO2_CONCENTRATION, cb_co2_concentration)
    co2.set_co2_concentration_callback_period(1000)

    
    t.set_temperature_callback_period(1000)
    t.register_callback(t.CALLBACK_TEMPERATURE, cb_temperature)
       
  
    co2_concentration = co2.get_co2_concentration()
    print(str(co2_concentration))

    temperature = t.get_temperature()
    print(str(temperature/100.0))
   
    
    input("Press key to exit\n")
    
    ipcon.disconnect()
    
  

 

Link zu diesem Kommentar
Share on other sites

Ja mei, da fügst du halt eine kleine Funktion ein, die den Durchschnittswert errechnet, jedes Mal, wenn der Callback einen neuen Wert liefert. Python hat im statistics- Modul (https://docs.python.org/3/library/statistics.html) die Funktion mean() zur Ermittlung des Durchschnitts. Also zuerst bei den imports einfügen:

 

from statistics import mean

 

mean() nimmt als Parameter eine Liste von Daten, also kannst du unten in deinem Programm, nach der Definition der Callbacks eine Zeile wie diese einfügen:

 temp_vals = [t.get_temperature()/100]

Damit hast du den Startwert gleich in die Liste eingefügt.

Dann die Callback-Funktion wie hier abändern:

def cb_temperature(temperature):
    print(temperature/100)
    temp_curr = (temperature / 100)
    temp_vals.append(temp_curr)
    calc_avg(temp_vals)

Der aktuelle Wert der Temperatur bekommt eine Variable und die wird an die Liste gehängt. Danach der Aufruf der folgenden Funktion, die den Durchschnitt aus dem alten Durchschnitt und dem aktuellen Wert errechnet:

def calc_avg(temp_vals):
    temp_avg = mean(temp_vals)
    temp_vals = [temp_avg]
    print('Durchschnitt:', temp_avg)

 

Der aktuelle Durchschnitt überschreibt anschließend die Liste für Verwendung im nächsten Callback.

Soweit im Ansatz. Die Frage ist allerdings, wie sinnvoll so ein mitlaufender Durchschnittswert ist. Sinnvoller wäre es vielleicht, die letzten x Werte zur Berechnung zu verwenden, oder die aus einem bestimmten Zeitraum.

Das hier geht allerdings gar nicht:

## dieser Wert X soll sich zum Beispiel an die callbacks anpassen
X = co2_concentration+ (temperature/100)
print (x)

x und X passen nicht zusammen, und co2 und temperatur zu addieren ist unsinnig. Ich denke, du musst programmiermäßig und mathematisch (was die Durchschnittsgeschichten betrifft) noch etwas (oder einiges) an Basisarbeit leisten...

md

 

Link zu diesem Kommentar
Share on other sites

Hallo MacDUff,

 

erstmal Danke für deine ausführliche Erklärung.

 

Leider wurde die Frage wahrscheinlich zu schlecht formuliert:

Es geht mir darum, dass ich mit den unterschiedlichsten Messwerte (Hier als Beispiel Temperatur und CO2 brauche, aber für meine Auswertung noch weitere Messwerte wie Luftfeuchtigkeit, IR Temperatur etc.)

Über die Callback Funktion kann ich mir ja jeden Messwert ausgeben lassen, der sich nach einer bestimmten Zeit bei einer Änderung aktualisiert.

 

Wenn ich jedoch einen anderen Ausgabewert haben will, der sich aus den Messwerten zusammenstellt (z.B: PMV = Luftfeuchtigkeit/Lufttemperatur + 20, ja das macht keinen Sinn ^^) komme ich auf keine Lösung.

Dieser Wert soll sich natürlich simultan anpassen, wenn sich in dem Fall die Luftfeuchtigkeit oder Lufttemperatur ändert und soll ausgegeben werden.

 

Vielen vielen Dank! Und ja ich tue mir echt schwer mit dem Programmieren =/

 

Zum Thema Durchschnittswert: Hier bin ich noch auf der Suche nach einer Möglichkeit, ähnlich wie im Beispiel der Wetterstation einen Durchschnitts/Max/Min Wert der aufgenommenen Messwerte darstellen zu lassen, vll kann mir hier auch noch einer helfen.

Link zu diesem Kommentar
Share on other sites

Tja, ich fürchte, ich kann nicht ganz folgen. 'PMV' kenne ich nicht; aber klar kannst du bei jedem Callback auch andere Messdaten abfragen (wie z.B. mit t.get_temperature()) und dann deine Berechnungen machen und die Resultate ausgeben.

Minima und Maxima etc. aus Wetterdaten zu extrahieren ist nicht schwierig -- in Python gibt es die eingebauten Funktionen min() und max() --, aber dafür brauchst du halt ein gewisses Python-Handwerkszeug... du musst die Daten aufbereiten, aufzeichnen, auswerten. Eine Ruckzuck-Komplett-Lösung für so etwas kann dir hier niemand geben. Also hol dir ein gutes Lehrbuch und ran. In Detailfragen wird man dir hier gerne weiterhelfen.

md

Link zu diesem Kommentar
Share on other sites

Ja mit den Min/Max muss ich mich erst noch auseinandersetzen  :o

 

Aber nochmal kurz auf das Thema mit der Messdatenberechnung zurückzukommen:

 

Ziel soll es sein, einen Wert Y zu erhalten, der sich aus den Messwerten Temp und CO2 ergibt (Ja dies ist wirklich nur ein fiktives Beispiel, ohne Bedeutung der Variablen).

Dieser Wert Y soll jedes mal ausgegeben werden, wenn sich ein Messwert ändert, also entweder die Temp oder der CO2 Wert.

Im folgend dargestellten Code habe ich das Problem, dass der Wert Y immer nur dann ausgegeben wird, wenn sich auch die Temperatur ändert. Wenn die Temperatur konstant bleibt und sich der CO2 Wert ändert, bekomme ich so leider keine Ausgabe.

 

Bitte bitte ich komme einfach nicht weiter :D

def cb_temperature(temperature):
        
        print (str(temperature/100))
        x= co2.get_co2_concentration()
        print ("CO2 in cb_temp " + str(x))
        y = x + (temperature/100)
        print ("Y " + str(y))
        
       
def cb_co2_concentration(co2_concentration):
            print(str(co2_concentration))

Beispiel.JPG.433b9219019c2b701183b18c950bf7df.JPG

Link zu diesem Kommentar
Share on other sites

Na, das ist doch simpel: Du musst nur von jeder involvierten Callback-Funktion einen Aufruf zu der Funktion setzen, die die erwünschte Ausgabe produziert (wie in meinem Beispiel). Da holst du per xxx.get_temperature() oder yyy.get_co2() oder zzz.get_wasauchimmer() aktuelle Werte von den Sensoren, verarbeitest die und gibst sie per print() aus. Eh voila.

Oder du lässt das mit den callbacks ganz und machst es mit Timer.

md

Link zu diesem Kommentar
Share on other sites

Jeder Sensorwert lässt sich zu jedem Zeitpunkt abfragen; sieh dir dazu die API des jeweiligen Sensors an (da wo das Beispielprogamm kopiert hast). Jede Callbackfunktion wird bei Änderung eines Zustands aktiv, aber auch bei fest eingestellten Callback Periods. Im Code unten machen die beiden Callback-Funktionen nichts anderes als die Funktion output() aufzurufen, und die aktualisiert die Sensorwerte auf die beiden Variablen, die dann (warum bloß) auf x addiert werden, und das x wird per print() ausgegeben...

 

Hier bitte:

 

PORT = 4223
UID2 = "co2" 
UID3 = "Temp"

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_co2 import BrickletCO2
from tinkerforge.bricklet_temperature import BrickletTemperature


def cb_temperature(temperature):
        output()

def cb_co2_concentration(co2_concentration):
        output()

def output():
    co2_concentration = co2.get_co2_concentration()
    temperature = t.get_temperature()

    x = co2_concentration + (temperature/100)
    print (x)
   

if __name__ == "__main__":
    ipcon = IPConnection()
    co2 = BrickletCO2(UID2, ipcon) 
    t = BrickletTemperature(UID3, ipcon)
      
    ipcon.connect(HOST, PORT)
      co2.register_callback(co2.CALLBACK_CO2_CONCENTRATION, cb_co2_concentration)
    co2.set_co2_concentration_callback_period(1000)
    t.set_temperature_callback_period(1000)
    t.register_callback(t.CALLBACK_TEMPERATURE, cb_temperature)
    input("Press key to exit\n")
    ipcon.disconnect()

 

Mehr folgt erst wieder, wenn du nachweislich einen Python-Kurs absolviert hast...

md

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...