Meldungsanzeige im WebFront

erstmal vielen Dank an Pitti für die tolle Weiterentwicklung des Skriptes!

manchmal sieht man den Wald vor lauter Bäumen nicht:

Ich habe das Skript von Pitti in der Version 2.2.20180226 (sollte die letzte sein wenn ich den thread richtig gelesen habe).

Leider kann ich eine Meldung nicht löschen, wenn ich im Webfront den „OK“-Button drücke. (Browser ist Firefox.)

Wenn ich es richtig verstanden habe, muss ich im Skript dafür bei Webhook die Instanz des Webfronts eintragen (also im Objektbaum unter „Konfigurator Instanzen“ die Webfront Configurator Instanz die ich nutze).

Habe ich etwas falsch verstanden?

Ist das eine „removeble“ Meldung bzw. wie hast Du sie erzeugt!?

Jein, Du musst einen Webhook „/hook/msg“ anlegen, welcher auf das MeldungsverwaltungsScript zeigt! Also nicht auf das Webfront sondern das Script selber!

Ciao Heiko

vielen Dank für Deine Hilfe Pitti.

Nachdem ich den Webhook angelegt habe funktioniert es und ich kann die Meldungen per Druck auf den „OK“-Knopf löschen.

Ich habe noch nicht so ganz verstanden, wofür die Variable $WFC im Konfig Bereich ist. Was muss ich dort hinterlegen? Den Webfront Konfigurator?

Vielleicht stelle ich mich nur so blöd an, aber eine etwas ausführliche Doku sowie das aktuelle Skript im ersten Thread wäre sehr hilfreich…

Genau, die ID vom Webfront Konfigurator in welchem Du die Meldungsanzeige verwendest. Sie wird benötigt um den Meldungstyp 4 zu realisieren (Switch Page).

Ciao Heiko

Abend!
Erstmal vielen Dank für das nützliche Skript! Ich logge hier alle Schaltvorgänge und Alarme mit…

Aber beim Webfront SkinLight sieht man das Icon am Anfang jedes Eintrags nicht,

Meine Frage: Wie kann ich das Icon nicht darstellen? Aufgrund der enormen Platzverschwendung von Webfront möchte ich es eigentlich eh nicht haben…

Danke und lg

DANKE! Habs hinbekommen!

Schaut bei mir aber jetzt so aus: (passt supertoll, weil platzsparend)
NUR kann ich jetzt keinen Eintrag mehr löschen…


was tun?

btw: Habe Version 2.2, was ist bei 2.3 anders?

lg

Hi cbeham,

das mit den Versionen ist wirklich etwas doof, aber so ist das mit Scripten die sich weiter entwickeln :wink:
Ich habe einige Veränderungen die hier vorgeschlagen und auch umgesetzt worden nicht mitgezogen da sie für mich nicht in mein Konzept passten. Du hast ja auch eine Version mit dem Zeitstempel vor der Meldung :smiley:

Poste doch einfach mal was Du verändert hast, schätze in der Funktion renderData(), oder? Dann schau ich es mir mal an.

Gruß Heiko

Danke! Toller Support :slight_smile:
Darf ich das ganze Skript hier posten (am Abend)?

lg

Noch habe ich nix gemacht :wink:

Ich werde mich nicht dagegen wehren :smiley:

Bis heut Abend
Heiko

Abend!

Was nicht funktioniert ist First in Lastout (d.h. letzte Meldung soll ganz oben stehen)
$fifo = false; oder true; bringt keine Änderung

und die Buttons links sollten ein ganz klein wenig größer sein, damit man ordentlich draufklicken kann zum löschen der einzelnen Meldungen!

und noch eine Bitte, da man im SkinLight die Icons sowieso nicht sehen kann, könnte man sie auch weglassen!?

und gerade noch etwas gefunden:
wenn ich einen bestimmten typ löschen möchte, 0… Normal, löscht er auch immer 2 mit!
$success = IPS_RunScriptWaitEx(19710, array(‚action‘ => ‚removeType‘, ‚type‘ => ‚0‘));

Dickes Danke!

[b]<?[/b] 
################################################################################ 
# Scriptbezeichnung: System.Dashboard.ips.php 
# Version: 2.2.20180226 
# Author:  Heiko Wilknitz (@Pitti) 
#          Original von Horst (12.11.2010) 
#          Angepasst für RasPi lueralba (31.3.2015) 
# 
# Meldungsanzeige im WebFront 
# =========================== 
# 
# Dieses Skript dient zur Verwaltung einer Meldungsliste im WebFront. 
# Meldungen können hinzugefügt und entfernt werden. Es ist auch möglich, 
# Meldungen zu einem bestimmten Zeitpunkt automatisch löschen zu lassen, 
# sowie das Löschen von Meldungen durch Klick im WebFront zu aktivieren. 
# Mit der Version 2.0 ist es möglich den Button zum Wechseln der Seite 
# im Webfront zu benutzen (Typ 4). 
# 
# Installation: 
# ------------- 
# 
# Dieses Skript richtet automatisch alle nötigen Objekte bei manueller 
# Ausführung ein. Eine weitere manuelle Ausführung setzt alle benötigten Objekte 
# wieder auf den Ausgangszustand. 
# 
# - Neues Skript erstellen 
# - Diesen PHP-Code hineinkopieren 
# - Skript Abspeichern 
# - Webfront ID eintragen (Abschnitt 'Konfiguration') 
# - Skript Ausführen 
# 
# Meldung durch ein anderes Skript hinzufügen lassen: 
# --------------------------------------------------- 
# 
# $number = IPS_RunScriptWaitEx(ObjektID, array('action' => 'add', 'text' => 'Test', 'expires' => time() + 60, 'removable' => true)); 
# Die Rückgabe des Aufrufes ist die Identifikationsnummer der neuen Nachricht, 
# bei Misserfolg wird der Wert 0 zurückgegeben. 
# 
# Parameter: 
# - 'text': Meldungstext 
# - 'expires' (optional): Zeitpunkt des automatischen Löschens der Meldung 
#          als Unix-Timestamp. Ist der Wert kleiner als die aktuelle Timestamp, 
#          wird nicht automatisch gelöscht. 
# - 'removable' (optional): Anzeige eines Buttons zum Löschen der Meldung im WebFront. 
# - 'type' (optional): Art der Meldung ... 0 => Normal(grün), 
#          1 => Fehler(rot), 2 => Warnung(gelb), 3 => Todo(blau), 4 => Goto(orange) 
# - 'image' (optional): Name des WebFront-Icons (ipsIcon<name>), welches 
#          für Meldung verwendet werden soll, Standard ist "Talk" 
#          Doku:  https://www.symcon.de/service/dokumentation/komponenten/icons/  
#          z.B. Clock, Gear, Alert, etc....   
# - 'page' (optional): Nur in Verbindung mit Type 4 - Seitenname 
#          HINWEIS: funktioniert nur ohne Parameter 'removable'!! 
# 
# Meldung durch ein anderes Skript löschen lassen: 
# ------------------------------------------------ 
# 
# $success = IPS_RunScriptWaitEx(ObjektID, array('action' => 'remove', 'number' => 123)); 
# Bei erfolgreichem Löschen wird der Wert 1 zurückgegeben, bei Misserfolg der Wert 0. 
# 
# Parameter: 
# - 'number': Identifikationsnummer der zu löschenden Meldung 
# 
# Meldung eines bestimmten Types löschen: 
# ------------------------------------------------ 
# 
# $success = IPS_RunScriptWaitEx(ObjektID, array('action' => 'removeType', 'type' => x)); 
# Bei erfolgreichem Löschen wird der Wert 1 zurückgegeben, bei Misserfolg der Wert 0. 
# 
# Parameter: 
# - 'type': Meldungstyp der gelöscht werden soll (x = 0|1|2|3|4) 
# 
# Alle vorhandenen Meldungen durch ein anderes Skript löschen lassen: 
# ------------------------------------------------------------------- 
# 
# $success = IPS_RunScriptWaitEx(ObjektID, array('action' => 'removeAll')); 
# Bei erfolgreichem Löschen wird der Wert 1 zurückgegeben, bei Misserfolg der Wert 0. 
# 
# Eine Meldungen hinzufügen, welche bei Klick auf den Button die Seite wechselt: 
# ------------------------------------------------------------------------------ 
# 
# $id = IPS_RunScriptWaitEx(ObjektID , array('action' => 'add', 'text' => $text, 'type' => 4, 'image' => 'Telephone', 'page' => 'catAnrufe')); 
# Der Parameter 'page' definiert zu welcher Seite im Webfront gewechselt werden soll. 
# Der Name der Seite muss einer existierenden 'Element ID' im konfigurierten Webfront 
# entsprechen (z.b. item32435). 
#   
# ----------------------------- Konfigruration --------------------------------- 
# 
# WebFront Configuration 
$wfc     = 19710 /*[Forstern.NET]*/;   
# 
# First In First Out - erste Meldung wird zuerst dargestellt, sonst  
# letzte Meldung zuerst (LIFO). 
$fifo    = false;  
# 
################################################################################ 

