Sensoren Abfragen "Schleife" nach x Fehlversuchen beenden

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Moin,

    ... mein erster python "Gehversuch"....

    Ich stehe vor dem Problem 4 DHT Sensoren abzufragen und bei Ausfall eines oder mehrerer Sensoren die Abfrage nach 5 Versuchen je Sensor abzubrechen.
    Mein Versuch dieses durch herunterzählen (varx = 5 // varx = varx -1 u.s.w.) scheiterten.

    Ich kann lediglich erkennen, dass die Abfrage unendwegt erfolgt, wenn ein Sensor abgeklemmt wird.
    Bisher nutze ich bash und habe die Abfrage in einer sleep / kill Schleife eingebettet ...

    Ziel ist es per python alle Daten an ein google docs spreedsheed zu übertragen, was auch gelingt. Nur hängt das ganze in einer Endlosschleife, wenn ein Sensor ausfallen sollte.



    Bye

    Jürgen

    Einmal editiert, zuletzt von rpivpn (24. September 2014 um 19:07)

  • Sensoren Abfragen "Schleife" nach x Fehlversuchen beenden? Schau mal ob du hier fündig wirst!

  • Also erst mal zur Klärung: Obwohl du PHP als CODE Block gewählt hast, handelt es sich aber um Python CODE ?

    Bitte poste mal den vollständigen Code damit man sich ein Bild davon machen kann was du bisher hast und was noch angepasst werden müsste - aber diesmal bitte in normalem CODE ;)


    Ein möglicher Weg wäre für jeden Sensor ein Counter festzulegen, um das ganze flexibler zu gestalten wäre das ganze aber als Array besser.

    Problematisch wird es allerdings festzustellen wann ein Sensor doch wieder ansprechbar ist - dazu müsste in der while Schleife zusätzlich geprüft werden ob ein Counter bereits auf 5 steht um dann halt eine weitere Anweisung aufzurufen, wobei diese auch nicht alle 2 Sekunden erfolgen muss also auch da noch ein Counter eingefügt werden könnte um es zB nur alle 10 Sekunden auszuführen (so würde ich das zumindest machen)...

  • Auf die Gefahr hin mehr zu verwirren als zu klären habe ich die primäre Logik in einer Klasse gakapselt. Der Vorschlag von meigrafd das alles mit einem Array abzuhandeln funktioniert auch - aber das finde ich nicht leicht les- und wartbar. Da ich die HW nicht habe habe ich das Lesen der Daten mit einem schlichten Input gelöst :)

    Falls manches nicht klar ist wie es mit Klassen funktioniert frage einfach nach.

    Mit diesem Ansatz bist Du pro Sensor sehr flexibel und kannst alle Parameter wie die waitTime und retryCount sehr elegant einstellen. Auch ist die Schleife relativ einfach. Die Sache dann pe Multitreading parallel auszuführen ist dann auch nicht mehr sehr schwer.


  • ... für jeden Sensor ein Counter festzulegen..

    Moin,

    ich habe´s oben eingebessert :angel:, # & php "Knopf" liegen doch arg nah beieinander :D

    Ursprünglich stammt der code von adafrüchtchen und wurde von mir um die Abfrage von 3 weiteren Sensoren erweitert.

    Soviel habe ich bisher mitbekommen:
    Beim bisherigen code werden alle 4 Sensoren solange abgefragt, bis für alle 4 "gültige" Werte ( nicht None) vorliegen und dann erst erfolgt wie Weiterverarbeitung.

    Da sich in der Vergangenheit schon einmal ein solcher ausgestiegen ist, kamen überhaupt keine Daten rüber.

    Die nicht funktionierende Varinate mit var = 5 runterzählen bis 0 klappt als solche nur bleibt die Abfrage beim sabotierten Sensors hängen und zählt fleissig weiter runter.

    Mir fehlt der Ansatz, wie ich nach z. B. 5 erfolglosen Versuchen, die Abfrage des "sabotierten" Sensors abbreche und mit dem nächsten fortzufahren.

    Bye

    Jürgen

    • Offizieller Beitrag

    Framp's Beispiel macht das, wenn ein Sensor aus der Liste nur none liefert ist nach x versuchen schluss und der nächste sensor ist dran

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Einmal editiert, zuletzt von dbv (24. September 2014 um 21:56)

  • Moin,

    mit frischem Kaffee ging´s ans Werk.
    Den code habe ich mit ein paar prints versehen um so ein feedback zu erhalten.

    Ausgeführt: python /usr/local/bin/0test.py

    Ausgabe:

    Um mir ein Bild über den Inhalt/Sensorwert zu erhalten habe ich eine loop gebastelt:

    Ausgabe:

  • ...mit frischem Kaffee ging´s ans Werk.

    :thumbs1:

    Mir ist nicht ganz klar was Du mit Deinem Test bewirken wolltest, aber wenn Du in dem Code nicht Die richtigen Sensorabfragen einbaust bekommst Du natürlich keine Daten :) Ich habe die Daten demomäßig vom Bildschrim eingelesen da ich keine reale HW habe.

    Du musst folgendes ändern:

    Code
    humidity = raw_input("%s Hum" % self.getPin())
                temp = raw_input("%s Temp" % self.getPin())


    ersetzen durch

    Code
    humidity, temp  = Adafruit_DHT.read(self.type, self.pin)


    und dann solltest Du Werte bekommen.


  • Mir ist nicht ganz klar was Du mit Deinem Test bewirken wolltest, ...

    Moin,

    den Ablauf verinnerlichen, da python-Frischling.
    Lernern und verstehen mittels try & error ist mein Ding, Bücher lesen nicht so.
    Und dabei hatte ich den Wald vor lauter Bäumen nicht gesehen.

    Die Einbesserung brachte natürlich den gewünschten Erfolg, die Daten wurden ausgegeben. :thumbs1:

    Nur zählte der retrayCounter nicht runter und die Abfrage das sabotierten Sensors war unendlich. Der Zähler blieb bei 5

    Code
    def getData(self):
            retryCounter=self.maxRetry        
            while retryCounter > 0:
                humidity = raw_input("%s Hum" % self.getPin())
                temp = raw_input("%s Temp" % self.getPin())
                if humidity == None or temp == None:
                    self.retryCounter=-1

    Ich habe den code wie folgt geändert:

    Zitat

    retryCounter=retryCounter -1


    iso

    Zitat

    self.retryCounter=-1:

    Code
    def getData(self):
            retryCounter=self.maxRetry
            while retryCounter > 0:
                humidity, temp  = Adafruit_DHT.read(self.type, self.pin)
                if humidity == None or temp == None:
                    retryCounter=retryCounter -1

    Jetzt endet die Abfrage des sabortierten Sensors nach den dem 5. Fehlversuch :bravo2:

    Meine nächste Hürde, die wie und wo auch immer hinterlegten Daten (humidity, temp je Sensor) weiter zu verarbeiten.

    Die Ausgabe per: gelöscht da nonsens..

    Neuer Versuch:

    Bei jeder Sensoranfrage werde die ermittelten Daten in result abgelegt.
    Somit ist eine einmalige Abfrage aller Sensorenwerte nach einem Durchlauf so nicht möglich, da ja result nur den letzten ermittelten Wert result[0] Hum. und result[1] Temp enthält.
    ....
    Und der Schädel ist wieder mal dicht, gehe erst einmal einkaufen, zur Ablenkung....


    Bye

    Jürgen

    Einmal editiert, zuletzt von rpivpn (26. September 2014 um 16:16)

  • Ich habe mir Deinen Code wo Du mit den Daten was anstellst, mal angesehen und exemplarisch eingebaut. Meinen testdatengenerator musst Du wieder auskommentieren.

    Änderungen:
    1) Der Sensor merkt sich welche Werte er gelesen hat so dass sie später noch ausgelesen werden können
    2) Zwei Methoden, um die gelesenen Werte auszulesen aus den Sensoren: getHumidity() und getTemperature()
    3) Falls keine Werte vorliegen wird -99 für beide Werte vom Sensor zurückgegeben


  • ... wackeligen Sbahn raus bin ...

    Moin,

    Balina :auslachen:
    Sei froh dass sie überhaupt fährt :angel:

    Mein Ansatz würde wie folgt aussehen:
    Nach Durchlauf

    Code
    while True:
        for sensor in mySensors:
            result = sensor.getData()
            if result:
                print "Handling sensor with pin %d - Hum %s Temp %s" % (sensor.getPin(), result[0], result[1])

    erfolgt die Umbenennung von result in (Inhalt von self.getPin) somit die PinNummer der aktuell durchlaufenden Instanz.
    Und der Inhalt von result wird auch gleich auf nur eine Stelle nach dem Komma bereinigt so etwas wie {0:0.1f}, {1:0.1f}

    Somit würde auch eine Pin-Verlegung, Erweiterung oder Dezimierung um x Sensoren "automatisch" mit einfliessen.

    framp, vielen vielen Dank für deine Hilfe.

    Bye

    Jürgen

  • Moin,

    ich habe es nicht sofort umsetzen können, das Wetter war doch zu verlockend noch etwas Gummi im Harz zu legen.

    Klasse, es läuft, vielen Dank.
    Hab´s mir angesehen und bin begeistert.

    Das google login zickt noch etwas, aber damit mache ich morgen weiter.


    Bye

    Jürgen

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!