Ankündigung

Einklappen
Keine Ankündigung bisher.

Anwesenheitserkennung mit Counter versehen

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

    Anwesenheitserkennung mit Counter versehen

    Hallo liebe Community,

    ich habe mir mit einem Ultraschall-Entfernungssensor eine Anwesenheitserkennung gebaut. Wenn mein Auto in der Garage steht und der gemessene Abstand klein ist, bin ich anwesend. Ist das Auto nicht in der Garage und der Abstand groß, bin ich nicht anwesend.
    Nun kommt es ab und an zu Lesefehlern. Es wird trotz leerer Garage ein kleiner Wert vom Sensor gelesen und damit die Anwesenheit samt dazugehöriger Regeln ausgelöst.

    Diese Lesefehler möchte ich gerne umgehen, indem der auslösende Wert (bzw. Bereich) mindestens 3 Mal in Folge gelesen werden muss, um die Anwesenheit/Abwesenheit auszulösen.

    Ich hoffe ihr könnt mir helfen

    Meine aktuelle Regel:

    Code:
    rule "Anwesend"
    when
    Item Abstand_Garage received update
    then
    if (Abstand_Garage.state < 60 && Anwesenheit.state == OFF)
    {
    sendCommand(Anwesenheit, ON)
    }
    if (Abstand_Garage.state > 200 && Anwesenheit.state == ON)
    {
    sendCommand(Anwesenheit, OFF)
    }
    end

    #2
    Ich denke, der einfachste Weg wäre, die Updates zu zählen:
    Code:
    var int iCountPresence = 0
    
    rule "Anwesend"
    when
        Item Abstand_Garage received update
    then
        if (Abstand_Garage.state < 60 && iCountPresence < 3)
            iCountPresence = iCountPresence + 1
        if (Abstand_Garage.state > 200 && iCountPresence > 0)
            iCountPresence = iCountPresence - 1
        if (iCountPresence == 3 && Anwesenheit.state == OFF)
            Anwesenheit.sendCommand(ON)
        if (iCountPresence == 0 && Anwesenheit.state == ON)
            Anwesenheit.sendCommand(OFF)
    end
    Da jeweils nur ein Befehl ausgeführt wird, können die {} entfallen. Wahlweise könntest Du auch ein ungebundenes Item für das Zählen verwenden.

    Kommentar


      #3
      Guten Morgen udo1toni,

      vielen Dank für das Beispiel. Werde ich direkt ausprobieren. Wie lege ich ein ungebundenes Item für das zählen an? Einfach
      Code:
      Number Counter
      in der .items?
      Kann ich den Counter auch in der Sitemap anzeigen lassen?

      Kommentar


        #4
        Genau. Es bietet sich an, noch ein Label zu setzen. Sobald etwas als Item vorhanden ist, kann es auch über ein Widget angezeigt (Text) oder sogar bedient werden (Slider, Switch, Setpoint, Select, Color). Im vorliegenden Fall wäre Text item=Counter label="Counter Garage [%d]" wohl die sinvolle Variante

        Kommentar


          #5
          Super, vielen Dank für die Hilfe. Dann sollte ab heute Abend der "Spuk" im Haus vorbei sein

          Kommentar


            #6
            Eine Frage mmusst ja noch kommen. Der Countertenor an sich funktioniert. Bisher keine wilden an- und Abwesenheiten mehr.

            Leider bekomme ich den Wert nicht in die sitemap.

            Als Item habe ich
            Code:
            Number CounterAnwesenheit "Zähler Anwesenheit [%d]"
            ​​
            ​​​​​
            In der Rule steht:
            Code:
            var int CounterAnwesenheit
            In der sitemap steht beim wWer nur -

            Kommentar


              #7
              Naja, Du musst dann natürlich in der Rule auch das Item statt der Variablen verwenden, das sieht dann so aus:
              Code:
              rule "Anwesend"
              when
                  Item Abstand_Garage received update
              then
                  if(! CounterAnwesenheit.state instanceof Number) CounterAnwesenheit.postUpdate(1)  //Initialisierung
                  if (Abstand_Garage.state <  60 && (CounterAnwesenheit.state as Number) < 3)
                      CounterAnwesenheit.postUpdate((CounterAnwesenheit.state as Number) + 1)
                  if (Abstand_Garage.state > 200 && (CounterAnwesenheit.state as Number) > 0)
                      CounterAnwesenheit.postUpdate((CounterAnwesenheit.state as Number) - 1)
                  if ((CounterAnwesenheit.state as Number) == 3 && Anwesenheit.state == OFF)
                      Anwesenheit.sendCommand(ON)
                  if ((CounterAnwesenheit.state as Number) == 0 && Anwesenheit.state == ON)
                      Anwesenheit.sendCommand(OFF)
              end
              Die Variable ist dann nicht mehr nötig.

              EDIT: Mit fällt gerade auf, dass nach dem Start von openHAB das Item NULL ist. Entsprechend muss noch eine Zeile an den Anfang. Ic hhab das eingefügt. Dabei habe ich als Initialisierungswert 1 genommen. Falls als erstes ein Update < 60 kommt, wird die Anwesenheit halt erst beim 2. Update auf ON gesetzt, falls das Update > 200 ist, wird direkt Anwesenheit OFF gesetzt.
              Zuletzt geändert von udo1toni; 12.02.2018, 20:46.

              Kommentar


                #8
                Okay, perfekt. So etwas habe ich vermutet, hatte aber die Variable noch drin. Das hat ihm nicht gefallen. Vielen Dank und einen schönen Abend

                Kommentar

                Lädt...
                X