Über Button Encoder Optionen öffnen

Das war ich, der das verbrochen hat. Es gibt keine Funktion, mit der Du den Zustand direkt abfragen kannst (schon lange auf der Wunschliste, @Torben weiß das), sondern Du mußt mittels Timer den Zustand der Verbindung abfragen. Hier ist ein Code, den ich mal für @UliNobbe geschrieben hatte und der den Charme hat, daß man beliebig viele Encoderverbindungen abfragen kann, ohne eingeben zu müssen, wieviele insgesamt. Die Routine läßt eine Lampe leuchten, wenn mindestens eine der Verbindungen besteht:

const
  BUTTONNAME = 'OnAirStatus';   // <-- Hier Namen des Buttons eintragen.

var
  Recurring: boolean;
  EncoderStatus: Array[0 .. 255] of boolean;

procedure OnLoad;
begin
  EnableTimer(1000);
end;

procedure OnTimer;
var
  Test: boolean;
  i, k: integer;
begin
  try
    for i := 0 to 255 do
    begin
      if Encoder.GetConnections.GetItem(i).GetState = ecsConnected then
      begin
        EncoderStatus[i] := true;
      else
        EncoderStatus[i] := false;
    end;      
  except 
    k := i - 1;
  end;
  for i := 0 to k do  
  begin
    Test := true;
    if NOT EncoderStatus[0] AND (EncoderStatus[i] = EncoderStatus[i + 1]) then
    begin
      Test := false;
      Break;
    end;    
  end; 
  if Recurring <> Test then 
    if Test then
      ExecuteCommand(BUTTONNAME + ' ON') 
    else
      ExecuteCommand(BUTTONNAME + ' OFF'); 
  Recurring := Test;
end;

Mit zwei Verbindungen getestet, müßte aber auch mit mehreren gehen. Das Konzept sollte sich auf mehrere Buttons aufbohren lassen. (Martins Skript habe ich gerade nicht zur Hand.)

Abgefragte Grüße

TSD

Sorry @Tondose , daß ich nochmal nachhaken muss. Wenn ich das Script starte, dann bekomme ich einen Fehler angezeigt.

[Error] (24:7): Identifier expected

Wenn ich das noch richtig in Erinnerung habe würde hier der Fehler in Zeile 24 sein, aber dort befindet sich die Schleifenabfrage und ich weiss nicht, was ich verkehrt mache.

Geht das nur mit bestimmten Buttontypen?
Als BUTTONNAME habe ich die Bezeichnung des Buttons probiert, sowohl auch die ID vom Button.

Kannst Du mir da bitte noch einmal helfen?

Lieb fragende Grüße
Nick

Hier muß das Semikolon weg! Sorry! (Hatte vorher noch was rumprobiert. Man soll von funktionierenden Sachen die Finger lassen!) Der Button muß heißen wie in der zweiten Zeile angegeben, in diesem Beispiel OnAirStatus. Heißt Dein Button („ID für Fernsteuerung“) etwa HERBERT, so muß die zweite Zeile lauten

BUTTONNAME = 'HERBERT';

Anführungen nicht vergessen.

Korrigierte Grüße

TSD

Hier ist die Überwachung für mehrere Steams mit mehreren Buttons. Diese müssen heißen <ButtonName>.0, <ButtonName>.1 usw., so viele wie Encoder vorhanden sind, und zwar nullbasiert – der erste Encoder hat die Numero 0.

const
  BUTTONNAME = 'OnAirStatus';   // <-- Hier Namen des Buttons eintragen.

var
  EncoderStatus: Array[0 .. 255] of boolean;

procedure OnLoad;
var
  i: integer;
begin
  for i := 0 to 255 do
    EncoderStatus[i] := false;
  EnableTimer(1000);
end;

procedure OnTimer;
var
  Test: boolean;
  i, k: integer;
begin
  Test := false;
  try
    for i := 0 to 255 do
    begin
      if Encoder.GetConnections.GetItem(i).GetState = ecsConnected then
      begin
        if NOT EncoderStatus[i] then
        begin
          EncoderStatus[i] := true;
          Test := true;
        end; 
      end
      else
        begin
          if EncoderStatus[i] then
          begin
          Test := true;
          EncoderStatus[i] := false;
        end;
      end;
    end; 
  except
    k := i - 1;
  end;
  if Test then
  begin
    for i := 0 to k do
    begin
      if EncoderStatus[i] then
        ExecuteCommand(BUTTONNAME + '.' + IntToStr(i) + ' ON') 
      else
        ExecuteCommand(BUTTONNAME + '.' + IntToStr(i) + ' OFF'); 
     end;
  end;
end;


Vereinzelte Grüße

TSD

Hi @Tondose,

erst einmal vielen Dank für Deine ganze Hilfe. Das mit dem zweiten Script zur Überwachung mehrerer Streams mit mehreren Buttons klingt als passend für mich.