switch ($_IPS['SENDER']) { 
    case 'Execute': 
        install(); 
        break; 

    case 'RunScript': 
        $result = 0; 
        switch ($_IPS['action']) { 
            case 'add': 
                $expires  = isset($_IPS['expires']) ? $_IPS['expires'] : 0; 
                $removable  = isset($_IPS['removable']) ? $_IPS['removable'] : false; 
                $text     = isset($_IPS['text']) ? $_IPS['text'] : 'leer'; 
                $type     = isset($_IPS['type']) ? $_IPS['type'] : 0; 
                $image    = isset($_IPS['image']) ? $_IPS['image'] : 'Talk'; 
                $page     = isset($_IPS['page']) ? $_IPS['page'] : ''; 
                if (!($expires > time())) { $expires = 0; } 
                if (!($removable === true)) { $removable = false; } 
                if (!($type > 0)) { $type = 0; } 
                if (!(is_string($page))) { $page = ''; } 
                if (!($image != '')) { $image = 'Talk'; } 
                if (is_string($text) && $text != '') { 
                  //  $result = addMessage($text, $expires, $removable, $type, $image, $page, $fifo); 
                  $result = addMessage($text, $expires, $removable, $type, $image, $page, $fifo); 
                } 
                break; 

            case 'remove': 
                $number = isset($_IPS['number']) ? $_IPS['number'] : -1; 
                if ($number > 0) { 
                    $result = removeMessage($number, $fifo); 
                } 
                break; 

            case 'removeAll': 
                $result = removeAllMessages(); 
                break; 
            case 'removeType': 
                $type = isset($_IPS['type']) ? $_IPS['type'] : -1; 
                if ($type >= 0) { 
                  $result = removeTypes($type, $fifo); 
                } 
                break; 
        } 
        echo $result; 
        break; 

    case 'TimerEvent': 
        $number = explode('#', IPS_GetName($_IPS['EVENT'])); 
        $number = $number[1]; 
        IPS_DeleteEvent($_IPS['EVENT']); 
        removeMessage($number, $fifo); 
        break; 

    case 'WebHook': 
        $result = 0; 
        switch ($_GET['action']) { 
            case 'remove': 
              $number = isset($_GET['number']) ? $_GET['number'] : -1; 
              if ($number > 0) { 
                  $result = removeMessage($number, $fifo); 
              } 
              break; 
            case 'switch': 
              $page = isset($_GET['page']) ? $_GET['page'] : ''; 
              if (is_string($page) && $page !='') { 
                  $result = switchPage($wfc, $page); 
              } 
              break; 
    } 
    echo $result; 
    break; 
} 

function removeAllMessages () 
{ 
    $ParentID = IPS_GetParent($_IPS['SELF']); 
    $DataID = IPS_GetVariableIDByName('Daten', $ParentID); 
    $MessagesID = IPS_GetVariableIDByName('Meldungen', $ParentID); 
    $LastNumberID = IPS_GetVariableIDByName('letzte Meldungsnummer', $ParentID); 

    $ids = IPS_GetChildrenIDs($_IPS['SELF']); 
    foreach ($ids as $id) { 
        if (IPS_EventExists($id) && substr(IPS_GetName($id), 0, 16) == 'Remove Message #') { 
            IPS_DeleteEvent($id); 
        } 
    } 
    SetValueString($DataID, json_encode(array())); 
    SetValueString($MessagesID, 'Keine Meldungen vorhanden!'); 
    SetValueInteger($LastNumberID, 0); 
     
    return 1; 
} 

function removeTypes($type, $method)  
{ 
    $ParentID = IPS_GetParent($_IPS['SELF']); 
    $DataID = IPS_GetVariableIDByName('Daten', $ParentID); 
     
    $result = 0; 
    $i = 0; 
    $j = 0; 
    $data = json_decode(GetValueString($DataID), true); 
    foreach($data as $dataid => $dataval) { 
        if($dataval['type'] == $type) { 
            if(removeMessage($dataid, $method)) $i++; 
            $j++; 
        } 
    } 
    if ($i == $j) $result = 1; 
    return $result; 
} 

