Meldungsanzeige im WebFront

Ich bekomme zwar die Meldungen angezeigt aber leider kann ich sie nicht direkt löschen bzw bestätigen jemand nen tip?

Danke es funktioniert nachdem ich die removeMessage.phph angelegt und ausgefüllt hatte (;

Hallo zusammen.

Da ich das Tool von Horst

http://www.ip-symcon.de/forum/threads/12115-Meldungsanzeige-im-WebFront?p=101126#post101126

letztens erst (wieder) gefunden hatte, habe ich es auch gleich auf den Raspi (IPS Version vom 31.3.15) ausprobiert.

Nachdem ich die letzte Zeit in die Fehlersuche investiert habe und auch paresy zuletzt mit dem Fehler unter RasPi:

-Fix: Sender bei RunScript wird korrekt gesetzt

beschäftigt habe (Danke dafür) möchte ich meine Anpassungen hier gerne posten.

Es war nur das Script „Meldungsanzeige“ in welchem ich anpassen musste.

<?php
/*******************************************************************************************************************************

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.


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
- 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.


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


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.

*******************************************************************************************************************************/

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

    case 'RunScript':
        $result = 0;

// für RasPi angepasst        
        switch ($_IPS['action'])
        {
            case 'remove':
// für RasPi angepasst
$number = $_IPS['number'];
                if (isset($number) && $number > 0)
                {
                    $result = removeMessage($number);
                }
                break;

            case 'add':
// für RasPi angepasst
$expires = $_IPS['expires'];
$removable = $_IPS['removable'];
$text = $_IPS['text'];
                if (!(isset($expires) && $expires > time())) { $expires = 0; }
                if (!(isset($removable) && $removable === true)) { $removable = false; }
                if (isset($text) && is_string($text) && $text != '')
                {
                    $result = addMessage($text, $expires, $removable);
                }
                break;

            case 'removeAll':
                $result = removeAllMessages();
                break;
        }
        echo $result;
        break;

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

function removeAllMessages ()
{
// für RasPi angepasst
global $_IPS;

    $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 removeMessage ($number)
{
// für RasPi angepasst
global $_IPS;

    $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);
    }
    else
    {
        throwException('Could not remove message #'.$number.': Semaphore timeout!');
    }

    return $result;
}

function addMessage ($text, $expires, $removable)
{
// für RasPi angepasst
global $_IPS;
    $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('text' => utf8_encode($text), 'expires' => $expires, 'removable' => $removable);
        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);

// für RasPi angepasst
//Wird ersetzt: IPS_SetEventCyclicDateBounds($eventID, mktime(0, 0, 0, date('n', $expires), date('j', $expires), date('Y', $expires)), 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);


// für RasPi angepasst
//Wird ersetzt: IPS_SetEventCyclicTimeBounds($eventID, mktime(date('H', $expires), date('i', $expires), date('s', $expires)), 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);
    }
    else
    {
        throwException('Could not add message: Semaphore timeout!');
    }

    return $number;
}

function install ()
{
// für RasPi angepasst
global $_IPS;

    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)
{
// für RasPi angepasst
global $_IPS;

    $ParentID = IPS_GetParent($_IPS['SELF']);
    $DataID = IPS_GetVariableIDByName('Daten', $ParentID);
    $MessagesID = IPS_GetVariableIDByName('Meldungen', $ParentID);

    $content = "";

    if (count($data) == 0)
    {
        $content = 'Keine Meldungen vorhanden!';
    }
    else
    {
        $content = '<table style="width: 100%;"><tbody>';
        foreach ($data as $number => $message)
        {
            $content .= '<tr>';
            if ($message['removable'])
            {
                //WIN //$content .= '<td style="line-height: 25px;">'.utf8_decode($message['text']).'</td><td align="right"><div onclick="window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest();HTTP.open(\'GET\',o.url,true);HTTP.send();};window.xhrGet({ url: \'user/removeMessage.php?ts=\' + (new Date()).getTime() + \'&ScriptID='.$_IPS['SELF'].'&number='.$number.'\' });" style="border:1px solid #3B3B4D; margin:0px; padding:3px; text-align:center; width: 100px;">OK</div></td>';
                $content .= '<td style="line-height: 25px;">'.utf8_decode($message['text']).'</td><td align="right"><div onclick="window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest();HTTP.open(\'GET\',o.url,true);HTTP.send();};window.xhrGet({ url: \'user/removeMessage.php?ts=\' + (new Date()).getTime() + \'&ScriptID='.$_IPS['SELF'].'&number='.$number.'\' });" style="border:1px solid #3B3B4D; margin:0px; padding:3px; text-align:center; width: 100px;">OK</div></td>';
            }
            else
            {
                $content .= '<td style="line-height: 25px;" colspan="2">'.utf8_decode($message['text']).'</td>';
            }
            $content .= '</tr>';
        }
        $content .= '</tbody></table>';
    }

    SetValueString($MessagesID, $content);
}

