Ankündigung

Einklappen
Keine Ankündigung bisher.

Logik Problem

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

    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!

    #2
    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.

    Kommentar


      #3
      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?

      Kommentar


        #4
        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......

        Kommentar


          #5
          gpio plugin evtl? https://github.com/smarthomeNG/plugins/tree/master/gpio

          Kommentar


            #6
            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.
            Viele Grüße
            Martin

            There is no cloud. It's only someone else's computer.

            Kommentar


              #7
              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.

              Kommentar


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

                Kommentar


                  #9
                  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)

                  Kommentar


                    #10
                    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.

                    Kommentar

                    Lädt...
                    X