function removeMessage($number, $method) 
{ 
    $ParentID = IPS_GetParent($_IPS['SELF']); 
    $DataID = IPS_GetVariableIDByName('Daten', $ParentID); 
    $result = 0; 
    if (IPS_SemaphoreEnter($_IPS['SELF'].'DataUpdate', 2000)) { 
        $data = json_decode(GetValueString($DataID), true); 
        if (isset($data[$number])) { 
            unset($data[$number]); 
            $eventID = @IPS_GetEventIDByName('Remove Message #'.$number, $_IPS['SELF']); 
            if ($eventID !== false) { 
                IPS_DeleteEvent($eventID); 
            } 
            SetValueString($DataID, json_encode($data)); 
            $result = 1; 
        } 
        else { 
            throwException('Could not remove message #'.$number.': Unknown message number!'); 
        } 
        IPS_SemaphoreLeave($_IPS['SELF'].'DataUpdate'); 
        renderData($data, $method); 
    } 
    else { 
        throwException('Could not remove message #'.$number.': Semaphore timeout!'); 
    } 
    return $result; 
} 

function addMessage ($text, $expires, $removable, $type, $image, $page, $method) 
{ 
    $ParentID = IPS_GetParent($_IPS['SELF']); 
    $DataID = IPS_GetVariableIDByName('Daten', $ParentID); 
    $LastNumberID = IPS_GetVariableIDByName('letzte Meldungsnummer', $ParentID); 
    $number = 0; 
    if (IPS_SemaphoreEnter($_IPS['SELF'].'DataUpdate', 2000)) { 
        $data = json_decode(GetValueString($DataID), true); 
        if (!is_array($data)) { 
            $data = array(); 
        } 
        $number = GetValueInteger($LastNumberID) + 1; 
        $data[$number] = array('timestamp' => time(), 'text' => utf8_encode($text), 'expires' => $expires, 'removable' => $removable, 'type' => $type, 'image' => $image, 'page' => $page); 
        if ($expires > time()) { 
            $eventID = IPS_CreateEvent(1); 
            IPS_SetParent($eventID, $_IPS['SELF']); 
            IPS_SetName($eventID, 'Remove Message #'.$number); 
            IPS_SetEventCyclic($eventID, 1, 0, 0, 0, 0, 0); 
            if($expires == 0) { 
                IPS_SetEventCyclicDateFrom($eventID, 0, 0, 0); 
            } else { 
                IPS_SetEventCyclicDateFrom($eventID, (int)date('j',$expires), (int)date('n', $expires),  (int)date('Y', $expires));
            } 
            IPS_SetEventCyclicDateTo($eventID, 0, 0, 0); 
             
            if($expires == 0) { 
                IPS_SetEventCyclicTimeFrom($eventID, 0, 0, 0); 
            } else { 
                IPS_SetEventCyclicTimeFrom($eventID, (int)date("H", $expires), (int)date("i", $expires), (int)date("s", $expires));
            } 
            IPS_SetEventCyclicTimeTo($eventID, 0, 0, 0); 
            IPS_SetEventActive($eventID, true); 
        } 
        SetValueString($DataID, json_encode($data)); 
        SetValueInteger($LastNumberID, $number); 
        IPS_SemaphoreLeave($_IPS['SELF'].'DataUpdate'); 
        renderData($data, $method); 
    } 
    else { 
        throwException('Could not add message: Semaphore timeout!'); 
    } 
    return $number; 
} 

function switchPage($wfc, $page) 
{ 
    $result = WFC_SwitchPage($wfc, $page); 
    return $result; 
} 

function install () 
{ 
    IPS_SetHidden($_IPS['SELF'], true); 
    $ParentID = IPS_GetParent($_IPS['SELF']); 
    $instanceID = 0; 
    if (IPS_InstanceExists($ParentID)) { 
        $instance = IPS_GetInstance($ParentID); 
        if ($instance['ModuleInfo']['ModuleID'] == '{485D0419-BE97-4548-AA9C-C083EB82E61E}') { 
            $instanceID = $ParentID; 
        } 
    } 
    if ($instanceID == 0) { 
        $instanceID = IPS_CreateInstance('{485D0419-BE97-4548-AA9C-C083EB82E61E}'); 
        IPS_SetParent($instanceID, $ParentID); 
        IPS_SetName($instanceID, 'Meldungen'); 
        IPS_SetParent($_IPS['SELF'], $instanceID); 
        $ParentID = $instanceID; 
    } 
    $DataID = @IPS_GetVariableIDByName('Daten', $ParentID); 
    if ($DataID === false) { 
        $DataID = IPS_CreateVariable(3); 
        IPS_SetParent($DataID, $ParentID); 
        IPS_SetName($DataID, 'Daten'); 
    } 
    SetValueString($DataID, json_encode(array())); 
    $MessagesID = @IPS_GetVariableIDByName('Meldungen', $ParentID); 
    if ($MessagesID === false) { 
        $MessagesID = IPS_CreateVariable(3); 
        IPS_SetParent($MessagesID, $ParentID); 
        IPS_SetName($MessagesID, 'Meldungen'); 
        IPS_SetVariableCustomProfile($MessagesID, '~HTMLBox'); 
    } 
    SetValueString($MessagesID, 'Keine Meldungen vorhanden!'); 
    $LastNumberID = @IPS_GetVariableIDByName('letzte Meldungsnummer', $ParentID); 
    if ($LastNumberID === false) { 
        $LastNumberID = IPS_CreateVariable(1); 
        IPS_SetParent($LastNumberID, $ParentID); 
        IPS_SetName($LastNumberID, 'letzte Meldungsnummer'); 
    } 
    SetValueInteger($LastNumberID, 0); 
     
    $ids = IPS_GetChildrenIDs($_IPS['SELF']); 
    foreach ($ids as $id) { 
        if (IPS_EventExists($id) && substr(IPS_GetName($id), 0, 16) == 'Remove Message #') { 
            IPS_DeleteEvent($id); 
        } 
    } 
} 