function throwException ($message)
{
// für RasPi angepasst
global $_IPS;

    IPS_LogMessage($_IPS['SELF'], $message);
}
?>

Zusätzlich musste ich noch die Datei „removeMessage.php“ in den Pfad /usr/share/symcon/webfront/user kopieren (irgendwie ist mir das untergegangen). Wenn sie dort fehlt, sind die OK Tasten (zum Löschen des einzelnen EIntrages) zwar sichtbar aber ohne Funktion.

Hoffe, es hilft dem Einen oder Anderen. Ich finde die Anzeige für meine ganzen Hinweise auf dem Webfront ganz praktisch.

Danke an Horst für Deine Arbeit.

Gruß
lueralba

Schau dir mal das neue Hook Control im RasPi an. Damit kannst du dein Feedback der „removeMessages“ einsammeln, ohne, dass du eine Datei im User Ordner erstellen musst :slight_smile:

parsy

Hallo,

ich habe die Meldungsanzeige bei mir ins IPS eingebunden und funktioniert soweit.
Nur den OK-Button bekomme ich nicht ans laufen.
Die removeMessage.php liegt im User Ordner, wird aber scheinbar gar nicht aufgerufen.
In der Konsole des Firefox bekomme ich den Fehler „ReferenceError: dojo is not defined“.
Ich finde auch keine Referenz auf dojo.

Was mache ich falsche, bzw. fehlt hier noch eine Refernz zu dojo?

Danke vorab!

Gruß
André

Im ersten Post ist eine Variante ohne dojo. Welche nutzt du?

paresy

Hallo,

Sorry für die späte Rückmeldung, kam erst heute wieder dazu hier weiter zu machen.

Hatte das letzte Skript hier im Thread benutzt.
Habe jetzt die Variante ohne dojo bei mir integriert und alles läuft :slight_smile:

Super danke!

Gruß
André

Hi zusammen,

der Thread ist mir vor paar Tagen aufgefallen und fand die Idee super. Habe aus den Anregungen und Anpassungen jetzt mal eine Lösung für mich gefunden. Was habe ich geändert bzw. neu gemacht:

[ul]
[li]die Idee mit der Message-Nummer und dem Bild habe ich übernommen
[/li][li]aus der Messsage-Nummer ist aber bei mir ein Message-Typ geworden
[/li][li]4 Typen werden unterstützt (Normal, Fehler, Warnung, ToDo)
[/li][li]etwas HTML und CSS dazugepackt
[/li][li]die einzelnen Typen werden über farbliche Button (grün, rot, gelb und blau) dargestellt
[/li][li]bei den Bildern kann man aus den bekannten WebFront Bildern auswählen
[/li][li]die Idee mit dem Webhook für removeMessage.php umgesetzt
[/li][/ul]

Das Ergebnis sieht dann so aus …

Grüße Heiko

Moin Heiko, magst Du deinen Code hier teilen?
Gruß,
Peter

Gesendet von iPhone mit Tapatalk

Hi Peter,

gern doch, bin leider gerade dienstlich unterwegs und komme erst Freitag/Samstag dazu. Kommt aber :wink:

VG Heiko

Cool, freut mich. Danke und Grüße,
Peter

Gesendet von iPhone mit Tapatalk

So, nun ist es doch Samstag geworden. Bei mir läuft das ganze auf IPS4.1 auf Raspi 3.

Hier das angepasste Meldungsscript (Doku sollte auch up-to-date sein)


