Alarm/Info 'News Ticker'

Hallo,

hier mal wieder ein kleiner bescheidener Beitrag meinerseits. Ich nannte den Ticker zwar NewsTicker, aber leider ‚tickt‘ er nicht im Sinne des Wortes, aber er kann alternierend Meldungen anzeigen, sozusagen, mehrere Meldungen auf kleinstem Raum, eben ein Einzeiler.

Es ist ein wenig Arbeit, alles einzurichten. Es ist ein Teil Skript, Variablen anlegen und natürlich auch Designer Projekt.

So, zuerst die Variablen:

Dies sind die Variabeln, die angelegt werden müssen:

Dazu muss gesagt werden, wenn man mehr als 10 Meldungen haben will, muss man dementsprechend auch mehr Variablen ‚MESSAGE_xx‘ anlegen. Für mich genügen 10 Meldungen.

Nun zum Skript Teil:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : ALARM_HEADER_BAR.ips.php
Trigger  : 
Interval : 
*/
$amount = 10;  // amount of messages

// Add new message *************************************************************
if ($IPS_SENDER == "Variable")
     {
      $new_message = GetValueString("NEW_MESSAGE");
      SetValueString("MESSAGE_DISPLAY", "NEW: ".$new_message);
      IPS_SetScriptTimer($IPS_SELF, 5);
      SetValueBoolean("MESSAGE_VISIBLE", TRUE);

// Check for an empty slot
      for($i=1; $i<=$amount; $i++)
          {
           $counter = sprintf('%02s', $i); // add a leading '0' to the numbers if below 10
           $m = GetValueString("MESSAGE_".$counter);
           if ($m == "")
               {
                SetValueString("MESSAGE_".$counter, $new_message);
                return;
               }
           if ($counter == $amount) echo "Buffer full";
         }
    }


// Display Messages ************************************************************
if ($IPS_SENDER == "TimerEvent")
    {
// Check first which slots are used actually
     $slot = array();
     $inc  = 1; // increment array counter

     for($i=1; $i<=$amount; $i++)
          {
           $counter = sprintf('%02s', $i); // add a leading '0' to the numbers if below 10
           $m = GetValueString("MESSAGE_".$counter);
           if ($m != "")
               {
                $slot[$inc] = $counter;
                $inc = $inc +1;
               }
          }

// Display next message
     $am_mess = count($slot); // amount of messages
     $loop    = GetValueInteger("COUNTER");

     if ($loop < $am_mess) $loop = $loop+1;
     else ($loop = 1);
     SetValueInteger("COUNTER", $loop);
     
     // if array is empty (means no messages), Stop the timer
     if ($am_mess == 0) SetValueBoolean("MESSAGE_VISIBLE", FALSE);
     if ($am_mess < 2)  IPS_SetScriptTimer($IPS_SELF, 0);


     // if loop counter is already higher (due to reset of a message) than amount
     // of messages, reset counter to 1
     if ($loop > $am_mess) $loop = 1;


     $message = GetValueString("MESSAGE_".$slot[$loop]);
     SetValueString("MESSAGE_DISPLAY", $message);


    }


// Erase Message ***************************************************************
if ($IPS_SENDER == "Designer")
    {
     IPS_SetScriptTimer($IPS_SELF, 5);
// Set the pointer on the message to delete
     $slot = array();
     $inc  = 1;

     for($i=1; $i<=$amount; $i++)
          {
           $counter = sprintf('%02s', $i); // add a leading '0' to the numbers if below 10
           $m = GetValueString("MESSAGE_".$counter);
           if ($m != "")
               {
                $slot[$inc] = $counter;
                $inc = $inc +1;
               }
          }
     $loop = GetValueInteger("COUNTER");
     
     SetValueString("MESSAGE_DISPLAY", "       *** Message cleared ***");
     SetValueString("MESSAGE_".$slot[$loop], ""); // delete message
     
    }
?>

So, dies wäre das Skript. Beim Reiter ‚Events‘ wird folgendes unter ‚Triggered Variables‘ eingetragen: OnUpDate → ‚NEW_MESSAGE‘

Im Klartext heisst das, das Skript wird auf die Variable ‚NEW_MESSAGE‘ hin getriggert. Egal, wenn irgendwo nun in ihrem Projekt diese Variable beschrieben wird, wird sie übernommen und in einem freien Slot eingetragen.

als Beispiel:

SetValueString("NEW_MESSAGE", "Batterie FHT xy leer - bitte wechseln");