function renderData ($data, $method) 
{ 
    $ParentID = IPS_GetParent($_IPS['SELF']); 
    $DataID = IPS_GetVariableIDByName('Daten', $ParentID); 
    $MessagesID = IPS_GetVariableIDByName('Meldungen', $ParentID); 
    // Etwas CSS und HTML 
    $style = ""; 
    $style = $style.'<style type="text/css">'; 
    $style = $style.'table.msg { width:100%; border-collapse: collapse; }'; 
    $style = $style.'td.fst { width: 12px; text-align:center; padding: 0px;  border-left: 0px solid rgba(255, 255, 255, 0.2); border-top: 0px solid rgba(255, 255, 255, 0.1); }'; 
    $style = $style.'td.mid { width: 5px; padding: 2px; border-top: 0px solid rgba(255, 255, 255, 0.1); }'; 
    $style = $style.'td.lst { padding: 3px;  border-right: 0px solid rgba(255, 255, 255, 0.2); border-top: 0px solid rgba(255, 255, 255, 0.1); }';
    $style = $style.'tr:last-child { border-bottom: 1px solid rgba(255, 255, 255, 0.2); }'; 
    $style = $style.'.blue { padding: 5px; color: rgb(255, 255, 255); background-color: rgb(0, 0, 255); background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }'; 
    $style = $style.'.red { padding: 5px; color: rgb(255, 255, 255); background-color: rgb(255, 0, 0); background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }'; 
    $style = $style.'.green { padding: 5px; color: rgb(255, 255, 255); background-color: rgb(0, 255, 0); background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }'; 
    $style = $style.'.yellow { padding: 5px; color: rgb(255, 255, 255); background-color: rgb(255, 255, 0); background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }'; 
    $style = $style.'.orange { padding: 5px; color: rgb(255, 255, 255); background-color: rgb(255, 160, 0); background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }'; 
    $style = $style.'</style>'; 
    $content = $style; 
    $content = $content.'<table class="msg">'; 

if (count($data) == 0) {   
    $content = $content.'<tr><td></td></tr>'; // Diese Zeile ersetzt die nächsten 5 und bewirkt, dass das Meldungsfenster leer bleibt, wenn keine Meldungen anstehen.  
        //$content = $content.'<tr>';  
        //$content = $content.'<td class="fst"><img src=\'img/icons/Ok.svg\'></img></td>';  
        //$content = $content.'<td class="mid">Keine Meldungen vorhanden!</td>';  
        //$content = $content.'<td class=\'lst\'><div class=\'green\' onclick=\'alert("Nachricht kann nicht bestätigt werden.");\'>OK</div></td>';  
        //$content = $content.'</tr>';  
    }   
    else {   
        foreach ($data as $number => $message) {  
            if ($message['type']) {  
                switch ($message['type']) {   
                    case 3:   
                        $type = 'blue';  
                        break;  
                    case 2:   
                        $type = 'yellow';  
                        break;  
                    case 1:   
                        $type = 'red';  
                        break;  
                    default:  
                        $type = 'green';  
                        break;  
                }  
            }  
            else {  
                $type = 'green';  
            }   
            if ($message['image']) {   
                $image = '<img src=\'img/icons/'.$message['image'].'.svg\'></img>';   
            }   
            else {   
                  $image = '<img src=\'img/icons/Ok.svg\'></img>';   
            }           

            $content .= '<tr>';   
            if ($message['removable']) {   
                $content = $content.'<td class=\'fst\'><div class=\''.$type.'\' onclick="window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest();HTTP.open(\'GET\',o.url,true);HTTP.send();};window.xhrGet({ url: \'hook/remove?ts=\' + (new Date()).getTime() + \'&ScriptID='.$_IPS['SELF'].'&number='.$number.'\' }); "></div></td>'; // original: ">OK</div></td>';  
            }   
            else {   
                $content = $content.'<td class=\'fst\'><div class=\''.$type.'\' onclick=\'alert("Nachricht kann nicht bestätigt werden.");\'>OK</div></td>';  
            }   
            $content = $content.'<td class="mid">'.$image.'</td>';  

            $content = $content.'<td class="lst">'.utf8_decode($message['text']).'</td>';  
            $content .= '</tr>';   
        }   
    }  
    $content = $content. '</table>';  
    SetValueString($MessagesID, $content);  
} 

function throwException($message) 
{ 
    IPS_LogMessage($_IPS['SELF'], $message); 
} 
################################################################################ 


[b]?>[/b]

Moin,

Ja, das war noch ein Fehler in der v2.2 :frowning:

Was willst Du genau haben?

Original Version => <ICON> <MESSAGE> <BUTTON>

Deine Version=> <BUTTON> <MESSAGE>

Richtig, also vorne Icon weg und dafür den Button?

Den Typ nicht in Hochkomma stellen, also nicht ‚0‘ sondern nur 0!!!

Melde Dich, dann schicke ich Dir eine Mail zum Testen und baue es dann alles in eine neue Version!

Gruß Heiko

Ok

Ja genau, zum Platz sparen: <BUTTON zum Löschen> <Message>

Hätte ich eigentlich auch probiert…

Vielen Dank Heiko! PM auf dem Weg

Christian, Du hast Post! Bitte noch die WFC ID wieder auf deine ID setzen, hatte ich in der Eile vergessen!

Gruß Heiko

Hallo Heiko,

ich verwende schon seit längerer Zeit das (mit deiner Hilfe angepasste) Skript und bin sehr zufrieden.

Nur damit ich noch am Stand der Dinge bin: Es ist nach wie vor nötig, dass ich pro anzuzeigendem Gerät eine Variable für die Meldungsnummer anlege?

Peter

Hi Peter,

ich bin etwas verwirrt hinsichtlich Deiner Frage … wie Variable pro Nummer anlegen? Das Prinzip des Scriptes ist doch eine Zentrale zu haben welche alle Meldungen (durch speziellen Script-Aufruf) verwaltet und diese über eine Variable (Meldungen) im Webfront aufzulisten! Wie passt das mit Deiner Frage zusammen oder wie nutzt Du das Script generell?

Ciao Heiko

Ein Beispiel:
Ich möchte eine Meldungsanzeige, wenn die Batterie des Fensterkontakts leer ist. Ich lege eine Integer-Variable mit dem Begriff „Meldungsnummer“ an. Dann gibt es ein „Meldungsskript“ welches durch Änderung der „Batterie-Variable“ ausgelöst wird.

/Batterie Fenster Abstellraum
	case 27588 /*[Tür- und Torüberwachung\Fensterkontakt Abstellraum\LOWBAT]*/: 
		$StatusMelder = GetValueBoolean(27588 /*[Tür- und Torüberwachung\Fensterkontakt Abstellraum\LOWBAT]*/);	
		if ($StatusMelder === true) {
		IPS_RunScript(38248 /*[Skripte\Virtuelle Schalter\Einschalt-Timer Display Tablet]*/);
		$Meldungsnummer = 10114 /*[Tür- und Torüberwachung\Fensterkontakt Abstellraum\Meldungsnummer]*/;
		$number = IPS_RunScriptWaitEx(52585 /*[Benachrichtigungen\Meldungen\Meldungen]*/, array('action' => 'add', 'text' => 'Batterie Fenster Abstellraum schwach', 'expires' => time(), 'removable' => true, 'type' => 2, 'image' => 'Battery')); 
		SetValue($Meldungsnummer, $number);
		}

		if ($StatusMelder === false) {
		IPS_RunScript(38248 /*[Skripte\Virtuelle Schalter\Einschalt-Timer Display Tablet]*/);
		$Meldungsnummer = GetValue(10114 /*[Tür- und Torüberwachung\Fensterkontakt Abstellraum\Meldungsnummer]*/);
		$success = IPS_RunScriptWaitEx(52585 /*[Benachrichtigungen\Meldungen\Meldungen]*/, array('action' => 'remove', 'number' => $Meldungsnummer));
		}
		break;