<?
################################################################################
# Scriptbezeichnung: System.Dashboard.ips.php
# Version:	1.0
# Author:	Heiko (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. 
#
# 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 (unterhalb eines dafür erzeugten Vaterobjektes)  
# - Diesen PHP-Code hineinkopieren 
# - Skript Abspeichern 
# - 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) 
# - 'image' (optional): Name des WebFront-Icons (ipsIcon<name>), welches
#          für Meldung verwendet werden soll, Standard ist "Talk" 
# 
# 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) 
#
# 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. 
#
################################################################################

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

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

            case 'remove': 
				$number = $_IPS['number']; 
                if (isset($number) && $number > 0) { 
                    $result = removeMessage($number); 
                } 
                break; 

            case 'removeAll': 
                $result = removeAllMessages(); 
                break; 
            case 'removeType': 
                if (isset($type) && $type > 0) { 
                	$result = removeTypes($type); 
                } 
                break; 			
        } 
        echo $result; 
        break; 

    case 'TimerEvent': 
        $number = explode('#', IPS_GetName($_IPS['EVENT'])); 
        $number = $number[1]; 
        IPS_DeleteEvent($_IPS['EVENT']); 
        removeMessage($number); 
        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) { 
    $ParentID = IPS_GetParent($IPS_SELF); 
    $DataID = IPS_GetVariableIDByName('Daten', $ParentID); 

    $result = 0; 
	$i = 0; 
	$j = 0; 
    $data = json_decode(GetValueString($DataID), true); 
      
     if(!empty($type)) { 
         foreach($data as $dataid => $dataval) { 
              if($dataval['type'] == $type) { 
                if(removeMessage($dataid)) $i++; 
                $j++; 
             } 
          } 
          if ($i == $j) $result = 1; 
     } 
	return $result; 
} 

function removeMessage ($number) 
{ 
    $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); 
    } 
    else { 
        throwException('Could not remove message #'.$number.': Semaphore timeout!'); 
    } 

    return $result; 
} 

