Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS 19000153 Zeitformatierung/Addition: Falsche Ausgabe der Stunden

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

    LBS 19000153 Zeitformatierung/Addition: Falsche Ausgabe der Stunden

    Hallo Michael,
    entweder bediene ich den Baustein falsch, oder der Baustein mich ;-)

    Aktuelle Situation:
    Eingang 1: 14400
    Eingang 2: %H:%M:%S
    Eingang 3-6: leer

    Ausgabe am Ausgang 1: 05:00:00

    Ich würde jetzt am Ausgang 04:00:00 erwarten, da dies den 14400 Sekunden entsprechen würde.
    Wo liegt der Fehler?

    Gruß
    Wolfgang




    Angehängte Dateien

    #2
    So wie ich das verstehe muss an E1 ein PHP akzeptiertes Date/Time Format anliegen. 14400 ist nur eine Anzahl von Sekunden und kein gültiges Time Format.

    Du könntest vermutlich "0:0:0" auf E1 geben und 14400 auf E6. Wenn dann %R auf E2 anliegt, dann sollte "04:00" auf A1 rauskommen.

    Kommentar


      #3
      Hallo,
      gerade probiert, das funktioniert tatsächlich.
      Aber leider nur statisch, da nur E1 triggert.

      Kommentar


        #4
        du kannst ja den E1 mit einem eigenen Wertauslöser antriggern...
        Die Selbsthilfegruppe "UTF-8-Probleme" trifft sich diesmal abweichend im groüen Saal.

        Kommentar


          #5
          Oder wenn Du einfach nur Sekunden in den Zeitstempel HH:MM:SS umwandeln willst, dann mit einem einfachen LBS:

          PHP-Code:

          ###[DEF]###
          [name = Seconds2Time]
          [e#1=Seconds]
          [a#1=Time ]
          ###[/DEF]###

          ###[HELP]###
          ###[/HELP]###

          ###[LBS]###
          <?

          function LB_LBSID($id)
          {
              if ($E = getLogicEingangDataAll($id))
                  if ($E[1]['refresh'] == 1)
                      logic_setOutput($id,1,sprintf('%02d:%02d:%02d',
                          intval($E[1]['value']/3600 ),
                          intval((intval($E[1]['value']%3600))/60),
                          intval((intval($E[1]['value']%3600))%60)));
          }
          ?>
          ###[/LBS]###
          ###[EXEC]###
          <?
          ?>
          ###[/EXEC]###

          Kommentar


            #6
            Vielen Dank,
            ja den extra Baustein mit fast identischem Inhalt hab ich gerade auch entworfen, der funktioniert auch. Ich hab mir aber jetzt den 19000153 so angepasst, dass auch E6 triggert. Mir gefällt es besser, wenige universelle Bausteine zu verwenden, als viele spezielle.
            Liebe Grüße,
            Wolfgang

            Edit: hier ist noch mein Code:
            PHP-Code:
              ###[DEF]###
            [name        =  Sekunden in H:M:S (V0.1)    ]
            [e#1        = Sekunden    ]
            [a#1        = Zeit    ]
            ###[/DEF]###


            ###[HELP]###
            -initiale Version
            ###[/HELP]###


            ###[LBS]###
            <?
            function LB_LBSID($id)
            {
                if ($E = logic_getInputs($id)) {
                    if ($E[1]['refresh'] == 1) {
                        $sec = $E[1]['value'];
                        setLogicLinkAusgang($id, 1, LB_LBSID_readable_time($sec));
                    }
                }
            }

            function LB_LBSID_readable_time($gesamt_sekunden)
            {
                $hours = sprintf("%02d", $gesamt_sekunden / (60 * 60) % 3600);
                $minutes = sprintf("%02d", ($gesamt_sekunden / 60) % 60);
                $seconds = sprintf("%02d", $gesamt_sekunden % 60);
                $formatted_time = $hours . ":" . $minutes . ":" . $seconds;
                return $formatted_time;
            }

            ?>
            ###[/LBS]###


            ###[EXEC]###
            <?
            ?>
            ###[/EXEC]###
            Zuletzt geändert von woda; 18.12.2016, 17:52.

            Kommentar


              #7
              Hi,

              das liegt an den Zeitzonen, bzw an der flaschen Verwendung PHP interner Funktionen. Da es nur um Umrechnungen geht, sollte/koennte/muesste im Baustein die Zeitzone ignoriert werden, ist aber nicht so...
              Epochalzeit ist UTC - oder GMT, wenn man ganz genau sein will - davon sind wir grad +1h entfernt, dadurch kommt das zu Stande. Also Epochalzeit 1 ist laut Baustein (bzw PHP) auch 01:00:01 was jetzt zwar sachlich richtig aber so wohl nicht unbedingt das erwuenschte Ergebnis ist

              Ich pass das mal zeitnah an, in der Hoffnung dass dadurch nicht was anderes bricht

              danke :: Michael

              Kommentar


                #8
                Hallo Michael,
                danke für die Ursachenforschung und die Erklärung. Aktuell läuft es hier wie gewünscht. Der Baustein ist super praktisch und universell.
                LG, Wolfgang

                Kommentar


                  #9
                  Hi Wolfgang,

                  ich bin da noch mal "in mich" gegangen und zu dem Schluss gekommen, dass das Verhalten mit der Epochalzeit (die ja nun mal immer, quasi per Definition, in UTC ist) und der Ausgabe in lokaler Zeit (je nach Zone) so schon korrekt ist - auch wenn nicht immer so gewollt. Moechte man einfach eine Anzahl an Sekunden anders darstellen (was, so wie ich das verstanden habe, Dein Anliegen waere) stoert die Zeitzone, moechte man aber zum Beispiel Timestamps von irgendwas auswerten, ist die korrekte Zeitzone im Ergebnis schon wichtig.
                  Da mir nicht klar war, wie ich sowas sauber unterscheiden kann, gibts jetzt nen neuen Eingang, ist der gesetzt wird in UTC gerechnet - feddich

                  Auch das Triggern per E6 scheint mir - zumindest manchmal - sinnvoll zu sein, hab ich auch gleich eingebaut. Neue Version ist online.

                  dank & gruss :: Michael

                  Kommentar


                    #10
                    Hi Michael,
                    perfekt. Vielen Dank.

                    Kommentar


                      #11
                      wintermute Hi Michael!

                      Deinen LBS setze ich mit viel Freude ein!

                      Kannst du dir vorstellen, den Baustein um E8 (Locale = de_DE) zu erweitern? Die Idee dahinter: Flexibel die Regionaleinstellungen übergeben, damit z.B. Ausgaben wie
                      "Donnerstag, 28.12.2017" statt "Thursday, 28.12.2017"
                      möglich sind.

                      (Quick & Dirty) Codevorschlag anbei:

                      PHP-Code:
                      ###[DEF]###
                      [name        = Zeitformatierung/Addition (0.7)b ]

                      [e#1  TRIGGER    = Zeit                         ]
                      [e#2  OPTION    = Format    #init=%x, %X     ]
                      [e#3            =                             ]
                      [e#4  OPTION    = UTC Modus                    ]
                      [e#5  OPTION    = Trenner                    ]
                      [e#6  TRIGGER    = Modifikator                ]
                      [e#7  OPTION    = LogLevel    #init=0            ]
                      [e#8  TRIGGER    = Locale #init=de_DE        ]

                      [a#1    = Ausgabe ]
                      ###[/DEF]###


                      ###[HELP]###
                      Der Baustein formatiert eine Zeitangabe oder eine Liste von Zeitangaben mittels der PHP-internen Funktion strftime. Die &uuml;bergebene Zeit muss von PHP erkannt werden, Details dazu finden sich <a href="http://php.net/manual/de/datetime.formats.php" target="_blank">hier</a>.
                      Getriggert wird durch eine Zeitangabe an E1 (&ne;leer), die Ausgabe erfolgt an A1 in dem durch E2 angegebenen Format.
                      Ist E2 leer so wird an A1 der Unix-Timestamp (POSIX Zeit, also Sekunden seit Anfang 1970) ausgegeben. Diese Werte sind gut geeignet wenn mathematische Operationen mit Zeiten durchgef&uuml;hrt werden sollen.
                      Is E5 &ne;<i>"leer"</i> so wird E1 als durch dieses Zeichen getrennte Liste interpretiert. In diesem Fall wird auch an A1 wieder eine entsprechende Liste von formatierten Daten ausgegeben.
                      An E6 kann eine Liste von Werten (in Sekunden) angegeben werden die auf die jeweilige Zeit addiert werden, eine &Auml;nderung auf einen Wert (&ne;leer) triggert den Baustein.
                      An E7 kann ein Loglevel definiert werden.
                      An E8 kann die Wahl der regionalen Einstellungen (Locale) definiert werden.

                      <hr />
                      E1: umzurechnende Zeit(en)
                      E2: Ausgabeformat (Ausgabe als Unix-Timestamp falls leer)
                      E3: <strike>Zeitzone</strike>
                      E4: wenn nicht leer rechnet der Baustein in UTC, zum Beispiel zur Umrechnung von Sekunden in Stunden, oder &auml;nlichem
                      E5: Trennzeichen
                      E6: Modifikator(en) in Sekunden
                      E7: LogLevel
                      E8: Locale

                      A1: formatierte Ausgabe

                      <hr />
                      <b><u>Changelog:</u></b>
                      0.1:
                      -initiale Version

                      0.2:
                      -Unterst&uuml;tzung f&uuml;r Epochalzeit zugef&uuml;gt
                      -Hilfetext erweitert

                      0.3:
                      -Unterst&uuml;tzung f&uuml;r Listen zugef&uuml;gt
                      -Fehler bei der Verarbeitung von Epochalzeiten korrigiert

                      0.4:
                      -M&ouml;glichkeit zum Addieren/Subtrahieren von Werten
                      -Umstellung auf Custom Logging (es wird eine Edomi Version &gt;= 1.32 ben&ouml;tigt)

                      0.5:
                      -Locale und Zeitzonen Einstellungen entfernt
                      -Log-Ausgaben eingedeutscht

                      0.6:
                      -mehrere Bugs behoben (thx@DirtyHarry)
                      -Eingangsbeschreibung zugef&uuml;gt
                      -Code bereinigt
                      -Ohne Formatvorgabe an E2 wurde der Modifikator an E6 ignoriert
                      -Baustein ist jetzt UTF-8 frei

                      0.7:
                      -E4 zum Rechnen in UTC zugef&uuml;gt (thx@woda)
                      -E6 (&ne;leer) triggert den Baustein (thx@woda)
                      -Hilfetext korrigiert

                      ###[/HELP]###


                      ###[LBS]###
                      <?
                      function LB_LBSID($id) {
                          if ($E=getLogicEingangDataAll($id)) {
                              setlocale (LC_ALL, $E[8]);
                              if (($E[1]['refresh'] && $E[1]['value']!="") || ($E[6]['refresh'] && $E[6]['value']!="")) {
                                  $E[5]['value']=="" ? $e=array($E[1]['value']) : $e=explode($E[5]['value'],$E[1]['value']);
                                  $a=array(); $i=0;
                                  foreach ($e as $t) {
                                      if (($time=strtotime($t))===FALSE && !ctype_digit(strval($t))) {
                                          LB_LBSID_debug($id,"Eingangswert '".$t."' (Index $i) nicht erkannt",0);
                                          $a[]=$t;
                                      } else {
                                          ctype_digit(strval($t)) ? $time=$t+0 : $time=strtotime($t);
                                          if (!$E[2]['value']) {
                                              $a[]=$time+$E[6]['value']+0;
                                          } else {
                                              if (($out=strftime($E[2]['value'],$time+($E[6]['value']+0)))===FALSE) {
                                                  LB_LBSID_debug($id,"Ausgabeformat '".$E[2]['value']."' nicht erkannt",0);
                                                  $a[]=$t;
                                              } else {
                                                  ($E[4]['value']!="") ? $a[]=gmstrftime($E[2]['value'],$time+$E[6]['value']+0) : $a[]=strftime($E[2]['value'],$time+$E[6]['value']+0);
                                              }
                                          }
                                      }
                                      $i++;
                                  }
                                  setLogicLinkAusgang($id,1,join($E[5]['value'],$a));
                              }
                          }
                      }

                      function LB_LBSID_debug($id,$s,$l=6) {
                          $a=array("Emergency","Alert","Critical","Error","Warning","Notice","Informational","Debug");
                          $E=getLogicEingangDataAll($id);
                          $DEBUG=$E[7]['value'];
                          $l<$DEBUG && writeToCustomLog("LBSLBSID",$l,"(ID$id) ".$a[$l].": ".$s);
                      }
                      ?>
                      ###[/LBS]###


                      ###[EXEC]###
                      <?
                      ?>
                      ###[/EXEC]###
                      Besten Dank!
                      LG

                      Kommentar


                        #12
                        Da gab es doch mal was: https://knx-user-forum.de/forum/proj...374#post943374

                        Kommentar


                          #13
                          Hmm, danke für den Hinweis vento66! Aber warum wurde das Feature entfernt?

                          Kommentar


                            #14
                            Irgendwo hier in den tiefen des Forums sicher zu finden, aber da ging es irgenwie darum das Edomi das gar nicht mag, wenn man in den locale rumschreibt.

                            Kommentar


                              #15
                              Das ist eigenartig. Meines Wissens ist die locale bei meiner Installation (CentOS) auf "de_DE" gestellt. Dennoch ist die PHP-Ausgabe stets Englisch...

                              Kommentar

                              Lädt...
                              X