Das zweite Skript ist jenes, welches ich von dir verwende.
Für jedes Gerät (oder Funktion - wie auch immer man es nennt), welches angezeigt werden soll, führe ich diese Schritte durch. Das heißt, ich brauche jedes Mal eine Integer-Variable für die Meldungsnummer.

Screenshot.JPG

Ich hoffe du verstehst jetzt was ich meine.

Hi Peter,

ah, jetzt eine Insel :wink:

Okay, wenn man die Meldungen „scriptgesteuert“ wieder löschen möchte dann ist das wohl so wie Du schreibst! Also alles gut und wenn so gewollt auch alles richtig gemacht :slight_smile:

Ich mach das mit dem Batteriezustand anders, bei mir läuft aller einer definierten Zeit ein Script welches die Batteriezustände aller Geräte einsammelt und im „negativen“ Fall erzeuge ich eine Meldung und setze ‚expires‘ genau auf die Zeit bis zum nächsten Lauf. Somit brauche ich mir die Meldungsnummer nicht merken und sollte die Batterie immer noch LOW sein wird die Meldung „neu“ angelegt!

Es gibt eben mehrere Wege nach Rom, aber man kann es auch so machen wie Du - nur dann muss man sie sich die Nummer „zwischenmerken“. Mache ich nur beim Anrufmonitor um die Anzahl der Anrufe in Abwesenheit rauf zu zählen :wink:

Ich mache fast alles mit Ablaufzeit oder explizites Bestätigen der Meldung durch den Button!

Deine Frage klang aber so als ob Du eine Idee hättest wie man das besser/einfacher machen könnte!? Bin für Verbesserungen immer empfänglich :wink:

Gruß Heiko

Ehrlich gesagt bin ich seit der letzten Anpassung, die wir gemacht haben, äußerst zufrieden :slight_smile:
Ich würde im Moment auch gar nichts ändern. Ich hab mir nur gedacht, dass ich eventuell einen Denkfehler habe und gar nicht jedes Mal eine „Meldungsnummer-Variable“ brauche. Aber wie du richtig sagst, führen viele Wege nach Rom und der aktuelle Weg (den ich dank deiner Unterstützung eingeschlagen habe), ist wunderbar asphaltiert und bestens geeignet :smiley:

Peter

Hi zusammen,

eigentlich wollte ich kein Update mehr liefern - der Aufwand sollte eigentlich in die Modulentwicklung fließen, aber es gab ein paar persönliche Anfragen denen ich nicht widerstehen konnte :wink:

Primär sind 3 Flags in der Konfiguration hinzugekommen, mit welchem man die visuelle Ausgabe der Meldungen beeinflussen kann:

[ul]
[li]nomsg - Flag, ob angezeigt werden soll das keine Meldung existiert.
[/li][li]noico - Flag, ob Icons angezeigt werden soll.
[/li][li]bfort - Flag, ob Button vor Text angezeigt werden soll; nur in Kombi mit NO-ICON Flag verwendbar!
[/li][/ul]


<? 
################################################################################ 
# Scriptbezeichnung: System.Dashboard.ips.php
# Version: 3.0.20190221
# Author:  Heiko Wilknitz (@Pitti)
#          Original von Horst (12.11.2010)
#          Angepasst für RasPi lueralba (31.3.2015)
#
# Meldungsanzeige im WebFront!
# Dieses Skript dient zur Verwaltung einer Meldungsliste im WebFront.
# Meldungen können hinzugefügt und entfernt werden. Es ist auch möglich,
# Meldungen zu einem bestimmten Zeitpunkt automatisch löschen zu lassen,
# sowie das Löschen von Meldungen durch Klick im WebFront zu aktivieren.
# Mit der Version 2.0 ist es möglich den Button zum Wechseln der Seite
# im Webfront zu benutzen (Typ 4).
#
# ------------------------------ Installation ----------------------------------
#
# Dieses Skript richtet automatisch alle nötigen Objekte bei manueller
# Ausführung ein. Eine weitere manuelle Ausführung setzt alle benötigten Objekte
# wieder auf den Ausgangszustand.
#
# - Neues Skript erstellen
# - Diesen PHP-Code hineinkopieren
# - Skript Abspeichern
# - Webfront ID eintragen (Abschnitt 'Konfiguration')
# - Skript Ausführen
#
# Meldung durch ein anderes Skript hinzufügen lassen:
# ---------------------------------------------------
#
# $number = IPS_RunScriptWaitEx(ObjektID, array('action' => 'add', 'text' => 'Test', 'expires' => time() + 60, 'removable' => true));
# Die Rückgabe des Aufrufes ist die Identifikationsnummer der neuen Nachricht,
# bei Misserfolg wird der Wert 0 zurückgegeben.
#
# Parameter:
# - 'text': Meldungstext
# - 'expires' (optional): Zeitpunkt des automatischen Löschens der Meldung
#          als Unix-Timestamp. Ist der Wert kleiner als die aktuelle Timestamp,
#          wird nicht automatisch gelöscht.
# - 'removable' (optional): Meldung wird bei Klick auf Button gelöscht.
# - 'type' (optional): Art der Meldung ... 0 => Normal(grün),
#          1 => Fehler(rot), 2 => Warnung(gelb), 3 => Todo(blau), 4 => Goto(orange)
# - 'image' (optional): Name des WebFront-Icons (ipsIcon<name>), welches
#          für Meldung verwendet werden soll, Standard ist "Talk"
#          Doku:  https://www.symcon.de/service/dokumentation/komponenten/icons/
#          z.B. Clock, Gear, Alert, etc....
# - 'page' (optional): Nur in Verbindung mit Type 4 - Seitenname
#          HINWEIS: funktioniert nur ohne Parameter 'removable'!!
#
# Meldung durch ein anderes Skript löschen lassen:
# ------------------------------------------------
#
# $success = IPS_RunScriptWaitEx(ObjektID, array('action' => 'remove', 'number' => 123));
# Bei erfolgreichem Löschen wird der Wert 1 zurückgegeben, bei Misserfolg der Wert 0.
#
# Parameter:
# - 'number': Identifikationsnummer der zu löschenden Meldung
#
# Meldung eines bestimmten Types löschen:
# ------------------------------------------------
#
# $success = IPS_RunScriptWaitEx(ObjektID, array('action' => 'removeType', 'type' => x));
# Bei erfolgreichem Löschen wird der Wert 1 zurückgegeben, bei Misserfolg der Wert 0.
#
# Parameter:
# - 'type': Meldungstyp der gelöscht werden soll (x = 0|1|2|3|4)
#
# Alle vorhandenen Meldungen durch ein anderes Skript löschen lassen:
# -------------------------------------------------------------------
#
# $success = IPS_RunScriptWaitEx(ObjektID, array('action' => 'removeAll'));
# Bei erfolgreichem Löschen wird der Wert 1 zurückgegeben, bei Misserfolg der Wert 0.
#
# Eine Meldungen hinzufügen, welche bei Klick auf den Button die Seite wechselt:
# ------------------------------------------------------------------------------
#
# $id = IPS_RunScriptWaitEx(ObjektID , array('action' => 'add', 'text' => $text, 'type' => 4, 'image' => 'Telephone', 'page' => 'catAnrufe'));
# Der Parameter 'page' definiert zu welcher Seite im Webfront gewechselt werden soll.
# Der Name der Seite muss einer existierenden 'Element ID' im konfigurierten Webfront
# entsprechen (z.b. item32435).
#
# ------------------------------ Changelog -------------------------------------
#
# 08.02.2017 - Initalversion (v1.0)
# 17.02.2018 - Neuer Typ 4 zum Wechseln der Seite bei Klick auf Button
#              Umstellung auf Webhook als Ersatz für extra Remove-Script (v2.0)
# 24.02.2018 - über 'fifo' kann man die Reihenfolge der Meldungsausgabe steuern
#            - der Zeitstemmpel wann die Meldung erzeugt wurde wird beim Hover
#              über das Icon angezeigt
#              Doku verbessert (v2.1)
# 26.02.2018 - Flag für Reihenfolge der Meldungsauflistung hinzugefügt (v2.2)
# 04.03.2018 - Hinterlegung einer URL auf den Button (eperimental) (v2.3)
# 21.02.2019 - 3 neue Flags füre die Manupilation der Darstellung hinzugefügt
#              'nomsg' für keine Meldungen, 'noico' für keine Icons und
#              'bfort' für Button vor Text (in Kombi mit NO-ICON) (v3.0)
#
# ----------------------------- Konfigruration ---------------------------------
#
# WebFront Configuration
$wfc	= 0 /*[WebFront Configuration ID]*/;
#
# First In First Out - erste Meldung wird zuerst dargestellt, sonst
# letzte Meldung zuerst (LIFO).
$fifo	= false;
# Flag, ob angezeigt werden soll das keine Meldung existiert.
$nomsg	= false;
# Flag, ob Icons angezeigt werden soll.
$noico	= false;
# Flag, ob Button vor Text angezeigt werden soll;
# nur in Kombi mit NO ICON Flag verwendbar
$bfort	= false;
#
################################################################################ 

