Ankündigung

Einklappen
Keine Ankündigung bisher.

Zeitfunktion / Dauer des Zustandes einer GA

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

    Zeitfunktion / Dauer des Zustandes einer GA

    Hallo zusammen,

    vielleicht stehe ich gerade etwas auf dem Schlauch - aber mir ist im Moment nicht klar wie ich folgende Anforderung mit Boardmitteln des eibPC erledige:

    Wie bekomme ich die Zeitdifferenz (in ms) heraus, die zwischen zwei Zustandswechsel einer GA liegen?

    Beispiel:
    Ein Taster wird gedrückt und gedrückt gelassen - Taster sendet auf GA "EIN".
    Nach einer gewissen Zeit wird die Taste losgelassen und Schalter sendet auf GA "AUS".

    Wie bekomme ich die Zeit in ms heraus, die zwischen Wechsel auf "EIN" und anschließendem Wechsel auf "AUS" vergeht?

    Diesen Wert benötige ich zum Weiterverbeiten.

    Anwendungsbeispiel:
    Bei Tastendruck < 600ms wird Licht geschaltet.
    Bei Tastendruck > 600ms und < 4000ms wird ein Rolladen angesteuert.
    Bei Tastendruck > 4000ms wird z.B. eine Panikfunktion aktiviert.


    Hat jemand eine Idee?


    Wenn ich grad beim Thema Zeitdifferenz bin:
    Wäre es nicht von Vorteil wenn man für bestimmte Variablen/GAs die Dauer des letzten Zustands auswerten könnte?
    Ein Beispiel wäre in Fensterkontakt: Wenn das Fenster geöffnet wird geht er von EIN auf AUS.
    Wenn er danach wieder auf EIN geht würde ich gern wissen wie lange der Kontakt auf AUS war (also wie lange das Fenster geöffnet war).
    Wenn man Zugriff auf einen (UNIX-)Timestamp hätte, könnte man sich das selbst bauen - aber Zugriff auf eine Zeit in ms Auflösung habe ich noch nicht gesehen.

    Danke und Gruß
    Matthias

    #2
    Hallo,
    im Prinzip ist das alles einfach zu realisieren:

    1. Tasterauswertung:

    T1=AUS
    If "GA-Taster" then T1=1 endif
    if !"GA-Taster" and !after(T1,600u64) then "Lichtfunktion"; T1=0 endif
    if !"GA-Taster" and after(T1,600u64) and !after(T1,4000u64) then "Rollofunktion"; T1=0 endif
    if !"GA-Taster" and after(T1,4000u64) then "Panikfunktion"; T1=0 endif

    Zeitmessung geht besser indirekt indem du ein Reckteckimpuls von 0,1 oder 1sec erzeugst und diese dann abzählst. (Können auch kleinere Impulse sein, aber es ist fraglich, ob das nötig ist. Hier mit 0,5 sec:

    Z=0u16
    IM=Aus

    If After(IM,50u64) then IM=0 endif
    if IM=0 then IM=1 endif

    IF "GA-Ereignis" and IM then Z=Z+1 endif

    Z ist dann die Zeit in o,5 Schritten abgezählt. Nicht vergessen den Zähler zurückzusetzen.

    Falls es nicht funktioniert, kurze Nachricht, dann probier ich es morgen auf der Arbeit aus und korrigiere es evtl.
    Der schöne Niederrhein läßt Grüssen

    Andreas


    Alter Hof mit neuer Technik

    Kommentar


      #3
      Klappt nicht ganz

      Zitat von anlo007 Beitrag anzeigen
      T1=AUS
      If "GA-Taster" then T1=1 endif
      if !"GA-Taster" and !after(T1,600u64) then "Lichtfunktion"; T1=0 endif
      if !"GA-Taster" and after(T1,600u64) and !after(T1,4000u64) then "Rollofunktion"; T1=0 endif
      if !"GA-Taster" and after(T1,4000u64) then "Panikfunktion"; T1=0 endif

      Hallo Andreas,

      danke für Deine Hilfe, leider tut der Codeschnipsel aber nicht was er soll:

      Bei kurzem Druck:

      % 2010-04-25 20:29:53 | Sender: 1.3.25 | GA: "Taster" | Wert: EIN | Typ: Binärwert | Schreiben
      % 2010-04-25 20:29:53 | Sender: 1.3.25 | GA: "Taster" | Wert: AUS | Typ: Binärwert | Schreiben
      % 2010-04-25 20:29:53 | Sender: EibPC | GA: "Lichtfunktion" | Wert: AUS | Typ: Binärwert | Schreiben
      % 2010-04-25 20:29:53 | Sender: EibPC | GA: "Rollofunktion" | Wert: EIN | Typ: Binärwert | Schreiben
      % 2010-04-25 20:29:54 | Sender: EibPC | GA: "Lichtfunktion" | Wert: AUS | Typ: Binärwert | Schreiben
      % 2010-04-25 20:29:57 | Sender: EibPC | GA: "Panikfunktion" | Wert: EIN | Typ: Binärwert | Schreiben


      Bei mittleren Druck:

      % 2010-04-25 20:32:12 | Sender: 1.3.25 | GA: "Taster" | Wert: EIN | Typ: Binärwert | Schreiben
      % 2010-04-25 20:32:14 | Sender: 1.3.25 | GA: "Taster" | Wert: AUS | Typ: Binärwert | Schreiben
      % 2010-04-25 20:32:14 | Sender: EibPC | GA: "Rollofunktion" | Wert: EIN | Typ: Binärwert | Schreiben
      % 2010-04-25 20:32:15 | Sender: EibPC | GA: "Lichtfunktion" | Wert: AUS | Typ: Binärwert | Schreiben
      % 2010-04-25 20:32:17 | Sender: EibPC | GA: "Panikfunktion" | Wert: EIN | Typ: Binärwert | Schreiben


      bei langem Druck:

      % 2010-04-25 20:32:59 | Sender: 1.3.25 | GA: "Taster" | Wert: EIN | Typ: Binärwert | Schreiben
      % 2010-04-25 20:33:04 | Sender: 1.3.25 | GA: "Taster" | Wert: AUS | Typ: Binärwert | Schreiben
      % 2010-04-25 20:33:04 | Sender: EibPC | GA: "Panikfunktion" | Wert: EIN | Typ: Binärwert | Schreiben
      % 2010-04-25 20:33:05 | Sender: EibPC | GA: "Lichtfunktion" | Wert: AUS | Typ: Binärwert | Schreiben

      An so einem ähnlichen Punkt war ich gestern Abend auch schon.

      Grüße
      Matthias

      Kommentar


        #4
        Hallo,

        ersetze mal "After" gegen "delay"

        ich probier es morgen früh aus, evtl. muß man noch eine Variable für "Befehl abgearbeitet" hinzufügen.
        Der schöne Niederrhein läßt Grüssen

        Andreas


        Alter Hof mit neuer Technik

        Kommentar


          #5
          Reckteckimpuls von 0,1 oder 1sec erzeugst und diese dann abzählst. (Können auch kleinere Impulse sein, aber es ist
          Guter Gedanke !
          Würde ich so realisieren:
          T1=0
          Messung=AUS
          // Messintervall
          If "GA-Taster" then T1=T1+1;Messung=EIN endif
          if !"GA-Taster" then Messung=AUS endif
          // T1: Drücken in 0,1s
          if Messung and after(change(T1),100u64) then T1=T1+1 endif
          // Auswertung
          if !Messung and T1=<6 then "Licht" endif
          if !Messung and T1>6 and T1<40 then"Rollo" endif
          if !Messung and T1>=40 then "Panik" endif

          Wäre was für den Codeschnipsel, wenn es funktioniert bei Dir...
          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
          Enertex Produkte kaufen

          Kommentar


            #6
            Es müßte aber auch gehen mit:

            T1=AUS
            If "GA-Taster" then T1=1 endif
            if !"GA-Taster" and T1 and !after(T1,600u64) then "Lichtfunktion"; T1=0 endif
            if !"GA-Taster" and T1 and after(T1,600u64) and !after(T1,4000u64) then "Rollofunktion"; T1=0 endif
            if !"GA-Taster" and T1 and after(T1,4000u64) then "Panikfunktion"; T1=0 endif

            ich probier es morgen mal aus.

            gute Nacht zusammen!
            Der schöne Niederrhein läßt Grüssen

            Andreas


            Alter Hof mit neuer Technik

            Kommentar


              #7
              Hallo,

              hier 2 ausprobierte Versionen. Die Zeiten sind erst einmal auf 2,6,10 sek gesetzt, damit man es leichter Probieren kann.
              Code:
               
              T1=AUS
              If "Kanal 6 Teststahler-4/0/6" then T1=EIN endif
              if !"Kanal 6 Teststahler-4/0/6" and T1 and !(after(T1,6000u64)) then write ("Kanal 5-2/0/5",EIN); T1=AUS endif
              if !"Kanal 6 Teststahler-4/0/6" and T1 and after(T1,6000u64) and !(after(T1,10000u64)) then write ("Kanal 6-2/0/6",EIN); T1=AUS endif 
              if !"Kanal 6 Teststahler-4/0/6" and T1 and after(T1,10000u64) then write ("Kanal 8-2/0/8",EIN); T1=AUS endif
              wobei "Kanal 6 Teststahler-4/0/6" mein Schalter ist.

              Code:
              T1=AUS
              Z1=0b01
              Z2=0b01
              Z3=0b01
              If "Kanal 6 Teststahler-4/0/6" then T1=EIN endif
              If after(T1,2000u64) then Z1=1b01 else Z1=0b01 endif
              If after(T1,6000u64) then Z2=1b01 else Z2=0b01 endif
              If after(T1,8000u64) then Z3=1b01 else Z3=0b01 endif
              if !"Kanal 6 Teststahler-4/0/6" and T1 and !Z1 then write ("Kanal 5-2/0/5",EIN); T1=AUS  endif
              if !"Kanal 6 Teststahler-4/0/6" and T1 and Z1 and !Z2 then write ("Kanal 6-2/0/6",EIN); T1=AUS endif  
              if !"Kanal 6 Teststahler-4/0/6" and T1 and Z2 then write ("Kanal 8-2/0/8",EIN); T1=AUS endif
              Der schöne Niederrhein läßt Grüssen

              Andreas


              Alter Hof mit neuer Technik

              Kommentar


                #8
                @anlo007

                Dein 2. Codebeispiel hat noch 8 statt 10sek

                If after(T1,8000u64) then Z3=1b01 else Z3=0b01 endif
                Gruss Pio

                Kommentar


                  #9
                  Hier auf die gewünschten Zeiten angepasst:
                  Code:
                  T1=AUS
                  If "Kanal 6 Teststahler-4/0/6" then T1=EIN endif
                  if !"Kanal 6 Teststahler-4/0/6" and T1 and !(after(T1,600u64)) then write ("Kanal 5-2/0/5",EIN); T1=AUS endif
                  if !"Kanal 6 Teststahler-4/0/6" and T1 and after(T1,600u64) and !(after(T1,4000u64)) then write ("Kanal 6-2/0/6",EIN); T1=AUS endif 
                  if !"Kanal 6 Teststahler-4/0/6" and T1 and after(T1,4000u64) then write ("Kanal 8-2/0/8",EIN); T1=AUS endif 
                  //
                  oder Version 2:
                  Code:
                  T1=AUS
                  Z1=0b01
                  Z2=0b01
                  If "Kanal 6 Teststahler-4/0/6" then T1=EIN endif
                  If after(T1,600u64) then Z1=1b01 else Z1=0b01 endif
                  If after(T1,4000u64) then Z2=1b01 else Z2=0b01 endif
                   
                  if !"Kanal 6 Teststahler-4/0/6" and T1 and !Z1 then write ("Kanal 5-2/0/5",EIN); T1=AUS  endif
                  if !"Kanal 6 Teststahler-4/0/6" and T1 and Z1 and !Z2 then write ("Kanal 6-2/0/6",EIN); T1=AUS endif  
                  if !"Kanal 6 Teststahler-4/0/6" and T1 and Z2 then write ("Kanal 8-2/0/8",EIN); T1=AUS endif
                  @pio: Die langen Zeiten waren nur zum besseren Testen.
                  Der schöne Niederrhein läßt Grüssen

                  Andreas


                  Alter Hof mit neuer Technik

                  Kommentar


                    #10
                    Schaltzeiten kumulieren und Zeitdifferenzen

                    Hallo eibPC'ler

                    Ich möchte verschiedene Schaltzeiten addieren um somit z.B. festzustellen wie lange der Aktor des Bewegungsmelders XY gestern/letzte Woche/letztes Jahr eingeschaltet war jenseits des (Milli)sekunden-Bereichs. Weiterhin möchte ich feststellen und im Webserver visualisieren wieviele Tage und Stunden z.B. seit dem letzten Schalten des Heizventils YZ vergangen sind.

                    Durch Addition der Schaltzeiten hätte man auch einen varausschauende Planung, wieviel kwh/Jahr und somit Kosten für einen bestimmten Verbraucher(strang) aufzubringen sind (bei bekannten Wattangaben von z.B. Beleuchtung)

                    Für diese tagesübergreifenden Zeitberechnungen habe ich noch keine passenden Befehle gefunden. Habt ihr einen Vorschlag auch für diese Fälle.

                    Viele Grüße

                    Kommentar


                      #11
                      Zitat von webfischly Beitrag anzeigen
                      Ich möchte verschiedene Schaltzeiten addieren um somit z.B. festzustellen wie lange der Aktor des Bewegungsmelders XY gestern/letzte Woche/letztes Jahr eingeschaltet war jenseits des (Milli)sekunden-Bereichs. Weiterhin möchte ich feststellen und im Webserver visualisieren wieviele Tage und Stunden z.B. seit dem letzten Schalten des Heizventils YZ vergangen sind.
                      Eine Stoppuhr mit der Auflösung von 1 Sek. wäre z.B.
                      [highlight=epc]
                      // Sekunden zählen
                      Sekunde=0u32
                      if cycle(0,1) and "BWM-1/2/3" then Sekunde=Sekunde+1u32 endif
                      [/highlight]
                      Ähnlich wäre das mit dem Ventil und die Umrechnung Sekunden in Tage etc. wäre dann halt noch zu coden
                      offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                      Enertex Produkte kaufen

                      Kommentar


                        #12
                        Zeitstempel inkl. Monat/Jahr

                        Super

                        Das mit der Erfassung der Laufzeit von Aktoren funktioniert mit dem angeegeben Code recht einfach und übersichtlich.

                        War mir jetzt noch fehlt ist ein Equivalent zu hour(), minute() und second() um auch den aktuellen Tag und das Jahr in eine Variable schreiben zu können um Zeitstempel zu generieren, die mind. ein Jahr lang gültig sind.

                        Was kann hierzu herangezogen werden?

                        Gruß

                        Kommentar


                          #13
                          Zitat von webfischly Beitrag anzeigen
                          War mir jetzt noch fehlt ist ein Equivalent zu hour(), minute() und second() um auch den aktuellen Tag und das Jahr in eine Variable schreiben zu können um Zeitstempel zu generieren, die mind. ein Jahr lang gültig sind.
                          [highlight=epc]
                          Zeitstempel=$$c14
                          if ...irgendwas... then Zeitstempel=convert(setdate(),$$c14) endif
                          [/highlight]
                          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                          Enertex Produkte kaufen

                          Kommentar


                            #14
                            [highlight=epc]
                            Zeitstempel=$$c14
                            if ...irgendwas... then Zeitstempel=convert(settimedate(),$$c14) endif
                            [/highlight]

                            Warum dann nicht gleich mit settimedate()?
                            BR
                            Marc

                            Kommentar


                              #15
                              Zitat von saft6luck Beitrag anzeigen
                              Warum dann nicht gleich mit settimedate()?
                              Ja, weil er nur das Datum wollte (so hatte ich es verstanden).
                              offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                              Enertex Produkte kaufen

                              Kommentar

                              Lädt...
                              X