Wo ist mein fehler in python?
Es geht um das auslesen eines Anemometers (Windmesser) an meinem pi 4.
es kommt ständig der fehler
pi@raspberrypi:~ $ /home/pi/Desktop/Wetterstation/Wind/Wind.py
File "/home/pi/Desktop/Wetterstation/Wind/Wind.py", line 19
def calculate_speed(time_sec):
^
IndentationError: unindent does not match any outer indentation level
Später soll das ganze in eine rrd Datenbank wer also dazu ne Idee hat wie das geht bin ich auch offen.
Danke im voraus
Hier ist mein code
#!/usr/bin/python3
# -- coding: utf-8 --
from gpiozero import Button
import math
import time
radius_cm = 9.0
wind_interval = 2
wind_count = 0
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_cm = circumference_cm * rotations
speed = dist_cm / time_sec
return speed
wind_speed_sensor.when_pressed = spin
wind_speed_sensor = Button(5)
while True:
wind_count = 0
time.sleep(wind_interval)
print( calculate_speed(wind_interval), "cm/h")
2 Antworten
Die Einrückung scheint nicht zu passen, also nochmal kontrollieren - ist hier einfach nicht zu beurteilen.
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.
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)
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.
Danke der tipp hat gereicht die Daten landen in der Datenbank
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.
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