Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Perl Problem mit if ($delta_Zeit > 0)

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] - √ - Perl Problem mit if ($delta_Zeit > 0)

    Hallo zusammen!

    Ich kämpfe gerade mit einem Problem, das ich mich fast nicht posten traue, aber irgendwie tut das grad nicht, wie's sollte.

    Folgender Code funktioniert tadellos, nur das auskommentierte "if ($delta_Zeit > 0)" wird nie true und daher kein "$Leistung_5min_avg" berechnet. So wie gepostet läuft das Plugin stabil, nur division durch 0 ist nicht abgefangen.

    In anderen Plugins laufen diese abfragen, ich bin ratlos.

    Wer hat eine Idee, ich habe schon einiges probiert (!=0 etc.)
    lg Robert

    Code:
    ##--------- Stromzaehler --------- ##
    # Zaehlerstand und Zeit aus Stromzaehlerplugin lesen
    my $Zaehlerstand_aktuell = $plugin_info{'Stromzaehler_Haus_Zaehlerstand'};
    my $Zeit_ZS_akt = $plugin_info{'Stromzaehler_Haus_ZS_tlast'};
    
    my $old_ZS =  $plugin_info{$plugname.'_Zaehlerstand_last'};
    my $old_t = $plugin_info{$plugname.'_Zeit_ZS_last'};
    my $delta_kWh = ($Zaehlerstand_aktuell - $plugin_info{$plugname.'_Zaehlerstand_last'});
    my $delta_Zeit = $Zeit_ZS_akt - $plugin_info{$plugname.'_Zeit_ZS_last'};
    
    $plugin_info{$plugname.'_Zaehlerstand_last'} = $Zaehlerstand_aktuell;
    $plugin_info{$plugname.'_Zeit_ZS_last'} = $Zeit_ZS_akt;
    
    my $Leistung_5min_avg = 0;
    #if ($delta_Zeit > 0) {
      my $Leistung_5min_avg = (1000.0 * $delta_kWh*3600.0) / $delta_Zeit;
    #}
    update_rrd("Stromzaehler_Haus_P_akt","",$Leistung_5min_avg);
    update_rrd("Stromzaehler_Haus_Zaehlerstand","",$Zaehlerstand_aktuell);

    #2
    Hallo Robert

    Kann es sein, dass wie Variabel als String interpretiert wird? Dann müsste es eher so lauten:

    Code:
    if ($delta_Zeit ne '0'){
    ...
    }
    Gruss Patrik alias swiss

    Kommentar


      #3
      Zitat von swiss Beitrag anzeigen
      Hallo Robert
      Kann es sein, dass wie Variabel als String interpretiert wird?
      Danke Patrik!

      Leider nein (hab's grad getestet).

      Wenn das if auskommentiert ist, liefert das return
      Code:
      return "Zaehlerstand $Zaehlerstand_aktuell Zeit_ZS $Zeit_ZS_akt P_akt $Leistung_5min_avg d_kWh $delta_kWh delta_Zeit $delta_Zeit";
      Zaehlerstand 12792.161 Zeit_ZS 1343586087.28687 P_akt 425.003925016862 d_kWh 0.00499999999919964 delta_Zeit 42.3525500297546

      $delta_Zeit wird ja aus differenz zweiter Zeiten gebildet, die jeweils zu verschiedener Zeit mit time() belegt werden.

      Warum 42.352... nicht > 0 sein soll, ist mir weiterhin ein Rätsel.

      Danke und lg
      Robert

      Kommentar


        #4
        Versuch mal:

        Code:
        if ($delta_Zeit <= '0'){
        ...
        }

        Aber hast Du bestimmt auch schon durch ...

        Ansonsten arbeite mal nicht mit return fürs Debuggen sondern (Wenn nötig Zeilenweise):
        Code:
        plugin_log($plugname, "Freitext: $delta_Zeit");
        So kann man den Fehler besser einkreisen.
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          #5
          Zitat von JuMi2006 Beitrag anzeigen
          Versuch mal:
          Code:
          if ($delta_Zeit <= '0'){
          ...
          }
          Code:
          plugin_log($plugname, "Freitext: $delta_Zeit");
          So kann man den Fehler besser einkreisen.
          Danke, leider auch ohne Erfolg.

          Zeilenweise bin ich schon durch (mit return an versch. Stellen), danke für den Tipp mit dem plugin_log!!!

          In der Zeile vor dem if hat $delta_Zeit einen Wert deutlich von 0 verschieden (selbst gerundet oder mit int() gewandelt).

          Auch if (int($delta_Zeit) > 0) wird nicht true. Ich versteh's echt nicht mehr.
          if ((time() - $time_last) > 0) verwende ich doch regelmäßig (nicht nur ich vermute ich mal)...

          lg Robert

          Kommentar


            #6
            Prüf doch mal mit plugin_log ob er in die "Schleife" springt und nicht bei my $Leistung_5min_avg = (1000.0 * $delta_kWh*3600.0) / $delta_Zeit; irgendwas falsch läuft.

            Also:
            Code:
            my $Leistung_5min_avg = 0;
            plugin_log($plugname, "delta 1: $delta_Zeit");
            if ($delta_Zeit <= '0') {
            plugin_log($plugname, "delta 2: $delta_Zeit");
              my $Leistung_5min_avg = (1000.0 * $delta_kWh*3600.0) / $delta_Zeit;
            plugin_log($plugname, "delta 3: $delta_Zeit");
            }
            plugin_log($plugname, "delta 4: $delta_Zeit");
            tippe auch mal das else {}
            Umgezogen? Ja! ... Fertig? Nein!
            Baustelle 2.0 !

            Kommentar


              #7
              Mit plugin_log bekomme ich (1. Zeile) das gleiche wie vom return nach dem if-Befehl (2. Zeile).
              [ACHTUNG]2012-07-29 21:01:28.163,Datenerfassung_3,delta_Zeit: 142.963969945908
              2012-07-29 21:01:28.174,Datenerfassung_3,Zaehlerstand 12792.614 Zeit_ZS 1343588483.07321 P_akt 0 d_kWh 0.0280000000002474 delta_Zeit 142.963969945908,0s,[/ACHTUNG]
              Schon eigenartig.
              Robert

              Kommentar


                #8
                Ich hatte nen Fehler drin das muss natürlich > statt <= sein.
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #9
                  Ich hab's jetzt gefunden.

                  Code:
                  my $Leistung_5min_avg = (1000.0 * $delta_kWh*3600.0) / $delta_Zeit;
                  wird offensichtlich innerhalb der { } als lokale Variable angelegt.
                  Nachdem ich "$Leistung_5min_avg" auch außerhalb der { } angelegt habe, bleibt dieser Wert logischerweise 0.

                  Die if-Schleife wurde immer ausgeführt, aber "$Leistung_5min_avg" blieb 0.

                  Der Trick mit plugin_log hat's schließlich gezeigt => 4x log-Eintrag, d.h. auch if wurde ausgeführt.

                  Der Post dazwischen ist zeitgleich mit deinem (JuMi2006) entstanden, da hatte ich nur ein plugin_log hinzugefügt.

                  Plugin_log nach jeder Zeile => dann war's klar, da innerhalb der {} der Wert richtig belegt wurde.
                  Will gar nicht dran denken, wieviel Zeit mich dieser Mist grad gekostet hat.

                  Danke an alle, die hier Ideen geliefert und zur Lösung beigetragen haben!!!
                  Robert

                  PS: Das nächste Mal teste ich gleich mit return aus der Schleife, dann sind solch falsche Fährten ausgeschlossen.

                  Kommentar


                    #10
                    Hab ich (auch Perl Anfänger) genauso hart gelernt .
                    Seitdem schrumpfen meine Plugins nach Fertigstellung um 50% der Zeilen .

                    Ich hab mir angewöhnt bei jedem Plugin meine eigenen Variablen erstmal zu definieren:

                    my ($var1,$var2,$var3,$var4,....);

                    Beim Umstieg auf ein Config-File (conf.d) macht es das auch einfacher. Im *.conf wird auf das "my" verzichtet. Im Plugin wird dann zuerst der Berg an Variablen definiert und danach die *.conf eingelesen.
                    Umgezogen? Ja! ... Fertig? Nein!
                    Baustelle 2.0 !

                    Kommentar

                    Lädt...
                    X