Ankündigung

Einklappen
Keine Ankündigung bisher.

Perl Code Problem Misterhouse

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

    Perl Code Problem Misterhouse

    Hallo zusammen,
    ich bräuchte mal einen Hinweis was ich hier wieder falsch gemacht habe!

    Code:
    if ($Szeneneingang_Luci eq 1 && state $Tagesaktivierung eq ON) {set $Szeneneingang_Jal_Luci 0};
    if ($Szeneneingang_Luci eq 1 && state $Tagesaktivierung eq OFF) {set $Szeneneingang_Jal_Luci 1}
    Der Hintergrund ist eine Helligkeitsabhängige Rollladenpositionierung mit Szenen, die Objekte $Szeneneingang_Luci, $Szeneneingang_Jal_Luciist sind 1byte und $Tagesaktivierung 1bit.

    Aufgerufen werden die Szenen in einem TS2+ der wiederum das Szenen Byte-Telegramm an mh sendet dieser soll dann anhand der Tagesaktivierung entscheiden welches Szenenbyte der JalAktor bekommen soll, oder hat jemand einen besseren Vorschlag für mich?

    Vielen Dank
    Christoph

    #2
    Ich bin mir nicht ganz sicher, aber ist "eq" nicht der Vergleichsoperator für Strings? Für Zahlen müsste "==" benutzt werden.

    Viele Grüße
    Jan-Hendrik

    Kommentar


      #3
      Zitat von chrismave Beitrag anzeigen
      ich bräuchte mal einen Hinweis was ich hier wieder falsch gemacht habe!
      Christoph, die Info's sind arg dürftig für eine brauchbare Antwort.
      Was passiert denn und was funktioniert nicht? Hast du mal ein paar "print_log" Anweisung eingebaut, um die Werte deiner Variablen zu prüfen?
      Im einzelnen: Verstehe ich dich richtig, dass $Szeneneingang_Luci als EIB6 und $Tagesaktivierung als EIB1 definiert sind? Und der Wert von $Szeneneingang_Luci ist nach dem drücken des TS2 mit dem Wert "1" belegt? Ungünstig in deiner Abfrage ist auf jeden Fall, dass eine der beiden Abfragen in jedem MH-Durchlauf TRUE ist und daher dein Wert für $Szeneneingang_Jal_Luci bei jedem Durchlauf auf den BUS gesendet wird -- da erzeugst du unnötig BUSlast.
      Füge erst einmal ein paar Print-Anweisungen der Art:
      Code:
      print_log sprintf("###: state Szeneneingang_Luci =%s",(state $Szeneneingang_Luci ));
      und schicke am Besten auch die Ausgaben mit.
      Gruß,
      Marc

      Kommentar


        #4
        Zitat von aggie89go Beitrag anzeigen
        Christoph, die Info's sind arg dürftig für eine brauchbare Antwort.
        Hallo Marc,
        sorry habe lange nichts von mir hören lassen, hatte keine Zeit und Geduld mich nochmals damit auseinander zu setzen.

        Aber irgendwie lies es mich doch nicht los und siehe da, heute habe ich es zum laufen bekommen, weis allerdings immer noch nicht wie ich das hin bekommen habe, vieleicht kannst du (oder jemand anderes) mir mal anhand meiner Zeilen die einzelnen Dinge erklären, zuerst mein Code und dann meine Fragen dazu:
        Code:
        #Helligkeitsabhängige Rollladenpositionen über Szenenaufruf
        
        tie_event $Szeneneingang_Luci 'if ($state eq 1 && state $Tagesaktivierung eq ON)
         {set $Szeneneingang_Jal_Luci 0}';
        tie_event $Szeneneingang_Luci 'if ($state eq 1 && state $Tagesaktivierung eq OFF)
         {set $Szeneneingang_Jal_Luci 1}';
        tie_event $Szeneneingang_Luci 'if ($state eq 2 ) {set $Szeneneingang_Jal_Luci 2}';
        tie_event $Szeneneingang_Luci 'if ($state eq 3 ) {set $Szeneneingang_Jal_Luci 3}';
        1. Ein tie_event erfolgt mit einer einfach Ausführung nach einer bestimmten Definition, richtig?

        2. Was ist der unterschied zwischen "eq" und "=" ?

        3. Warum muss ich den "state" einmal mit "$" und einmal ohne verwenden?

        4. Könnte ich sogar noch eine weitere Verknüpfung mit "&&" einfügen?

        Ich hoffe ich habe mich verständlich ausgedrückt.

        Vielen Dank
        Christoph

        Kommentar


          #5
          Hallo Christoph,

          lange nichts von dir gehört -- ich hoffe es geht dir gut!

          Zum "tie_event": Hiermit verknüpfst du ein generisches item (hier: $Szeneneingang_Luci) mit dem Code der zwischen den ' ... ' steht. Also, immer wenn sich der Zustand / Wert von $Szeneneingang_Luci ändert, wird der Code ' ... ' ausgeführt.
          Die "tie_event" definitionen müssen also nur einmal erfolgen und werden daher typischerweise im 'noloop' Block definiert (sonst würdest du sie bei jedem Durchlauf, also tausende mal pro Sekunde neu definieren - was geht aber unnötig Resourcen bindet.

          "eq" bedeutet Textgleichheit, "==" bedeutet numerisch gleich.

          $abc sind in Perl immer Variablen, $state in einem "tie_event" ist dabei immer der Wert des Verknüpften items (bei dir also der Wert von $Szeneneingang_Luci). "state" hingegen liefert den Wert der darauffolgenden Variablen, also state $Tagesaktivierung den aktuellen Zustand von $Tagesaktivierung.

          Klar, du kannst mit && oder || weiter UND oder ODER Verknüpfungen hinzufügen und natürlich auch mit elseif etc. weitere Abfragen einbauen.
          Gruß,
          Marc

          Kommentar

          Lädt...
          X