Ankündigung

Einklappen
Keine Ankündigung bisher.

Misterhouse Coding question

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

    Misterhouse Coding question

    Hallo,

    mit dem aktuellen MH-Build können EIB-Objekte mit dem Parameter DO = "displayonly" erzeugt werden. Beispiel:

    EIB1, 1/1/11, Lamp, Lamps, R|DO

    Wie kann ich Objekte abfragen, ob "displayonly" gesetzt ist oder nicht?
    Ich finde keine Methode dafür.

    Wäre für Hilfe dankbar.

    Gruß,
    thoern

    #2
    Es gibt keine Methode um diese Eigenschaft abzufragen. Diese Eigenschaft bewirkt, dass das Item keine States hat. Somit kann man es im Browser nicht dazu bringen irgendwas zu senden.
    Das führt auch dazu, dass get_states eine leere Liste liefert.

    Intern, d.h. in einem EIB-Item kannst du natürlich $self->{displayonly} abfragen.

    Mike

    Kommentar


      #3
      Hi Mike,

      ich überarbeite gerade meine MisterEIB-Weboberfläche. Bei EIB1-Items erzeugt diese Links für "On" und "Off". Diese Links will ich natürlich nicht für Items haben, die als "displayonly" gekennzeichnet sind.

      Naja, werde ich wohl den code in EIB_Items.pm um eine entspechende Methode erweitern müssen.

      Danke & Gruß,
      thoern

      Kommentar


        #4
        Das ist ja gerade der Sinn von DO :-). Wenn du also das Item nach den zu erzeugenden States fragts (get_states), dann wird dir ein read-write EIB1_Item mit "off", "on" antworten. Das DO-EIB1_Item wird nichts sagen. Dementsprechend erzeugst du die Links ...

        Mike

        Kommentar


          #5
          Hallo Mike,

          in der MH-Doku stehts ja. Man muss nur lesen können und das gelesene entsprechend verarbeiten
          ...
          get_states : Returns the list of valid states
          ...

          Vielen Dank, für den Hinweis!
          Ich vermute mal, dass get_states bei einem DO-Object "undef" zurückgibt...

          Gruß,
          thoern

          Kommentar


            #6
            Zitat von mike Beitrag anzeigen
            Es gibt keine Methode um diese Eigenschaft abzufragen. Diese Eigenschaft bewirkt, dass das Item keine States hat. Somit kann man es im Browser nicht dazu bringen irgendwas zu senden.
            Das führt auch dazu, dass get_states eine leere Liste liefert.
            Mike
            Uuups, schon wieder nicht richtig gelesen.
            Beim DO-Objekt wird also nicht "undef" zurückgegeben, sondern eine leere Liste...

            Der Teufel steckt wie üblich im Detail...

            thoern

            Kommentar


              #7
              Hi,

              leider wird bei einem "displayonly"-Object weder undef noch eine leere Liste zurückgegeben. Die Ausführung des folgende Skriptes
              Code:
              if ($Startup) {
                  $DG_Gang_Lampenstatus =  new EIB1_Item('3/3/0', 'R|DO');
              }
              
              my @valid_states = $DG_Gang_Lampenstatus->get_states;
              
              print "valid states:\n";
              foreach (@valid_states) {
                  print "$_\n";
              }
              
              
              exit;
              führt zu dieser Fehlermeldung:
              Code:
                04/12/10 07:03:21 PM: Can't use an undefined value as an ARRAY reference at /usr/local/misterhouse/bin/../lib/Generic_Item.pm line 571.
              Und die Zeile 571 ist genau die return Zeile der get_states-Methode:
              Code:
              sub get_states {
                  my ($self) = @_;
                  return @{$$self{states}};
              }
              Ich würde mal sagen, ist mal wieder grottig implementiert

              Gruß,
              thoern

              Kommentar


                #8
                Hi,

                will meine Erkenntnisse nicht für mich behalten. Vielleicht haben andere ja ähnliche Probleme.
                Also, wie bereits beschrieben, führt der Aufruf der Methode get_states bei einem Objekt, das als "displayonly" gekenntzeichnet ist, zu einem Laufzeitfehler. Die Ursache liegt in der addStates-Methode in EIB_Items.pm des aktuellen MH-Builds:

                Code:
                sub addStates {
                  my $self = shift;
                  push(@{$$self{states}}, @_) unless $self->{displayonly};         
                }
                => Wenn "displayonly" gesetzt ist, wird die Referenz $$self{states} nicht erzeugt. Wird aber später get_states aufgerufen, wird genau diese Referenz benötigt, was zu einem Laufzeitfehler führt.

                Die Korrektur der Methode addStates sieht so aus:

                Code:
                sub addStates {
                  my $self = shift;
                  push(@{$$self{states}}, $self->{displayonly} ? () : @_ ); 
                }
                => Die Referenz zum Array wird hier immer erzeugt. Bei displayonly halt nur auf ein leeres Array.

                Gruß,
                thoern

                Kommentar

                Lädt...
                X