// INSTALLATION
if ($_IPS['SENDER']=='Execute') {
	install(); 
}
// SCRIPTAUSFUEHRUNG
else if($_IPS['SENDER'] == "RunScript") {
	$result = 0;
	switch ($_IPS['action']) {
		case 'add':
			$expires  = isset($_IPS['expires']) ? $_IPS['expires'] : 0;
			$removable  = isset($_IPS['removable']) ? $_IPS['removable'] : false;
			$text     = isset($_IPS['text']) ? $_IPS['text'] : 'leer';
			$type     = isset($_IPS['type']) ? $_IPS['type'] : 0;
			$image    = isset($_IPS['image']) ? $_IPS['image'] : 'Talk';
			$page     = isset($_IPS['page']) ? $_IPS['page'] : '';
			if (!($expires > time())) { $expires = 0; }
			if (!($removable === true)) { $removable = false; }
			if (!($type > 0)) { $type = 0; }
			if (!(is_string($page))) { $page = ''; }
			if (!($image != '')) { $image = 'Talk'; }
			if (is_string($text) && $text != '') {
				$result = addMessage($text, $expires, $removable, $type, $image, $page);
			}
			break;
		case 'remove':
			$number = isset($_IPS['number']) ? $_IPS['number'] : -1;
			if ($number > 0) {
				$result = removeMessage($number);
			}
			break;
		case 'removeAll':
			$result = removeAllMessages();
			break;
		case 'removeType':
			$type = isset($_IPS['type']) ? $_IPS['type'] : -1;
			if ($type >= 0) {
				$result = removeTypes($type);
			}
			break;
	}
	echo $result;
}
// TIMER EVENT
else if($_IPS['SENDER'] == "TimerEvent") {
	$number = explode('#', IPS_GetName($_IPS['EVENT']));
	$number = $number[1];
	IPS_DeleteEvent($_IPS['EVENT']);
	removeMessage($number);
}
// AUFRUF WEBHOOK
else if($_IPS['SENDER'] == "WebHook") {
	$result = 0;
	switch ($_GET['action']) {
		case 'remove':
			$number = isset($_GET['number']) ? $_GET['number'] : -1;
			if ($number > 0) {
				$result = removeMessage($number);
			}
			break;
		case 'switch':
			$page = isset($_GET['page']) ? $_GET['page'] : '';
			if (is_string($page) && $page !='') {
				$split = explode(',',$page);
				$result = switchPage($wfc, $split[0]);
				if(isset($split[1]) && ($split[1] != '')) {
					sendPopup($wfc, $split[1]);
				}
			}
			break;
	}
	echo $result;
} 

# ------------------------------ Funktionen ------------------------------------

// Alle Meldungen(Daten) löschen und Letzte Meldungsnummer auf 0 setzen
function removeAllMessages () {
	$pid = IPS_GetParent($_IPS['SELF']);
	$did = IPS_GetVariableIDByName('Daten', $pid);
	$mid = IPS_GetVariableIDByName('Meldungen', $pid);
	$lid = IPS_GetVariableIDByName('letzte Meldungsnummer', $pid);
	$ids = IPS_GetChildrenIDs($_IPS['SELF']);
	foreach ($ids as $id) {
		if (IPS_EventExists($id) && substr(IPS_GetName($id), 0, 16) == 'Remove Message #') {
			IPS_DeleteEvent($id);
		}
	}
	SetValueString($did, json_encode(array()));
	SetValueString($mid, 'Keine Meldungen vorhanden!');
	SetValueInteger($lid, 0);
	return 1;
}

// Alle Meldungen eines bestimmten Meldungstyp löschen.
function removeTypes($type) {
	$pid = IPS_GetParent($_IPS['SELF']);
	$did = IPS_GetVariableIDByName('Daten', $pid);
	$result = 0;
	$i = 0;
	$j = 0;
	$data = json_decode(GetValueString($did), true);
	foreach($data as $id => $val) {
		if($val['type'] == $type) {
			if(removeMessage($id)) $i++;
			$j++;
		}
	}
	if ($i == $j) $result = 1;
	return $result;
}

