Ankündigung

Einklappen
Keine Ankündigung bisher.

Wert 0 beim Auslesen einer nichtexistenten GA

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

    [wiregate] Wert 0 beim Auslesen einer nichtexistenten GA

    Welcher Wert wird bei knx_read zurückgegeben, wenn die Adresse nicht antwortet? In meinem Plug-In (s. Code) lese ich die bei mir nicht existente Adresse "13/3/31" aus und befülle damit eine Variable, die ich zuvor mit dem Wert -1 besetzt habe. Ich frage die Variable ab und es wird anscheinend immer der Wert 0 erkannt.

    Wie prüft man in einem Plug-In, ob ein gültiger Wert gelesen wurde?

    Code:
    # Plug-In Kaminkesselpumpe
    # V20120611
    
    my $kaminkesseltemp_ga = "4/1/4";
    my $kaminkesseltemp_ist_wert;
    my $kaminkesseltemp_soll1_wert = 80;
    my $kaminkesseltemp_soll2_wert = 60;
    my $kaminpumpeschalter_ga = "13/3/31";
    my $kaminpumpeschalter_ist_wert = -1;
    my $puffertemp7_ga = "1/2/3";
    
    $plugin_subscribe{$kaminkesseltemp_ga}{$plugname} = 1;
    
    if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $kaminkesseltemp_ga) {
      $kaminkesseltemp_ist_wert = $msg{'value'};
    }
    $kaminpumpeschalter_ist_wert = knx_read($kaminpumpeschalter_ga, 0);
    
    if ($kaminpumpeschalter_ist_wert == 0) {
      if ($kaminkesseltemp_ist_wert >= $kaminkesseltemp_soll1_wert) {
        if (knx_read($puffertemp7_ga, 0) < $kaminkesseltemp_ist_wert ){
          knx_write($kaminpumpeschalter_ga, 1);
          return "Kaminpumpe einschalten";
        }
      }
    }
    elsif ($kaminpumpeschalter_ist_wert == 1) {
      if ($kaminkesseltemp_ist_wert <= $kaminkesseltemp_soll2_wert or $kaminkesseltemp_ist_wert <= knx_read($puffertemp7_ga, 0)) {
        knx_write($kaminpumpeschalter_ga, 0);
        return "Kaminpumpe ausschalten";
      }
    }
    else {
      return "Statuswert auslesen von " . $kaminpumpeschalter_ga . " nicht möglich.";
    }
    return;
    Gruß
    Karsten

    #2
    Ich kämpfe seit dem Update auf PL30-32 auch mit diesen Themen.

    Ich hatte einige knx_read (xyz_ga) || 1 ohne Angabe von maxAlter und DPT. Diese liefern seit dem Update keine Antwort (früher "0" glaube ich). Daher hat bei mir immer das ||1 zugeschlagen.

    Bisher war die Lösung immer die Angabe von knx_read(xyz_ga, maxAlter, DPT), dann läufts wieder (siehe auch WG Hilfe unter F1).

    Vielleicht kann Makki zu den Änderungen in PL30-32 noch was ergänzen.

    lg Robert

    Kommentar


      #3
      Zitat von Robert_Mini Beitrag anzeigen
      Bisher war die Lösung immer die Angabe von knx_read(xyz_ga, maxAlter, DPT), dann läufts wieder
      Geändert auf
      Code:
      $kaminpumpeschalter_ist_wert = knx_read($kaminpumpeschalter_ga, 5, 1);
      Jetzt bekomme ich mal etwas im eib.log zu sehen
      Code:
      2012-06-11 19:36:13.955,A_GroupValue_Read,1.1.254,13/3/31,00,,,,0,low,7,T_DATA_XXX_REQ,0
      Allerdings ist die GA frei erfunden und existiert gar nicht, somit gibt's natürlich auch kein Response. Wieso bekommt meine Variable trotzdem den Wert 0 und nicht NULL bzw. behält ihren ursprünglichen Wert?
      Gruß
      Karsten

      Kommentar


        #4
        knx_read liefert eigentlich (bei definiertem DPT und n/a GA) schon immer NULL (was nicht gleich "0" ist, kommt aber drauf an wie man es vergleicht! Perl-magic..)
        in PL30+ hat sich nur das (vorher eigentlich inkonsistente) handling bei unbekannten DPT geändert.

        "safe" ist zuweisen und "defined", so kann man z.B. NULL von "0" unterscheiden; spielt zwar vornedran keine Rolle aber hinten ist auch gut zu wissen: vom Bus gelesen wird nur genau 1x bei einem Fehlschlag bleibts dabei! Der Rest kommt ausm cache..

        Makki
        EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
        -> Bitte KEINE PNs!

        Kommentar


          #5
          Zitat von makki Beitrag anzeigen
          kommt aber drauf an wie man es vergleicht!i
          So wie es aussieht führt eine undefinierte Variable == 0 zu True.
          Zitat von makki Beitrag anzeigen
          "safe" ist zuweisen und "defined", so kann man z.B. NULL von "0"
          Zusätzlich eingerahmt in
          Code:
          if (defined $kaminpumpeschalter_ist_wert) { ... }
          klappt es nun.
          Gruß
          Karsten

          Kommentar


            #6
            Zitat von kisenberg Beitrag anzeigen
            So wie es aussieht führt eine undefinierte Variable == 0 zu True.
            Nö, aber wenns 0°C hat wirds "false", selber schon als Bug reingefallen
            (es kommt aber darauf an, wie man es vergleicht, der string "Null" ist > 0 also "true"..)

            knx_read liefert jedenfalls "NULL" zurück wenn Lesefehler, ist auch genau so beabsichtigt.. Für diese Feinheiten kann ich nix

            Makki
            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
            -> Bitte KEINE PNs!

            Kommentar


              #7
              Zitat von makki Beitrag anzeigen
              der string "Null" ist > 0 also "true"
              Bei einem String kann man damit leben, aber nicht bei dem Wert NULL.
              Code:
              # Hier wird nix zurückgeliefert, was beim Vergleich eines undefinierten Wertes ja auch korrekt ist.
              $plugin_info{$plugname.'_cycle'} = 5;
              return 0 < knx_read("13/3/31", 0);
              Bei meinem Plug-In (s. erster Post) weise ich den nicht existenten Wert aus knx_read einer Variablen zu, die ich auf Gleichheit (== 0) teste. Das ergibt dummerweise True. Selbst wenn ich direkt knx_read mit 0 vergleiche passiert das.

              Folgende Plug-Ins verdeutlichen dies:
              Code:
              # Hier wird alle fünf Sekunden 1 zurückgeliefert, obwohl das Ergebnis von knx_read undefiniert ist.
              $plugin_info{$plugname.'_cycle'} = 5;
              return 0 == knx_read("13/3/31", 0);
              Code:
              # Hier wird nix zurückgeliefert, was beim Vergleich eines undefinierten Wertes ja auch korrekt ist.
              $plugin_info{$plugname.'_cycle'} = 5;
              return 1 == knx_read("13/3/31", 0);
              Code:
              # Hier wird wieder 1 zurückgeliefert. Darf aber auch nicht sein.
              $plugin_info{$plugname.'_cycle'} = 5;
              return 1 != knx_read("13/3/31", 3, 1);
              Zitat von makki Beitrag anzeigen
              knx_read liefert jedenfalls "NULL" zurück wenn Lesefehler, ist auch genau so beabsichtigt.. Für diese Feinheiten kann ich nix
              Glaub ich Dir. Ist wohl eine Perl-Feinheit, die man beachten muss.

              Was mich allerdings noch verwundert. Bei knx_read(<GA>, 0) wird doch immer der Cache abgefragt und wenn darin für die GA nichts zu finden ist, wird der Bus befragt, richtig? Wenn ja: Warum sehe ich dann bei knx_read("13/3/31", 0) keine Abfrage auf dem Bus? Ein Cache-Wert existiert ja nicht? Bei knx_read("13/3/31", 1) wird ein Read-Telegramm versendet.
              Gruß
              Karsten

              Kommentar


                #8
                knx_read("13/3/31", 0)
                0 = beliebiges Alter im Cache -> kein Lesetelegramm
                vgl. hier: https://knx-user-forum.de/229922-post2.html

                knx_read("13/3/31", 1)
                1 = Cache-Alter 1 Sekunde ... wird es nicht geben, daher das Lesetelegramm so meine Vermutung
                vgl. hier: https://knx-user-forum.de/224686-post5.html

                Vielleicht ist das der Ansatz ???
                Umgezogen? Ja! ... Fertig? Nein!
                Baustelle 2.0 !

                Kommentar


                  #9
                  Zitat von JuMi2006 Beitrag anzeigen
                  Vielleicht ist das der Ansatz ???
                  Danke, kommt hin. Wieder was gelernt.
                  Gruß
                  Karsten

                  Kommentar


                    #10
                    So, und für "undefiniert == 0" ist True haben wir's nun auch:
                    "An undefined variable will be interpreted as 0 in an operation, if a numerical value is expected." (vgl. "undef" Value and Undefined Variables)

                    In meinem Script werde ich nun einfach den Wert als skalaren String abfragen:
                    Code:
                    if ($kaminpumpeschalter_ist_wert == "0") {
                    Gruß
                    Karsten

                    Kommentar


                      #11
                      Ähm der Syntax
                      Code:
                      return 1 == knx_read("13/3/31", 0);
                      Ist mir ziemlich suspekt, das mag was tun, aber was=? (und das könnte auch noch vom Kontext der Verwendung abhängen)
                      if, Klammern, all sowas machen das deterministischer

                      Und richtig: gelesen vom Bus wird nur einmalig - bei Fehlschlag erfolgen keine weiteren Leseversuche

                      Makki
                      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                      -> Bitte KEINE PNs!

                      Kommentar


                        #12
                        Zitat von makki Beitrag anzeigen
                        Ist mir ziemlich suspekt, das mag was tun, aber was=?
                        Die genanten Zeilen Code liefern per Return das Ergebnis des Vergleichs. n == m ergibt entweder True oder False und das ganze landet per Return im Log. Mehr soll in den gezeigten Beispielen auch nicht passieren. Es diente dazu herauszufinden, wie Perl undefinierte Variablen mit Vergleichsoperanden behandelt.
                        Gruß
                        Karsten

                        Kommentar


                          #13
                          Du findest dabei nur möglicherweise auch erstmal nur heraus, wie Perl gültige, aber seltene Syntax behandelt

                          Makki
                          EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                          -> Bitte KEINE PNs!

                          Kommentar

                          Lädt...
                          X