Ankündigung

Einklappen
Keine Ankündigung bisher.

Logik Problem

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

  • rscde
    antwortet
    Hallo Mike,

    deinem Ansatz werde ich folgen.
    Da mein Sensor aber keine sauberen Werte liefert (Gruss nach Fernost...),
    brauche ich den höchsten Wert der zehn Messungen.
    Ich werde also noch umbauen müssen.

    Einen Kommentar schreiben:


  • Mike01
    antwortet
    Hallo,

    Ich hab den SR04 Sensor bei mir auch erfolgreich am laufen, ich messe damit den Salzinhalt meiner Enthärtungsanlage.

    Der Code macht 10 Messungen, und schreibt den Mittelwert dann in ein item.
    Logik wird mit Crontab 1x am Tag ausgeführt.

    Gruß, Mike

    Code:
    Code:
    #!/usr/bin/env python3
    #
    
    import time
    import RPi.GPIO as GPIO
    
    GPIO.setmode(GPIO.BOARD)
    trig=33
    echo=35
    GPIO.setup(echo,GPIO.IN)
    GPIO.setup(trig,GPIO.OUT)
    voll=10 # 50 cm von Sensor bis Wasseroberfläche = voll
    leer=70 # 230 cm von Sensor bis Wasseroberfläche= leer
    entfernung=0
    gesamt=0
    #Größe = 46x30x80 LxBxH
    
    #liter_pro_cm=3.1415*112.5*112.5*1/1000  #pi * radius * radius * 1cm /1000 sonst milliliter
    liter_pro_cm=46*30*1/1000  #Länge x Breite x Höhe /1000 sonst milliliter
    #print ("Liter pro cm: ",liter_pro_cm)
    
    for i in range(0,10):
        GPIO.output(trig,True)
        time.sleep(0.00001)
        GPIO.output(trig,False)
        start=time.time()
        while GPIO.input(echo) == 0:
            start=time.time()
        while GPIO.input(echo) == 1:
            ende = time.time()
        entfernung=((ende - start) * 34300) / 2
        #print (entfernung)
        gesamt=gesamt+entfernung
        time.sleep(0.75)
    
    mittelwert=round(gesamt/10, 2)
    volumen=round((leer-mittelwert)*liter_pro_cm, 2)
    GPIO.cleanup()
    sh.enthaerter.mittelwert(mittelwert)
    sh.enthaerter.volumen(volumen)

    Einen Kommentar schreiben:


  • walldi
    antwortet
    Versuch Mal, eine Funktion def main() um alles zu machen.
    Kann ich selbst gerade nicht ausprobieren.

    Einen Kommentar schreiben:


  • rscde
    antwortet
    Hallo,

    @psilo:
    ich glaube das Plugin hilft mir hier nicht weiter. Trotzdem danke für den Tip.

    @Msinn:

    ich hätts wie in der folgenden Fehlermeldung umgesetzt:

    Traceback (most recent call last):
    File "/usr/local/smarthome/lib/scheduler.py", line 493, in _task
    exec(obj.bytecode)
    File "/usr/local/smarthome/logics/hcsr04.py", line 56, in <module>
    Distance = measure_range()
    File "/usr/local/smarthome/logics/hcsr04.py", line 46, in measure_range
    values.append(logics.measure()) # Messung starten
    NameError: name 'logics' is not defined
    auch mit logic. bekomme ich diese Fehlermeldung.

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Ich habe Logiken mit Funktionen drin, bin aber vereinzelt auch auf dieses Problem gestoßen. Das ist so lange her, dass ich im Moment nicht mehr sagen kann wie ich es gelöst habe.

    Das Problem tritt auf, wenn man in einer Funktion eine Funktion aufruft, die man in der Logik definiert hat. Das hängt mit dem Namensraum zusammen. Ohne es getestet zu haben: Probier mal die Funktion mit logic. oder logics. davor aus.

    Einen Kommentar schreiben:


  • psilo
    antwortet
    gpio plugin evtl? https://github.com/smarthomeNG/plugins/tree/master/gpio

    Einen Kommentar schreiben:


  • rscde
    antwortet
    eine andere Möglichkeit die gemessenen Werte in ein Item zu bekommen gibts ja so nicht oder? Ich muss es ja über etc/logic.yaml laufen lassen?
    Mal abgesehen von "zuerst in eine Textdatei übergeben" und dann "von Textdatei wieder auslesen in Item......

    Einen Kommentar schreiben:


  • rscde
    antwortet
    Hallo Bernd,

    danke für die Info.

    hm, schade. Ich versuch es dann auch flach. Hab schon dran gedacht dass das wohl in Frage kommt.
    Werden dann nur die def Methoden unterstützt die auch in der Doku auf smarthomeNG.de stehen?

    Einen Kommentar schreiben:


  • bmx
    antwortet
    Das ist IMHO eine Limitation in Python der durch die Einbindung mit exec entsteht. Ich habe so etwas ähnliches auch mal probiert, habe das aber nicht hinbekommen.
    Damals war die Antwort vom Urvater Marcus ich müßte halt ein Plugin schreiben und dort die benötigten Funktionen einbauen. Ich habe dann einfach alles flach gemacht ohne Unterroutinen und es ging.
    Kannst ja mal testen ob das für Dich erstmal eine Lösung wäre.

    Einen Kommentar schreiben:


  • rscde
    hat ein Thema erstellt Logik Problem.

    Logik Problem

    Hallo zusammen,

    mein SH/SV System läuft wie bei vielen auf einem Raspberry Pi wunderbar und das schon seit Jahren.
    nun möchte ich über einen weiteren Pi per GPIO einen HC-SR04 Sensor Entfernungen messen.

    Dazu habe ich mir aus dem Internet folgendes Script zusammen kopiert....:

    Code:
    import RPi.GPIO as GPIO
    import time
    
    # GPIOs fuer den US-Sensor
    GPIO.setmode(GPIO.BOARD)
    TRIG = 18
    ECHO = 24
    
    # Dauer Trigger-Impuls
    PULSE = 0.00001
    
    # Anzahl Messwerte fuer Mittelwertbildung
    BURST = 25
    
    # Schallgeschwindigkeit/2
    SPEED_2 = 17150
    
    # BCM GPIO-Referenen verwenden (anstelle der Pin-Nummern)
    # und GPIO-Eingang definieren
    GPIO.setup(TRIG, GPIO.OUT)
    GPIO.setup(ECHO, GPIO.IN)
    GPIO.output(TRIG, False)
    time.sleep(1)                   # Setup-Zeit fuer Sensor
    
    def measure():
      GPIO.output(TRIG, True)       # Trigger-Impuls
      time.sleep(PULSE)
      GPIO.output(TRIG, False)
      starttime = time.time()       # Zeit initialisieren
      stopp = starttime
      start = starttime
      # Warten auf steigende Flanke, max. 2 Sekunden
      while  GPIO.input(ECHO) == 0 and start < starttime + 2:
        start = time.time()         # Startzeit
      # Warten auf fallende Flanke, max. 2 Sekunden
      while  GPIO.input(ECHO) == 1 and stopp < starttime + 2:
        stopp = time.time()         # Endezeit
      delta = stopp - start         # Zeitdifferenz und Entfernung berechnen
      distance = delta * SPEED_2
      return distance
    
    def measure_range():
      values = []
      sum = 0
      for i in range(0, 25):
        values.append(measure())    # Messung starten
        sum = sum + values[i]       # Wert im Array speichern und aufsummieren
        print("Messwert: %1.1f" % values[i]) # Kontrollausgabe
        time.sleep(0.05)
        sum = max(values)
      return sum;
    
    # do it
    try:
    #  while True:
      Distance = measure_range()
      print("Range = %1.1f cm" % Distance)
      time.sleep(1)
      load = 12750 * (2 / Distance)
      print("Inhalt = %3d " % (load))
      sh.zisterne.level(load) 
      time.sleep(1)
      GPIO.cleanup()
    Führe ich das Python Script per Hand aus, funktioniert es wunderbar, lasse ich es aber per etc/logic.yaml ausführen bekomme ich folgende Meldung im sh.log:

    2018-07-23 14:46:01 ERROR logics.Logic_Zisterne Logic: logics.Logic_Zisterne, File: /usr/local/smarthome/logics/hcsr04.py, Line: 46, Method: measure_range, Exception: name 'measure' is not defined

    Traceback (most recent call last):
    File "/usr/local/smarthome/lib/scheduler.py", line 493, in _task
    exec(obj.bytecode)
    File "/usr/local/smarthome/logics/hcsr04.py", line 56, in <module>
    Distance = measure_range()
    File "/usr/local/smarthome/logics/hcsr04.py", line 46, in measure_range
    values.append(measure()) # Messung starten
    NameError: name 'measure' is not defined
    Kann mir BITTE jemand erklären wo der Fehler liegt und wie ich es lösen kann? Ich möchte es auch verstehen damit ich das beim nächsten mal selbst lösen kann.

    Vielen Dank im voraus!
Lädt...
X