// Meldung mit der Meldungsnummer(number) löschen.
function removeMessage($number) {
	$pid = IPS_GetParent($_IPS['SELF']);
	$did = IPS_GetVariableIDByName('Daten', $pid);
	$result = 0;
	if (IPS_SemaphoreEnter($_IPS['SELF'].'DataUpdate', 2000)) {
		$data = json_decode(GetValueString($did), true);
		if (isset($data[$number])) {
			unset($data[$number]);
			$eid = @IPS_GetEventIDByName('Remove Message #'.$number, $_IPS['SELF']);
			if ($eid !== false) {
				IPS_DeleteEvent($eid);
			}
			SetValueString($did, json_encode($data));
			$result = 1;
		}
		else {
			throwException('Could not remove message #'.$number.': Unknown message number!');
		}
		IPS_SemaphoreLeave($_IPS['SELF'].'DataUpdate');
		renderData($data);
	}
	else {
		throwException('Could not remove message #'.$number.': Semaphore timeout!');
	}
	return $result;
}

// Neue Meldung hinzufügen
function addMessage ($text, $expires, $removable, $type, $image, $page) {
	$pid = IPS_GetParent($_IPS['SELF']);
	$did = IPS_GetVariableIDByName('Daten', $pid);
	$lid = IPS_GetVariableIDByName('letzte Meldungsnummer', $pid);
	$number = 0;
	if (IPS_SemaphoreEnter($_IPS['SELF'].'DataUpdate', 2000)) {
		$data = json_decode(GetValueString($did), true);
		if (!is_array($data)) {
			$data = array();
		} 
		$number = GetValueInteger($lid) + 1;
		$data[$number] = array('timestamp' => time(), 'text' => utf8_encode($text), 'expires' => $expires, 'removable' => $removable, 'type' => $type, 'image' => $image, 'page' => $page); 
		if ($expires > time()) {
			$eid = IPS_CreateEvent(1); 
			IPS_SetParent($eid, $_IPS['SELF']); 
			IPS_SetName($eid, 'Remove Message #'.$number); 
			IPS_SetEventCyclic($eid, 1, 0, 0, 0, 0, 0); 
			if($expires == 0) {
				IPS_SetEventCyclicDateFrom($eid, 0, 0, 0); 
			} else {
				IPS_SetEventCyclicDateFrom($eid, (int)date('j',$expires), (int)date('n', $expires),  (int)date('Y', $expires));
			}
			IPS_SetEventCyclicDateTo($eid, 0, 0, 0);
			if($expires == 0) {
				IPS_SetEventCyclicTimeFrom($eid, 0, 0, 0);
			} else {
				IPS_SetEventCyclicTimeFrom($eid, (int)date("H", $expires), (int)date("i", $expires), (int)date("s", $expires));
			}
			IPS_SetEventCyclicTimeTo($eid, 0, 0, 0);
			IPS_SetEventActive($eid, true);
		}
		SetValueString($did, json_encode($data));
		SetValueInteger($lid, $number);
		IPS_SemaphoreLeave($_IPS['SELF'].'DataUpdate');
		renderData($data);
	}
	else {
		throwException('Could not add message: Semaphore timeout!');
	}
	return $number;
}

// Umschalten zu einer bestimmten Seite im WebFront
function switchPage($wfc, $page) {
	$result = WFC_SwitchPage($wfc, $page);
	return $result;
}

// Popup öffnen für Link-Anzeige (experimental)
function sendPopup($wfc, $url) {
	$result = WFC_SendPopup($wfc, 'Weiterleitung', "<a href='".$url."'>KLICK</a>");
	return $result;
}

// Installationsroutine zum Erzeugen aller notwendigen Variablen.
function install () {
	$pid = IPS_GetParent($_IPS['SELF']);
	$iid = 0;
	if (IPS_InstanceExists($pid)) {
		$instance = IPS_GetInstance($pid);
		if ($instance['ModuleInfo']['ModuleID'] == '{485D0419-BE97-4548-AA9C-C083EB82E61E}') {
			$iid = $pid;
		}
	}
	if ($iid == 0) {
		$iid = IPS_CreateInstance('{485D0419-BE97-4548-AA9C-C083EB82E61E}');
		IPS_SetParent($iid, $pid);
		IPS_SetName($iid, 'Meldungen');
		IPS_SetParent($_IPS['SELF'], $iid);
		$pid = $iid;
	}
	$did = @IPS_GetVariableIDByName('Daten', $pid);
	if ($did === false) {
		$did = IPS_CreateVariable(3);
		IPS_SetParent($did, $pid);
		IPS_SetName($did, 'Daten');
	}
	SetValueString($did, json_encode(array()));
	$mid = @IPS_GetVariableIDByName('Meldungen', $pid);
	if ($mid === false) {
		$mid = IPS_CreateVariable(3);
		IPS_SetParent($mid, $pid);
		IPS_SetName($mid, 'Meldungen');
		IPS_SetVariableCustomProfile($mid, '~HTMLBox');
	}
	$lid = @IPS_GetVariableIDByName('letzte Meldungsnummer', $pid);
	if ($lid === false) {
		$lid = IPS_CreateVariable(1); 
		IPS_SetParent($lid, $pid); 
		IPS_SetName($lid, 'letzte Meldungsnummer'); 
	}
	SetValueInteger($lid, 0);
	$ids = IPS_GetChildrenIDs($_IPS['SELF']);
	foreach ($ids as $id) {
		if (IPS_EventExists($id) && substr(IPS_GetName($id), 0, 16) == 'Remove Message #') {
			IPS_DeleteEvent($id);
		}
	}
	renderData(array());
}