function addMessage ($text, $expires, $removable, $type, $image) 
{ 
    $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('text' => utf8_encode($text), 'expires' => $expires, 'removable' => $removable, 'type' => $type, 'image' => $image); 
        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); 
    } 
    else { 
        throwException('Could not add message: Semaphore timeout!'); 
    } 

    return $number; 
} 

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) 
{ 
    $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 { width:100%; border-collapse: collapse; }';
	$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.'</style>';

    $content = $style; 
	$content = $content.'<table>';

    if (count($data) == 0) { 
		$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>'; 
			$content = $content.'<td class="fst">'.$image.'</td>';

			$content = $content.'<td class="mid">'.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/remove?ts=\' + (new Date()).getTime() + \'&ScriptID='.$_IPS['SELF'].'&number='.$number.'\' });">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($MessagesID, $content); 
} 

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

und hier noch der WebHook als Ersatz für removeMessage.php


<?
################################################################################
# Scriptbezeichnung: System.DashboardHook.ips.php
# Version:	1.0
# Author:	Heiko (Pitti)
#			(Kopie von removeMessage.php) 
#
# Dieses Skript ist Erforderlich, 
# damit Meldungen per Klick im WebFront gelöscht werden können.
#
# Installation: 
# ------------- 
#
# Dieses Skript vorzugsweise unter dem selben Vater-Objekt wie das 
# Meldungsanzeige-Script erstellen.
#
# Danach unter 'Kern Instancen' -> 'WebHook' einen neuen Hook hinzufügen: 
#  - 'hook/remove' => <dieses Script> 
#
# Man kann den Hook auch anders benennen, aber dann bitte im Meldungs-Script
# in der Funktion 'renderData' den Aufruf anpassen!!!
#
################################################################################

$ScriptID = $_GET['ScriptID'];
$number = $_GET['number'];

if ($ScriptID > 0 && $number >= 0) {
    IPS_RunScriptWaitEx((int)$ScriptID, array('action' => 'remove', 'number' => $number));
}

################################################################################
?>

Viel Erfolg!

Hallo pitti,

vielen Dank für die Überarbeitung des Scripts. Ich bin gerade dabei alles auf einem Raspi unter 4.1 zu heben. Das Script funktioniert soweit einwandfrei. Lediglich die PopUps funktionieren nicht mehr. Hatte mir schon mal den Aufruf in der Variable $content angesehen, konnte aber nicht wirklich was finden. Denke es liegt lediglich am JS…

Kannst Du evtl. helfen?

Danke Dir

Gruß
Buddy

Hi Buddy,

was meinst Du genau mit Popups? Hast Du ein Beispielaufruf / Scriptauszug?
Ich hatte bisher nur Alerts aispropiert, welche funktionieren.

Meld Dich einfach
Heiko

Oh man, ich hab da anscheinend schon lange nicht mehr dran rumgebaut. :smiley:

Ich hatte noch ne eigene Funktion für den Aufruf gebastelt, was auf Anforderung auch das WFC_SendNotification zusätzlich mit ausführt… Wenn ich das aber so nicht aufrufe, dann kann das ja nicht klappen… :banghead:

Insofern alles top, es klappt. Ich musste nur den Funktionsaufruf ändern…

Dankeschön… :rolleyes:

Alles gut, die schönsten Bugs sind doch die, welche man nicht fixen muss :wink:

Nichts zu danken!
Ciao Heiko

Gesendet von iPhone mit Tapatalk

Brauche bitte euren Rat!

Ich verwende das von pitti geänderte Skript schon seit längerer Zeit und bin grundsätzlich super zufrieden. Jedoch stört mich eine Kleinigkeit:

Wenn die Meldung gelöscht wird (per klick auf „OK“ oder automatisch nach x Sekunden), erscheint der „OK Haken“ zusammen mit dem Text „Keine Meldungen vorhanden“. Ich möchte aber nach dem Löschen von Meldungen (wie auch immer), KEINEN Text im HTML-Feld stehen haben. Was muss geändert werden, dass dies funktioniert?
Interessant ist nämlich, wenn ich den Befehl

$success = IPS_RunScriptWaitEx(52585 /*[Benachrichtigungen\Meldungen\Meldungen]*/, array('action' => 'removeAll'));

ausführe, verschwindet der „OK Haken“ und auch der farbliche Button und es erscheint der Text „Keine Meldungen vorhanden!“. Wie gesagt, möchte ich gerne gar keine Symbole oder Texte haben - das Feld soll leer sein.

Danke für eure Hilfe!

Peter

Hi Peter,

die Ausgabe ist ja eine Tabelle mit entsprechenden Zeilen und Spalten. Im Fall das es keine Meldungen gibt wird eine Tabelle mit einer Zeile und der beschriebenen Meldung ausgegeben.

Wenn Du nur die Zeile weg haben willst, dann musst Du dafür was anderes einsetzen:


    if (count($data) == 0) { 
		$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>';
    } 

also z.B.


		$content = $content.'<tr><td></td></tr>';

Wenn Du die ganze Tabelle weg haben willst, dann ist es etwas aufwendiger. Dann musst Du um die ganzen Ausgaben von <table>, </table> noch die Prüfung auf „count($data) == 0“ machen.

Hilft das?

Ciao
Pitti

Super pitti, genau das war’s! Mehr brauch ich nicht. Sobald alle Meldungen erloschen sind, bleibt das Feld jetzt leer.

Danke :slight_smile:

Hallo Pitti,

ich kannst du mir sagen wieso ich mit folgendem Script einzelne Meldungstypen nicht gelöscht bekomme?

<?

// Meldung eines bestimmten Types löschen
// Parameter: Meldungstyp der gelöscht werden soll (x = 0|1|2|3)
// Art der Meldung ... 0 => Normal(grün), 1 => Fehler(rot), 2 => Warnung(gelb), 3 => Todo(blau) 

$ObjektID = 25111 /*[Scripte & Variablen\Meldungen & Push-Nachrichten\Meldungen\System Dashboard]*/;

	IPS_RunScriptWaitEx($ObjektID, array('action' => 'removeType', 'type' => 0));


?>

Alle Meldungen löschen funktioniert dagegen…

<?

// Alle Meldungen löschen

$ObjektID = 25111 /*[Scripte & Variablen\Meldungen & Push-Nachrichten\Meldungen\System Dashboard]*/;

	IPS_RunScriptWaitEx($ObjektID, array('action' => 'removeAll'));

?>

Beste Grüße
Kai