In den ersten Sekunden wird diese Meldung mit „NEW:“ angezeigt, so dass man weiss, dass dies eine neu hinzugekommene Meldung ist.

Im Desinger muss man sich ein ‚LABEL‘-Feld anlegen und ein ‚BUTTON‘

Zuerst zum LABEL:

Das Labelfeld sollte ein Einzeiler-Feld sein. Ich habe dort in den properties nix weiter verändert ausser dass ich ‚Read Only‘ auf TRUE gesetzt habe.

In der IPSYMCON-Rubrik muss folgendes geändert werden:

  1. Text : Variable ‚MESSAGE_DISPLAY‘
  2. Visible : Variable ‚MESSAGE_VISIBLE‘

zum BUTTON:

Ein kleiner Button genügt eigentlich. Ich habe ihn ‚CLEAR‘ genannt. Denn eigentlich löscht dieser Button ja nicht die Fehlermeldung an sich, sondern nur den Text in der Infobar . Die eigentliche Störung sollte noch weiter dann gecheckt werden vom User.

In der IPSYMCON-Rubrik muss folgendes geändert werden:

  1. Properties: Visible : Variable ‚MESSAGE_VISIBLE‘
  2. Events : OnClick : ‚ALARM_HEADER_BAR‘

So sieht es bei mir ohne Meldung aus:


und so, wenn (eine) Meldung(en) anliegen

Ich habe in meinem Projekt das ganze auf 10 Meldungen beschränkt.

Um eine Meldung wegzuklicken, soll man auf den Button klicken in dem Moment wo die zu löschende Meldung angezeigt wird. Dann wird ‚Message cleared‘ angezeigt und sie sollte dann auch weg sein.

Schönheitsfehler/bugs

[ul]
[li]Wenn der Buffer (d.h. die 10 Meldefächer) voll ist, dann wird normalerweise ein Echo ausgegeben mit Buffer voll. Hier muss ich noch dran arbeiten, wie ich das Problem lösen kann.[/li][li]Wenn man eine Meldung mit dem Button wegklickt, dauert es normalerweise ein paar Sekunden, bis dann die Meldung verschwunden ist (eben wegen dem Skripttimer)[/li][li]Wenn man einer schneller Finger hat und eine Meldung mehrmals wegklicken möchte kriegt man eine Fehlermedlung wegen array, dass Element nicht gefunden werden konnte. Ich muss diese Meldung noch auffangen per Skript.[/li][/ul]

Es gibt sicherlich noch andere Problemchen die sich mit der Zeit ergeben werden, doch jeder ist herzlich eingeladen, mitzuhelfen und das Skript zu verbesseren. Ich bin nicht so gut in PHP, es wird sicherlich jemand kommen der das besser weiss als ich. Doch diejenigen würde ich dann bitten konstruktive Kritik auszuüben anstelle zu sagen ‚So soll man das auf keinen Fall machen‘

So, viel Spass mit dem Probieren

mfG Franz

Hallo guyabano,

da ich ähnliches vor hatte , habe ich mir Deines Scriptes bedient. Funktioniert auch gut so weit. Ich habe nur eine Zeile etwas angepasst , da ich Datum und Uhrzeit in der Message haben wollte.

      $new_message = date("d.m.Y H:i")."    ".GetValueString("NEW_MESSAGE");

Weiterhin habe ich im Designer kein Label angelegt, sondern bei dem „Clear-Button“ die Caption mit der Message belegt. Einfach auf die Meldung klicken und sie verschwindet.

Gruß und Danke für die Arbeit
A

Hi,

ich habe es so gelöst:

           if(!IPS_VariableExists("MESSAGE_".$counter))    // wenn Variable fehlt: anlegen
              {
              IPS_CreateVariable("MESSAGE_".$counter, "String");
              }

und den $amount groß genug gestellt

Hallo beisammen,

habe das Script ein wenig angepasst:

Es müssen keine Meldungs-Variablen mehr angelegt werden --> wurde in ein Array ausgelagert(serealize/unserealize) --> neuer String…

Habe ein Fenster im Designer welche mir die letzten 5 quittierten Meldungen anzeigt.

Weiters werden alle quittierten(gelöschten) Meldungen in einer Datum.txt Logdatei gesichert.

Gibt sicher einiges zu kürzen im Code, komme aus der SPS-Fraktion - zurzeit scheint´s aber zu funktionieren!

Viel Spass und ne gute Nacht !!