// Meldungen als HTML zusammenbauen.
function renderData ($data) {
global $fifo, $nomsg, $noico, $bfort;
	$pid = IPS_GetParent($_IPS['SELF']);
	$mid = IPS_GetVariableIDByName('Meldungen', $pid);
	$cnt = count($data);
	// Etwas CSS und HTML
	$style = "";
	$style = $style.'<style type="text/css">';
	if($cnt == 0 && $nomsg) {
		$style = $style.'table.msg { width:100%;}';
	}
	else {
		$style = $style.'table.msg { width:100%; border-collapse: collapse; }';
	}
	if($noico) {
		if($bfort) {
			$style = $style.'td.fst { width: 42px; text-align:center; padding: 2px;  border-left: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
			$style = $style.'td.lst { padding: 5px; border-right: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
		}
		else {
			$style = $style.'td.fst { padding: 5px; border-left: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
			$style = $style.'td.lst { width: 42px; text-align:center; padding: 2px; border-right: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
		}
	}
	else {
		$style = $style.'td.fst { width: 36px; padding: 2px; border-left: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
		$style = $style.'td.mid { padding: 2px;  border-top: 1px solid rgba(255, 255, 255, 0.1); }';
		$style = $style.'td.lst { width: 42px; text-align:center; padding: 2px;  border-right: 1px solid rgba(255, 255, 255, 0.2); border-top: 1px solid rgba(255, 255, 255, 0.1); }';
	}
	$style = $style.'tr:last-child { border-bottom: 1px solid rgba(255, 255, 255, 0.2); }';
	$style = $style.'.blue { padding: 5px; color: rgb(255, 255, 255); background-color: rgb(0, 0, 255); background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }';
	$style = $style.'.red { padding: 5px; color: rgb(255, 255, 255); background-color: rgb(255, 0, 0); background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }';
	$style = $style.'.green { padding: 5px; color: rgb(255, 255, 255); background-color: rgb(0, 255, 0); background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }';
	$style = $style.'.yellow { padding: 5px; color: rgb(255, 255, 255); background-color: rgb(255, 255, 0); background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }';
	$style = $style.'.orange { padding: 5px; color: rgb(255, 255, 255); background-color: rgb(255, 160, 0); background-image: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -o-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -moz-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -webkit-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-image: -ms-linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); }';
	$style = $style.'</style>';
	$content = $style;
	$content = $content.'<table class="msg">';

	if ($cnt == 0) {
		// Keine Meldung, dann sagen wir das auch ;-)
		if(!$nomsg) {
			$content = $content.'<tr>';
			$class = 'fst';
			// Icon?
			if(!$noico) {
				$content = $content.'<td class="fst"><img src=\'img/icons/Ok.svg\'></img></td>';
				$class = 'mid';
			}
			// Button vor Text
			if($noico && $bfort) {
				$content = $content.'<td class=\'fst\'><div class=\'green\' onclick=\'alert("Nachricht kann nicht bestätigt werden.");\'>OK</div></td>';
				$content = $content.'<td class=\'"lst\'>Keine Meldungen vorhanden!</td>';
			}
			// Button nach Text
			else {
				$content = $content.'<td class=\''.$class.'\'>Keine Meldungen vorhanden!</td>';
				$content = $content.'<td class=\'lst\'><div class=\'green\' onclick=\'alert("Nachricht kann nicht bestätigt werden.");\'>OK</div></td>';
			}
			$content = $content.'</tr>';
		}
		// Keine Meldung, keine Ausgabe
		else {
			$content = $content.'<tr><td></td></tr>';
		}
	}
	else {
		// fifo or lifo
		if(!$fifo) {
			$data = array_reverse($data, true);
		}
		foreach ($data as $number => $message) {
			if ($message['type']) {
				switch ($message['type']) {
					case 4:
						$type = 'orange';
						break;
					case 3:
						$type = 'blue';
						break;
					case 2:
						$type = 'yellow';
						break;
					case 1:
						$type = 'red';
						break;
					default:
						$type = 'green';
						break;
				}
			}
			else {
				$type = 'green';
			}
			if ($message['image']) {
				$title = ' ';
				if (isset($message['timestamp'])) {
					$title .= 'title=\''.date("d.m.Y H:i", $message['timestamp']).'\' ';
				}
				$image = '<img src=\'img/icons/'.$message['image'].'.svg\''.$title.'></img>';
			}
			else {
				$image = '<img src=\'img/icons/Ok.svg\'></img>';
			}
			$content .= '<tr>';
			$class = 'fst';
			// Icon?
			if(!$noico) {
				$content = $content.'<td class="fst">'.$image.'</td>';
				$class = 'mid';
			}
			// Button vor Text
			if($noico && $bfort) {
				if ($message['removable']) {
					$content = $content.'<td class=\'fst\'><div class=\''.$type.'\' onclick="window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest();HTTP.open(\'GET\',o.url,true);HTTP.send();};window.xhrGet({ url: \'hook/msg?ts=\' + (new Date()).getTime() + \'&action=remove&number='.$number.'\' });">OK</div></td>';
				}
				elseif ($message['page']) {
					$content = $content.'<td class=\'fst\'><div class=\''.$type.'\' onclick="window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest();HTTP.open(\'GET\',o.url,true);HTTP.send();};window.xhrGet({ url: \'hook/msg?ts=\' + (new Date()).getTime() + \'&action=switch&page='.$message['page'].'\' });">OK</div></td>';
				}
				else {
					$content = $content.'<td class=\'fst\'><div class=\''.$type.'\' onclick=\'alert("Nachricht kann nicht bestätigt werden.");\'>OK</div></td>';
				}
				$content = $content.'<td class="lst">'.utf8_decode($message['text']).'</td>';
			}
			// Button nach Text
			else {
				$content = $content.'<td class="'.$class.'">'.utf8_decode($message['text']).'</td>';
				if ($message['removable']) {
					$content = $content.'<td class=\'lst\'><div class=\''.$type.'\' onclick="window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest();HTTP.open(\'GET\',o.url,true);HTTP.send();};window.xhrGet({ url: \'hook/msg?ts=\' + (new Date()).getTime() + \'&action=remove&number='.$number.'\' });">OK</div></td>';
				}
				elseif ($message['page']) {
					$content = $content.'<td class=\'lst\'><div class=\''.$type.'\' onclick="window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest();HTTP.open(\'GET\',o.url,true);HTTP.send();};window.xhrGet({ url: \'hook/msg?ts=\' + (new Date()).getTime() + \'&action=switch&page='.$message['page'].'\' });">OK</div></td>';
				}
				else {
					$content = $content.'<td class=\'lst\'><div class=\''.$type.'\' onclick=\'alert("Nachricht kann nicht bestätigt werden.");\'>OK</div></td>';
				}
			}
			$content .= '</tr>';
		}
	}
	$content = $content. '</table>';
	SetValueString($mid, $content);
}

// Fehlerbehandlung
function throwException($message) {
	IPS_LogMessage(IPS_GetName($_IPS['SELF']), 'MSG:'.$message);
}
################################################################################ 
?>

Das soll es dann aber auch endgültig gewesen sein :smiley:
Gruß Heiko (@Pitti)

1 „Gefällt mir“

Hallo
Das Skript ist super genau das was ich lange gesucht habe.
Jetzt nur noch eine Frage:Wie ist es möglich Zeit und Datum in normaler größe vor oder nach der Meldung anzuzeigen?und nicht so klein über dem Icon da ich IPS View verwende in verbindung mit einem Tabblet da ist es sehr schwer die Zeit anzuzeigen.
Denis