Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeitzählen wie lange ein Item An ist

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

    Zeitzählen wie lange ein Item An ist

    Hi zusammen

    Da ich meine Rolladen gerne an eine bestimmte Position fahren möchte benötige ich eine Funktion die die Zeit zählt wie lange ein Item an ist.

    Erklärung :
    Ich Messe die Zeit wie lange ein Rolladen benötigt um hoch und Runter zu fahren.
    Ich habe ein Item was ich in % Einstelle und daraus berechnet mir eine Rule die Zeit (immer die Zeit von Auf bis zu dieser Position)

    Dann schaue ich die Momentane ist Zeit und berechne daraus ob hoch oder runter gefahren werden muss.
    Dann wird aus der Diferenz ein Timer erstellt und gestartet sowie die Relais geschalten.

    Das scheint auch zu funktionieren.

    Leider bleibt der Momentane Stand auf 0 da ich kein Weg finde die Zeit zu zählen.

    Mit
    when
    Time cron “0 0/5 * * * ?”

    kann ich z.b. die Rule alle 5 min Starten aber die Rule sollte min. jede Sekunde Starten wenn ein Item An ist

    Also müsste der Intervall in eine IF Bedingung ....

    Geht das ?

    Habt ihr andere Ideen ?

    MfG

    #2
    Ich habe für eine Lüfter Steuerung folgendes gemacht:
    Code:
    var long StartTime_Bath = 0  var long runtime_Bath = 0
      var long StopTime_Bath = 0
      var Timer VentiTimeOn = null
      var Timer VentiTimeOff = null
     
    rule "Ventilator Bad"
      when
          Item Light_GF_Bath received command
      then
          if(receivedCommand==ON) {
             if (Motor_GF_Bath.state==OFF) {              // first ON command, so create a timer to turn the light off again
                 StopTime_Bath = 0              StartTime_Bath = now.millis
                  logDebug("Nachlauf","Light ON @ {}", StartTime_Bath)
                  if (VentiTimeOn!=null) {
                      VentiTimeOn.cancel
                      VentiTimeOn = null
                  }
                  VentiTimeOn = createTimer(now.plusSeconds(10), [|
                      sendCommand(Motor_GF_Bath, ON)
                 ])          }
         }      else if(receivedCommand==OFF) {
              // remove any previously scheduled timer
              if(VentiTimeOn!=null) {
                  logDebug("Nachlauf","Light OFF @ {}", now.millis)
                  VentiTimeOn.cancel
                  VentiTimeOn = null
              }   
              logDebug("Nachlauf","Motor_GF_Bath = {}", Motor_GF_Bath.state)
              if(Motor_GF_Bath.state==ON) {
                  runtime_Bath = (now.millis - StartTime_Bath)
                  logDebug("Nachlauf","runtime_Bath = {} msec", runtime_Bath)
                  logDebug("Nachlauf","StartTime_Bath = {} ; runtime_Bath = {} msec", StartTime_Bath, runtime_Bath)
                  if (runtime_Bath > 900000)
                      Motor_GF_Bath_afterrun.postUpdate(900)
                  else if (runtime_Bath > 300000)
                      Motor_GF_Bath_afterrun.postUpdate(300)
                  else if (runtime_Bath > 120000)
                      Motor_GF_Bath_afterrun.postUpdate(120)
                  else
                      Motor_GF_Bath_afterrun.postUpdate(0)
              }
              StartTime_Bath = 0
         }  end
     
    rule "Nachlauf"
      when
          Item Motor_GF_Bath_afterrun received update
      then
          logDebug("Nachlauf","Nachlaufzeit = " + Motor_GF_Bath_afterrun.state.toString + " sec")
          sendCommand(Motor_GF_Bath, ON)
          var myStop = now.millis + 1000 * (Motor_GF_Bath_afterrun.state as DecimalType).intValue
          if (myStop > StopTime_Bath) {
              logDebug("Nachlauf","neuer Nachlauf länger als alter Nachlauf")
              logDebug("Nachlauf","Stoptime_Bath = {} ; myStop = {}", StopTime_Bath, myStop)
              if (VentiTimeOff!=null) {
                  VentiTimeOff.cancel
                  VentiTimeOff = null
              }
              StopTime_Bath = myStop
              VentiTimeOff = createTimer(now.plusSeconds((Motor_GF_Bath_afterrun.state as DecimalType).intValue), [|
                      if (Light_GF_Bath.state==OFF)
                          sendCommand(Motor_GF_Bath, OFF)
                      StopTime_Bath = 0
              ])
          }
          else {
              logDebug("Nachlauf","alter Nachlauf länger als neuer Nachlauf")
              logDebug("Nachlauf","Stoptime_Bath = {} ; myStop = {}", StopTime_Bath, myStop)
          }
      end
    Ich merke mir die Startzeit und schaue dann nach, wie lang das Licht an ist. Daraus errechne ich die gewünschte Laufzeit. Wenn die Steuerzeit aktualisiert wird, wird eine zweite Rule getriggert, die einen Timer erstellt, der den Ventilator abschaltet.

    Für Rollladenpositionen musst Du natürlich vor dem Start bestimmen, wie lange der Rollladen laufen muss und das Stopkommando per Timer absetzen. Wenn Du entsprechend die Position anzeigen willst, brauchst Du nur eine Rule, die triggert, wenn der Rollladen einen Befehl erhält. Wenn der Befehl hoch oder runter lautet, merkst Du dir die Zeit, wenn der Befehl stop lautet, merkst Du Dir wieder die Zeit, daraus kannst Du die Laufzeit errechnen und daraus (zusammen mit der Laufrichtung) um wieviel Prozent Du die Position korrigieren musst. Den Wert schreibst Du dann mit postUpdate in das Item.

    Die größere Herausforderung ist, zu bestimmen, wo sich der Rollladen befindet, wenn der Rollladen von außen gesteuert wird, weil openHAB vielleicht gar keine zuverlässige Rückmeldung bekommt. (z.B. knx meldet eventuell nur, in welche Richtung der Rollladen fährt, aber nicht, wenn er anhält - dann muss eventuell das Steuersignal der Wandtaster abgegriffen werden, um an idese Information zu kommen.)

    Kommentar


      #3
      Sorry verstehe dein Rule nicht wirklich ....
      Ich erkenne nicht wann du und wie du ein Timer startest .....

      Also ich kann auf 2 Switch Items Reagieren und diese auch Steuern

      PHP-Code:
      rule "Timer Start"
          
      when
              Item M076R2 changed to ON
          then
              
      //ZU
              
      if ( M076R1.state == ON ) {
                  
      //Hir Muss ein Timer sein
                  
      }
              
      //Auf
              
      if ( M076R1.state == OFF ) {
                  
      //Hier Muss ein Timer sein
                  
      }
      end

      rule 
      "Timer Ende"
          
      when
              Item M076R2 changed to OFF
          then
              
      //Hier Muss der Timer Beendet werden
      end 
      Es kann auch der gleiche Timer sein da ich den Timer in einer Variable speichern würde um dann eine weitere Variable zu berechnen.

      Da die Rollos auch von Hand gesteuert werden kann sind z.b. Millisekunden supa.

      Ich kann mir nur denken das du es mit diesen

      PHP-Code:
        StopTime_Bath 0              StartTime_Bath now.millis              
      logDebug
      ("Nachlauf","Light ON @ {}"StartTime_Bath
      Irgendwie den Timer erstellst und startest ....
      Habe aber dazu nichts im Internet gefunden

      MfG

      Kommentar


        #4
        Wenn es ums Messen der Zeit geht, speicherst Du die Startzeit und und ziehst diese von der Stoppzeit ab:
        Code:
        var long Starttime
        var long Length
        ...
        Starttime = now.millis //speichert die Startzeit in Millisekunden seit 01.01.1970, 0:00:00 Uhr
        ...
        
        Length = now.millis - Starttime
        Length ist dann die Laufzeit in Millisekunden. Wenn es darum geht, etwas für eine bestimmte (variable) Dauer ein- und wieder auszuschalten, sieht das so aus:
        Code:
        var Timer tMyTimer = null
        
        ...
        rollladen.sendCommand(UP)
        tMyTimer = createTimer(now.plusMillis(18600), [
            rollladen.sendCommand(STOP)
        ])
        Man kann auch Sekunden, Minuten, Stunden usw. addieren oder auch subtrahieren, mit plusSeconds, plusMinutes, plusHours, minusHours...

        Bei der Messung der Laufzeit muss man sich im klaren darüber sein, dass openHAB kein Echtzeitsystem ist, es gibt keine garantierten Laufzeiten oder Reaktionszeiten, das bedeutet, vielleicht wird bei der Messung die Startzeit zu spät erfasst, oder die Stopzeit, oder beide... Im allgemeinen funktioniert das aber recht gut.

        Kommentar


          #5
          Cool, wieder was gelernt.

          Es Rennt und nicht nur das, dieses Komando könnte auch in der Wiki stehen was es nicht tut

          So hat man ein Komando was einen Fixen Punkt hat

          MfG

          Kommentar

          Lädt...
          X