Ich sehe offenbar aber den Wald vor lauter Bäume nicht, weil ich es gerade nicht hinbekomme. Du wirst jetzt bestimmt die Hände über dem Kopf zusammenschlagen.

Das Script muss ich wahrscheinlich als Hintergrundscript laufen lassen. Oder?

Dann kommt die nächste Hürde. Was für einen Button soll ich nutzen (normaler Button oder erweiterter Button)?

Mir ist auch nicht ganz klar, muss dann bei dem Feld “ID für Fernsteuerung” folgendes eingetragen werden (<ButtonName>.0,) ohne bei “ButtonName” was anderes zu vergeben oder muss ich da nur die “0” für den ersten Encoder eintragen? Was muss ich da eintragen?

Muss ich im Script dann auch noch Sachen ändern?

Ich probiere hier vieles hin und her, aber es will nicht laufen.
Es wäre cool, wenn Du mir da noch einmal unter die Arme greifen könntest.

Abendliche hilfesuchende Grüße
Nick

Du nimmst pro Stream einen erweiterten Button. Um beim obigen Beispiel zu bleiben, nennst Du sie HERBERT.0, HERBERT.1, HERBERT.2 usw. Die zweite Zeile im Skript heißt unverändert

 BUTTONNAME = 'HERBERT';

Das Skript wird als Hintergrundskript installiert. Es dient nur der Anzeige der Stati. Sollen die Buttons auch noch schalten, mußt Du die entsprechenden Befehle noch bei der Button-Definition eintragen. „Aktion ausführen bei Fernsteuerung“ nicht anhaken.

Hast Du das getan, wäre der Ablauf so: Du klickst drauf, deshalb wird der Button grün. Kommt die Verbindung zustande, bleibt das so – alles gut. Falls nicht, wird der Button innert der nächsten Sekunde wieder rot. (Und überhaupt, wenn der Stream getrennt wird.) Dann kannst Du durch erneutes Klicken den Encoder wiedereinschalten.

Erläuterte Grüße

TSD


Edit: Und das schließliche

begin
end.

am Ende des Codes nicht vergessen!

Hi Tondose,

seit Stunden dreh ich hier nun schon meine Runden in der Mairlist-Konfiguration und es will nicht laufen. Ich habe das Script als Hintergrundscript integriert. Am Ende habe ich natürlich noch die Codeschnipsel(begin end.) eingefügt. Fehler werden keine angezeigt.

Nun habe ich einen erweiterten Button erstellt als Umschalt-Button und jeweils das Script hinterlegt, was beim anklicken passieren soll und habe dann HERBERT.0 bei dem entsprechenden Status eingetragen.

Wenn ich nun Mairlist starte, dann sieht das wie folgt und sehr seltsam aus, denn auf den Buttons steht HERBERT.0 und selbst wenn der Encoder deaktiviert ist und der Status “Aktiv” (Grün) angezeigt wird, springt der Button nicht auf den Status “Inaktiv” (Rot).

Erweiterter Button5 Erweiterter Button6

Es wird somit auch der Status des Encoders ignoriert.
Entweder habe ich einen gewaltigen Denkfehler und kann vielleicht Deinen Ausführungen nicht richtig folgen, oder es hat sich irgendwo der Fehlerteufel eingeschlichen.

Ratlose Grüße
Nick

Zum Einrichten von Hintergrundskripts und einigem weiteren in Sachen Scripting Wissenswerten siehe hier.

Zum Einrichten des Buttons:

  • Standard-Text: Was auf dem Button stehen soll.
  • Name: Leer.
  • Erweitert > ID für Fernsteuerung: HERBERT.0usw. Man könnte sich aber auch treffendere Namen ausdenken …
  • Aktionen > Aktionen, wenn aktiviert: Der Befehl, der Deinen Encoder einschaltet.
  • Entsprechend mit „… deaktiviert“ (ausschalten).

Geordnete Grüße

TSD

Hi Tondose,

vielen lieben Dank für Deine Hilfe. So wie Du es zuletzt beschrieben hast, hatte ich es auch schon versucht. Ich hatte in den Stunden viele Kombinationen angeschaut und auch das Forum durchsucht, wo ich auch einige Ansätze gefunden hatte, die ich auch ohne Erfolg getestet habe.
Das System erkennt einfach nicht, wenn der Stream nicht aktiv ist und läßt den Status des Buttons auf “Aktiv” stehen.

Ich gebe auf und ich danke Dir trotzdem für Deine aufgebrachte Zeit. Ich hoffte ja das Martin nach meiner Frage sich dazu noch äußert, da es ja bei ihm zu funktionieren scheint.

Tondose Ihr seid echt ein klasse Support, auch wenn vielleicht nicht alles gelöst werden kann.

Nochmals vielen lieben Dank an Euch.

Dankende Grüße
Nick