Wo ist mein fehler in python?

2 Antworten

Die Einrückung scheint nicht zu passen, also nochmal kontrollieren - ist hier einfach nicht zu beurteilen.


simon668 
Beitragsersteller
 01.02.2020, 16:18

Danke für die Antwort. Es war tatsächlich falsch eingerückt und an einer stelle 2 Zeilen verdreht

Ich habe jedoch noch ein Problem bei der Übergabe zur round robin Datenbank. Mir fällt leider keine gute Lösung ein.

Hier ist mein end teil vom Code

while True:

    wind_count = 0

    time.sleep(wind_interval)

    print(calculate_speed(wind_interval), "km/h")

    wind0 = calculate_speed

    rrd_Ubergabe = f"{int(time.time())}:{wind0}"

    rrdtool.update(rrd_Name_01,rrd_Ubergabe)

hier die Meldung beim ausführen

0.0 km/h

Traceback (most recent call last):

 File "/home/pi/Desktop/Wetterstation/Wind/Wind.py", line 44, in <module>

  rrdtool.update(rrd_Name_01,rrd_Ubergabe)

rrdtool.OperationalError: /home/pi/Desktop/Wetterstation/Wind/Winddatenbank.rrd: Function update_pdp_prep, case DST_GAUGE - Cannot convert '<function calculate_speed at 0xb6699270>' to float

KarlRanseierIII  01.02.2020, 16:59
@simon668

Du übergibst eien Funktion, wo ein float erwartet wird:

 wind0 = calculate_speed
->  wind0 = calculate_speed()

So übergibst DU keien Funktionsreferenz, sondern den Rückgabewert - Ich kann nur vermuten, daß Du eigentlich das tun möchtest.

simon668 
Beitragsersteller
 01.02.2020, 21:59
@KarlRanseierIII

genau wenn ich das jedoch versuche bekomme ich die Meldung

0.0 km/h
Traceback (most recent call last):
  File "/home/pi/Desktop/Wetterstation/Wind/Wind.py", line 42, in <module>
    wind0 = calculate_speed()
TypeError: calculate_speed() missing 1 required positional argument: 'time_sec'

Abgesehen davon kann glaub ich rrd nur mit string umgehen

so ist mein code bis jetzt

#!/usr/bin/python3
# -*- coding: utf-8 -*-


from gpiozero import Button
import math
import time
import rrdtool


radius_cm = 9.0
wind_interval = 1
wind_count = 0
CM_IN_A_KM = 100000.0
SECS_IN_AN_HOUR = 3600
ADJUSTMENT = 1.18
rrd_Name_01 = "/home/pi/Desktop/Wetterstation/Wind/Winddatenbank.rrd"


def spin():
    global wind_count
    wind_count = wind_count + 1




def calculate_speed(time_sec):


    global wind_count
    circumference_cm = (2 * math.pi) * radius_cm
    rotations = wind_count / 2.0


    dist_km = (circumference_cm * rotations) / CM_IN_A_KM


    km_per_sec = dist_km / time_sec
    km_per_hour = km_per_sec * SECS_IN_AN_HOUR


    return km_per_hour * ADJUSTMENT


wind_speed_sensor = Button(5)
wind_speed_sensor.when_pressed = spin


while True:
        wind_count = 0
        time.sleep(wind_interval)
        print(calculate_speed(wind_interval), "km/h")
        wind0 = calculate_speed()
        rrd_Ubergabe = f"{int(time.time())}:{wind0}"
        rrdtool.update(rrd_Name_01,rrd_Ubergabe)
KarlRanseierIII  01.02.2020, 22:33
@simon668

Wenn die Funktion einen Parameter benötigt, solltest Du diesen auch übergeben.

Und nein, rrd ist nur für Zahlenwerte, rrd kann gar nicht mit Strings umgehen, weil es auch semantisch keinen Sinn ergibt.

KarlRanseierIII  02.02.2020, 14:39
@simon668

Noch als kleiner Tipp:

        print(calculate_speed(wind_interval), "km/h")
        wind0 = calculate_speed()
        rrd_Ubergabe = f"{int(time.time())}:{wind0}"

Ich würde das wind0 nach oben ziehen, dann können beide Aufrufe den gleichen Wert nutzen, also:

        wind0 = calculate_speed(wind_interval)
        print(wind0, "km/h")
        rrd_Ubergabe = f"{int(time.time())}:{wind0}"

Tabulator vs. Leerzeichen ist ein guter Tipp. Ansonsten: mal auf Backspace ausgerutscht? Ist auf jeden Fall ein Fehler beim Einrücken.

Dein Code hat anscheinend das Copy&Paste hierein nicht vertragen. Da sind auf jeden Fall Whitespaces wo keine hin gehören.