<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File     : Newsticker.ips.php
Trigger  : 'NEW_MESSAGE'
Interval :

SetValueString("NEW_MESSAGE", "Batterie FHT xy leer - bitte wechseln");

*/


$amount = 250;  // max. Anzahl von Meldungen gleichzeitig
$serialized= GetValueString("MESSAGE_STRING");
$message_array = unserialize($serialized);
print_r($message_array);

// Add new message *************************************************************
if ($IPS_SENDER == "Variable")
     {
      $new_message = date("d.m.Y H:i")."    ".GetValueString("NEW_MESSAGE");
      SetValueString("MESSAGE_DISPLAY", "NEW: ".$new_message);
      IPS_SetScriptTimer($IPS_SELF, 5);
      SetValueBoolean("MESSAGE_VISIBLE", TRUE);
      LogVar("CUSTOM",GetValueString("MESSAGE_DISPLAY"));
// Check for an empty slot

      for($i=1; $i<=$amount; $i++)
          {
           //$counter = sprintf('%02s', $i); // add a leading '0' to the numbers if below 10
           $m = $message_array[$i];
           if ($m == "")
               {
                $message_array[$i]=$new_message;
                $serialized = serialize($message_array);
                SetValueString("MESSAGE_STRING",$serialized);
                return;
               }
           if ($counter == $amount) unset($message_array[$counter]);
         }
    }


// Display Messages ************************************************************
if ($IPS_SENDER == "TimerEvent")
    {
// Check first which slots are used actually
     $slot = array();
     $inc  = 1; // increment array counter

// Display next message
     $am_mess = count($message_array);//count($slot); // amount of messages
     $loop    = GetValueInteger("COUNTER");

     if ($loop < $am_mess) $loop = $loop+1;
     else ($loop = 1);
     SetValueInteger("COUNTER", $loop);

     // if array is empty (means no messages), Stop the timer
     if ($am_mess == 0) SetValueBoolean("MESSAGE_VISIBLE", FALSE);
     if ($am_mess < 2)  IPS_SetScriptTimer($IPS_SELF, 0);

     // if loop counter is already higher (due to reset of a message) than amount
     // of messages, reset counter to 1
     if ($loop > $am_mess) $loop = 1;
     
     $arraykeys=array_keys($message_array); //Schlüssel auslesen und Index darauf setzen
     $key=$arraykeys[$loop-1];

     $message = $message_array[$key];
     SetValueString("MESSAGE_DISPLAY", $message);
    }


// Erase Message ***************************************************************
if ($IPS_SENDER == "Designer")
    {
     IPS_SetScriptTimer($IPS_SELF, 5);
     $loop=GetValueInteger("COUNTER");
     $arraykeys=array_keys($message_array); //Schlüssel auslesen und Index darauf setzen
     $key=$arraykeys[$loop-1];
     
     if ($key1 != $key) // Nur schreiben wenn Anzeige nach CLEAR weitergeschaltet hat
     {
     $str=$message_array[$key]."
";
     $str.=GetValueString("MESSAGE_CLEARED");
     $str_array=explode("
",$str,5);   //Meldungsfenster hat 5 Zeilen
     $str=implode($str_array,"
");
     SetValueString("MESSAGE_CLEARED",$str);
     LogVar("CUSTOM","CLEARED: ".GetValueString("MESSAGE_DISPLAY"));
     $key1=$key;
     SetValueString("MESSAGE_DISPLAY", "       *** Message cleared and logged***");
     unset($message_array[$key]);
     }
    }

 $serialized = serialize($message_array);
 SetValueString("MESSAGE_STRING",$serialized);



function LogVar($sender,$value)
{

   $separator = "	";  // separate fiels by TAB - good for Excel ;-)

   $handle = fopen("C:\HP\Media Center\Homecontrol\ip-symcon\Testumgebung\at Home NEU\IP-SYMCON\logs_var/" .date("d.m.y"). ".txt", "a");
   fwrite( $handle,  $sender.
                     $separator.
                     $value.
                     "
");
   fclose($handle);

}

?>



Designer.jpg

Hallo,

ich freu mich zu sehen, dass sich was tut. Das mit dem in einem Array speichern und in ein String zu legen, war auch meine Grundidee. Doch ich hab mir mit meinen mangelnden PHP Kentnisse selbst Steine in den Weg gelegt. Ich wusste was ich wollte, nur nicht wie ich es umsetzen konnte, also nahm ich den Variablen-Weg.

mfG Franz