Meldungsanzeige im WebFront

Gute Punkte bzw. Verbesserungen! Das mit dem Sortieren wollte ich auch schon immer haben …

Ich bastle das mal dazu und stelle das Update (v2.1) dann ein.

Danke & Ciao
Pitti

Hi,

ggf. für den ein oder anderen auch noch interessant (wenigstens für mich :D) - ein Zeitstempel wan die Nachricht erstellt wurde.

Vielleicht hast Du eine besere Idee zur Umsetzung der Darstellung.

Danke,
Grüße
Thomas

Uii, hier wird ja gleich die ganze Hand genommen :wink:

Spaß beiseite, finde es toll das es anscheinend doch einige gibt die das Teil benutzen! Ist auch eines meiner Lieblingsscripte/Funktionalität.

Finde das mit der Zeit auch nicht schlecht - darstellungstechnische auch nicht das verkehrteste, mal schauen ob ich noch eine Idee entwickle!

Was fürs kalte WE
Ciao Pitti

Genau! - Her damit :wink:

musste / habe meine Pushover Anbindung gleich mit umgebaut…
siehe https://www.symcon.de/forum/threads/36909-Pushover-kann-jetzt-auch-Attachments-%28z-B-Bilder-verschicken%29 hier

und mal ein kleines Bild der Zeit Darstellung…

ggf. könne wir ein paar Allgemeine gut passende Kategorien festlegen, auch mit Farben, so wie Du es angeregt hast…
Ich habe hier bei mir … womit ich gut auskomme:

„system“ , „info“, „wetter“, „alarm“, „sicherheit“, „geraete“, „telefon“ …

Danke Dir,
Gruß
Thomas

P.S: Das ist auch eines meiner wichtigsten Scripte - was schon seit langen gut läuft!

Falls ich noch was anregen darf? :smiley:

Was hälst Du den von der Idee, wann man sich schon über Pushover eigene (Kamera) Bilder senden kann, diese auch gleich mit in der Meldungsanzeige einzubinden. Als kleine vorschau und beim drauf Klicken dann als PopUp?

(dei den beiden Bildern wurde etwas nachgeholfen :stuck_out_tongue: … - in real geht das (noch) nicht)

msg_bild.JPG

Grüße
Thomas

Hallo zusammen,

ein Update mit kleinen Änderungen:

[ul]
[li]über Konfigurationsparameter $fifo kann man die Reihenfolge der Meldungsausgabe steuern
[/li][li]der Zeitstemmpel wann die Meldung erzeugt wurde wird beim Hover über das Icon angezeigt
[/li][li]Doku verbessert
[/li][/ul]

Das mit dem Zeitstempel ist noch nicht perfekt, aber für mich ein akzeptabler Kompromiss bis zur finalen Lösung :wink:
Bei Touch-Geräten einfach kurz aufs Icon drücken und halten.

Das mit Pushover muss ich mir später mal in Ruhe anschauen, sorry kam nicht in den Recall :smiley:

Viel Spaß
Pitti


<?
################################################################################
# Scriptbezeichnung: System.Dashboard.ips.php
# Version: 2.1.20180224
# 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 	= 52523 /*[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);
                }
                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: 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 (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 {
		// fifo or lifo
		if(!$method) {
			$data = array_reverse($data);
		}
		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>';
			$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/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($MessagesID, $content);
}

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

?>

Hallo Pitti,

mit der Version 2.1 lassen sich einzelne Meldungen bei „$fifo = false“ nicht mehr löschen.

Bei „$fifo = true“ funktioniert es allerdings. Kannst du das mal bitte testen?

@All: Bekommt jemand den Zeitstempel unter IPSView angezeigt? Bei mir öffnet sich immer das Menü von IPSView…

Beste Grüße
Kai

Ups, schau ich mir heute abend an!

Ciao Pitti

Fehler gefunden :banghead:

Leider war der vorgeschlagene Code für das Umdrehen des Arrays nur bedingt gut geignet :smiley:

array_reverse($data) verändert leider die Schlüssel, erste ein


// fifo or lifo
		if(!$method) {
			$data = array_reverse($data, true);
		}

macht es korrekt!

Teste noch bis morgen und stelle nochmal das ganze Script ein!

Gute Nacht
Pitti

Moin in die Runde,

ich habe da schon mal für mich etwas weiter gemacht …
Etwas anders ist der Ablauf bei mir. Ich sende die Daten zu meinem „Pushover“ Script und aus diesem herraus wird unten die Webfront Meldung generiert …

<?


// User Key von Pushover
$push_user = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYY";

//
// die einzelnen Kategorien müssen unten weiter noch im Array eingetragen werden ....

// Schalter im Webfront ob Pushnachrichten versendet werden sollen
$id_pushnachricht_empfangen = 59209 /*[Scripte\Pushover / Webfront Meldungen\Pushover\Pushnachrichten empfangen]*/;


// ID des Webfront Meldungen Scriptes
$webfront_meldung = 29293 /*[Scripte\Pushover / Webfront Meldungen\Webfront Meldungen\Webfront Meldungen]*/;


// Aufzurufen über
// type -> push | webfront
// gruppe: "system"	"info" "wetter" "alarm" "sicherheit" "geraete" "telefon"
// nachricht: Inhalt der Nachricht
// verfall: "+10 minutes" Automatisches Löschen der Nachricht nach eingegebenen Zeit. Ohne Angabe Standard +1 Day
// bild: Pfad absolut zum Bild
// page = item0815 Id der kategorie der aufzurufenen Webfront Seite


// IPS_RunScriptEx ( $pushover_ansteuerung, Array("type" => "push", "gruppe" => "geraete" , "nachricht" => "Geräte - Testnachricht mit Bild", "bild" => "http://ips:82/img/sonne.jpg")) ;
// IPS_RunScriptEx ( $pushover_ansteuerung, Array("type" => "push", "gruppe" => "system" , "nachricht" => "System: neue IPS Software verfügbar ")) ;
// IPS_RunScriptEx ( $pushover_ansteuerung, Array("type" => "push", "gruppe" => "info" , "nachricht" => "Info - allgemeiner Hinweis")) ;
// IPS_RunScriptEx ( $pushover_ansteuerung, Array("type" => "push", "gruppe" => "wetter" , "nachricht" => "Wetter - Schnefall oder Sonne.")) ;
// IPS_RunScriptEx ( $pushover_ansteuerung, Array("type" => "push", "gruppe" => "alarm" , "nachricht" => "Alarm - Fenster zu lange auf.")) ;
// IPS_RunScriptEx ( $pushover_ansteuerung, Array("type" => "push", "gruppe" => "sicherheit" , "nachricht" => "Sicherheit - Testnachricht Sicherheit Verfall 2 Minuten", "verfall" => "+2 minutes")) ;
// IPS_RunScriptEx ( $pushover_ansteuerung, Array("type" => "push", "gruppe" => "seite" , "nachricht" => "WFE Seite - Irgendwas im System was man(n) sich anschauen muss.", "seite" => "item6736")) ;
// IPS_RunScriptEx ( $pushover_ansteuerung, Array("type" => "push", "gruppe" => "telefon" , "nachricht" => "Telefon - Irgendwer hat angerufen")) ;


	// Type - ob anzeige nur im Webfront oder auch als Push Nachricht
		if(!isset($type)) { $type = "push"; }
			if ( GetValue($id_pushnachricht_empfangen) == true  && $type == "push") {
				$pushnachricht = true;
			} else {
				$pushnachricht = false;
			}
	
	// Zeitpunkt des automatischen Löschens der Meldung
		if(!isset($verfall)) { $expires = strtotime("+1 Day"); } else { $expires = strtotime($verfall); }
	
	// keine Gruppe gesetzt
		if(!isset($gruppe)) { $gruppe = "info"; }
	
	// Inhalt
		if(!isset($nachricht)) { $nachricht = "Es wurde keine Nachricht angegeben.";}
	
	
	// Soll ein Bild mit gesendet werden?
	// Abfrage unen, falls nicht mit angegeben
	if(!isset($bild)) { $bild = "";}
	
	// Seiten Sprug Adresse
	if(!isset($seite)) { $seite = ""; }


	// Zuordnung der Meldung zu den Applications -> aus "Meldungsanzeige im Webfront"
		//  0 => Normal(grün), 1 => Fehler(rot), 2 => Warnung(gelb), 3 => Todo(blau), 4 => Goto(orange) 
		$type = Array (
			"system"		=> "3",
			"info"			=> "0",
			"wetter"		=> "2",
			"alarm"			=> "1",
			"sicherheit"	=> "3",
			"geraete" 		=> "0",
			"telefon" 		=> "0",
			"seite"			=> "4",
			
		);

		$icon = Array ( 
			"system"		=> "IPS",
			"info" 			=> "Information",
			"wetter"		=> "Rainfall",
			"alarm"			=> "Alert",
			"sicherheit"	=> "Warning",
			"geraete"		=> "Gear",
			"telefon"		=> "Telephone",
			"seite"			=> "IPS",
		);

	// Pushover Daten
		// Pushover-Powered Applications & Plugins
		$token = Array (
			"system"		=> "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
				"seite"		=> "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
			"info" 			=> "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
			"wetter"		=> "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
			"alarm"			=> "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
			"sicherheit"		=> "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
			"geraete" 		=> "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
			"telefon" 		=> "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
		);
		
		// Sounds
		$sound = Array (
			"system"		=> "cosmic",
			"info"			=> "pushover",
			"wetter"		=> "falling",
			"alarm"			=> "persistent",
			"sicherheit"		=> "tugboat",
			"geraete"		=> "gamelan",
			"telefon"		=> "intermission"
		);

		// Nachrichten Priorität
		$priority = Array (
			"system"		=> "0",
			"info"			=> "0",
			"wetter"		=> "0",
			"alarm"			=> "1",
			"sicherheit"		=> "0",
			"geraete"		=> "0",
			"telefon"		=> "0"
		);

		// Wiederholung im Prioritäsfall
		$retry = Array (
		"	system"			=> "0",
			"info"			=> "0",
			"wetter"		=> "0",
			"alarm"			=> "0",
			"sicherheit"		=> "0",
			"geraete"		=> "0",
			"telefon"		=> "0"
		);


if($pushnachricht) {

		$post = array(
			"token"			=> "$token[$gruppe]",
			"user"			=> $push_user,
			"message"		=> $nachricht,
			"sound"			=> $sound[$gruppe],
			"priority"		=> $priority[$gruppe],
			"retry"			=> $retry[$gruppe],
			"expire"		=> $expires,
			);

			// Bild 
			if((isset($bild)) and ($bild != "")) { 
				$file = new CURLFile($bild,'image/jpg','Bild');
				$post["attachment"] = $file;
			}

			curl_setopt_array($ch = curl_init(), array(
				CURLOPT_URL => "https://api.pushover.net/1/messages.json",
				CURLOPT_SSL_VERIFYPEER => true,
					CURLOPT_RETURNTRANSFER => false,
					CURLOPT_POSTFIELDS => $post
				)
			);

			$versand = curl_exec($ch);
			IPS_LogMessage("Pushover", utf8_decode($nachricht));
			curl_close($ch);
}

// Nachrichten im Webfront anzeigen
$message = IPS_RunScriptEx($webfront_meldung, array('action' => 'add', 'text' => utf8_decode(nl2br($nachricht)), 'expires' => $expires, 'removable' => true, 'type' => $type[$gruppe], 'bild' => $bild, 'icon' => $icon[$gruppe], 'page' => $seite));



?>

und hier meine bearbeitete Version vom Webfront Meldungsscript.

 <?
################################################################################
# Scriptbezeichnung: System.Dashboard.ips.php
# Version: 2.0,20180217
# 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. Zusätzlich muss noch die Webfront ID
# eingetragen werden und die notwendige Webhook "/hook/msg" angelegt werden.
#
# - Neues Skript erstellen
# - Diesen PHP-Code hineinkopieren
# - Webfront ID eintragen (Abschnitt 'Konfiguration')
# - Skript Abspeichern
# - Skript Ausführen
# - unter 'Kern Instanzen' -> 'WebHook' einen neues Ziel einrichten
#     - WebHook: /hook/msg  Ziel: dieses Script
#
# 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)
# - 'icon' (optional): Name des WebFront-Icons (ipsIcon<name>), welches
#          für Meldung verwendet werden soll, Standard ist "Talk"
# - 'page' (optional): Nur in Verbindung mit Type 4 - Seitenname
#
# 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, 'icon' => '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 ---------------------------------
#
# Hier Eure ID eintregen!!!
$wfc = 27618 /*[Home]*/;  // WebFront Configuration
#
################################################################################
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;
	            $icon    = isset($_IPS['icon']) ? $_IPS['icon'] : 'Talk';
				$bild    = isset($_IPS['bild']) ? $_IPS['bild'] : '';
                $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 (!($icon != '')) { $icon = 'Talk'; }
                if (is_string($text) && $text != '') {
                    $result = addMessage($text, $expires, $removable, $type, $icon, $bild, $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;
        break;

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

    case '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'] : '';
			  $number = isset($_GET['number']) ? $_GET['number'] : '';
              if (is_string($page) && $page !='') {
                  $result = switchPage($wfc, $page, $number);
              }
              break;
			case 'showimage':
              $image = isset($_GET['image']) ? $_GET['image'] : '';
			  $number = isset($_GET['number']) ? $_GET['number'] : '';
			  $text = isset($_GET['text']) ? utf8_decode($_GET['text']) : '';
	              if (is_string($image) && $image !='') {
					  $result = showImage($wfc, $image, $number, $text);
	              }
				
				
    }
    #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) {
    $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)) $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, $icon, $bild, $page)
{
  $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('id' => $number, 'text' => utf8_encode($text), 'create' => time(), 'expires' => $expires, 'removable' => $removable, 'type' => $type, 'icon' => $icon, 'bild' => $bild, '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);
  }
  else {
    throwException('Could not add message: Semaphore timeout!');
  }

  return $number;
}

function switchPage($wfc, $page, $number)
{
	IPS_LogMessage("Webfront Meldungen", "Page laden: ". $page . " ID " .$number);
	$result = WFC_SwitchPage($wfc, $page);
	return $result;
}

function showImage($wfc, $image, $number, $text)
{
	IPS_LogMessage("Webfront Meldungen", "Image anzeigen: ". $image . " ID " .$number . "Text: " . $text);
	$result = WFC_SendPopup($wfc, $text, "<img src='" . $image . "'>");
	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)
{
  $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: 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-icon: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-icon: -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-icon: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-icon: -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-icon: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-icon: -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-icon: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-icon: -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-icon: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-icon: -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.'.time {  vertical-align: text-top; float:left; font-size: 9px; padding-left:3px; padding-top: 0px; padding-right: 2px; margin-right:4px; }';
  $style = $style.'.img { vertical-align: text-top; padding-left: 8px; padding-right: 1px; padding-bottom:0px; width:25px; height: 25px;}';
  $style = $style.'.bild { margin-left:4px; margin-right:3px; padding: 1px; padding-top:4px; padding-right:0px; width:30px; height: 30px;}';
  
  $style = $style.'.pagebutton {float:left; padding: 5px; margin-right: 1px; color: rgb(255, 255, 255); background-color: rgb(255, 160, 0); background-icon: linear-gradient(top,rgba(0,0,0,0) 0,rgba(0,0,0,0.3) 50%,rgba(0,0,0,0.3) 100%); background-icon: -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>';
  $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=\'mid\'> </td>';
    $content = $content.'<td class=\'lst\'> </td>';
  $content = $content.'</tr>';
  }
  else {
    foreach (array_reverse($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['icon']) {
        $icon = '<img src=\'img/icons/'.$message['icon'].'.svg\' class="img"></img>';
      }
      else {
        $icon = '<img src=\'img/icons/Ok.svg\' class="img"></img>';
      }
  

     
	 
      $content .= '<tr>';
      $content = $content.'<td class="fst">'.$icon.'<div class="time">'. date("H:i:s", $message['create']) . '</div></td>';
      
      $content = $content.'<td class="mid">' . utf8_decode($message['text']).'</td>';
		  
	  		$content = $content . "<td class='mid'>";
	 		if($message['bild'] != "") { $linkbild = '<div><img class=\'bild\' src=\'' . $message['bild'] . ' \' 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=showimage&image='.$message['bild'].'&number='.$message['id'].'&text='.utf8_encode($message['text']).'\' });" ></div>'; }
				else { $linkbild = ""; }
				
			if($message['page'] != "") { $pagejump = '<div class=\'pagebutton\' 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'].'&number='.$message['id'].'\' });">IPS</div>'; }
				else { $pagejump = "";}
	  		$content = $content . $linkbild .  $pagejump . "</td>";
			
			
      if ($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=remove&number='.$message['id'].'\' });">OK</div></td>';
      }
	  elseif ( $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='.$message['id'].'\' });">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: " . $message);
}

?>

Grüße
Thomas

Hallo Thomas,
nutzt du vielleicht auch Telegram?

Grüße
Kai

Moin Kai,

nein - gibt es vorteile?

Grüße
Thomas

Hi zusammen,

hatte ja noch versprochen den kleinen Bugfix für das Löschen in Gänze zu schicken!


<?
################################################################################
# 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 	= 52523 /*[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);
                }
                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: 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 (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 {
		// fifo or lifo
		if(!$method) {
			$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>';
			$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/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($MessagesID, $content);
}

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

?>

Viel Spaß beim Erweitern :wink:
Pitti

Hi Thomas,

kann ich nicht sagen…

Ich versuche mal dein Script zu ändern um es für Telegram zu verwenden.

Gruß
Kai

Hallo, ich bekomme die Meldungen noch nicht per Click im Webfront gelöscht.

Über WebHook wird das Skript „removeMessage“ aber getriggert !

Hallo Thomas,

leider reichen meine PHP-Kenntnisse nicht aus um die Daten vom Telegram Modul herraus an das Meldungsscript weiterzuleiten.

Ich konnte dein Script wie folgt anpassen.

<?

// Telegram
$TelegramID = 22786 /*[Module\TelegramMessenger IPS]*/;					// ID vom Telegram-Modul
$UserID = XXXXXXXXXX;

// Schalter im Webfront ob Pushnachrichten versendet werden sollen
$id_pushnachricht_empfangen = 48490 /*[WORK\Push empfangen]*/;

// ID des Webfront Meldungen Scriptes
$webfront_meldung = 25111 /*[Scripte & Variablen\Meldungen & Push-Nachrichten\Meldungen\System Dashboard]*/;

// Type - ob anzeige nur im Webfront oder auch als Push Nachricht
        if(!isset($type)) { $type = "push"; }
            if ( GetValue($id_pushnachricht_empfangen) == true  && $type == "push") {
                $pushnachricht = true;
            } else {
                $pushnachricht = false;
            }
    
    // Zeitpunkt des automatischen Löschens der Meldung
        if(!isset($verfall)) { $expires = strtotime("+1 Day"); } else { $expires = strtotime($verfall); }
    
    // keine Gruppe gesetzt
        if(!isset($gruppe)) { $gruppe = "info"; }
    
    // Inhalt
        if(!isset($nachricht)) { $nachricht = "Es wurde keine Nachricht angegeben.";}
    
    
    // Soll ein Bild mit gesendet werden?
    // Abfrage unen, falls nicht mit angegeben
    if(!isset($bild)) { $bild = "";}
    
    // Seiten Sprug Adresse
    if(!isset($seite)) { $seite = ""; }

    // Zuordnung der Meldung zu den Applications -> aus "Meldungsanzeige im Webfront"
        //  0 => Normal(grün), 1 => Fehler(rot), 2 => Warnung(gelb), 3 => Todo(blau), 4 => Goto(orange) 
        $type = Array (
            "system"        => "3",
            "info"            => "0",
            "wetter"        => "2",
            "alarm"            => "1",
            "sicherheit"    => "3",
            "geraete"         => "0",
            "telefon"         => "0",
            "seite"            => "4",
            
        );

        $icon = Array ( 
            "system"        => "IPS",
            "info"             => "Information",
            "wetter"        => "Rainfall",
            "alarm"            => "Alert",
            "sicherheit"    => "Warning",
            "geraete"        => "Gear",
            "telefon"        => "Telephone",
            "seite"            => "IPS",
        );

    // Telegram Daten
		// ID vom Bot liefert als Ergebnis "Es wurde keine Nachricht angegeben."
		$token = Array (
            "system"        => "ID_TELEGRAM_BOT",
            "seite"        => "ID_TELEGRAM_BOT",
            "info"             => "ID_TELEGRAM_BOT",
            "wetter"        => "ID_TELEGRAM_BOT",
            "alarm"            => "ID_TELEGRAM_BOT",
            "sicherheit"        => "ID_TELEGRAM_BOT",
            "geraete"         => "ID_TELEGRAM_BOT",
            "telefon"         => "ID_TELEGRAM_BOT",
        );
	
	
if($pushnachricht) {

        $post = array(
			"token"            => "$token[$gruppe]",
            "user"            => $UserID,
            "message"        => $nachricht,
            "expire"        => $expires,
            );

            // Bild 
            if((isset($bild)) and ($bild != "")) { 
                $file = new CURLFile($bild,'image/jpg','Bild');
                $post["attachment"] = $file;
            }
			}

Telegram_SendText($TelegramID, $nachricht, $UserID, $ParseMode='HTML');


// Nachrichten im Webfront anzeigen
$message = IPS_RunScriptEx($webfront_meldung, array('action' => 'add', 'text' => $nachricht, 'expires' => $expires, 'removable' => true, 'type' => $type[$gruppe], 'bild' => $bild, 'icon' => $icon[$gruppe], 'page' => $seite));

?>

Ich habe ein weiteres Script angelegt um die Nachrichten zu verschicken.

<?

$telegram = 46682 /*[WORK\Telegram]*/;

IPS_RunScriptEx ($telegram, Array("type" => "push", "gruppe" => "sicherheit" , "message" => "Sicherheit - Testnachricht Sicherheit Verfall 2 Minuten", "verfall" => "+2 minutes")) ;

?>

Als ergebnis erhalte ich eine Telegram Nachricht mit dem Inhalt „Es wurde keine Nachricht angegeben.“. Diese bekomme ich auch über das Meldungsscript von Pitti angezeigt.

Hast du vielleicht eine Idee warum ich den eigentlichen Inhalt der Nachricht nicht angezeigt bekomme.

Gruß
Kai

Moin,

so wie es ausschaut? …

Übergibst Du hier die Variable ->message<-, dieses muss(müsste) aber ->nachricht<- lauten.

Sonst kennt das Versende Programm die Nachricht nicht und sendet den Text „Es wurde keine Nachricht angegeben.“.

Probier mal bitte,

$telegram = 46682 /*[WORK\Telegram]*/;

IPS_RunScriptEx ($telegram, Array("type" => "push", "gruppe" => "sicherheit" , "nachricht" => "Sicherheit - Testnachricht Sicherheit Verfall 2 Minuten", "verfall" => "+2 minutes")) ;

Grüße
Thomas

Hallo Thomas,

vielen Dank für deine Mühe.

Leider funktioniert es nicht. Es bleibt bei der Meldung „Es wurde keine Nachricht angegeben.“.

Beste Grüße
Kai

Moin,

Probiere doch mal bitte zur Eingrenzung , im „Telegram Script“… ganz oben die Variable $nachricht mit einem Wert zu füllen.

Wenn selbige in Telegram ankommt - muss etwas bei der Übergabe / Aufruf etwas nicht stimmen …

Grüße
Thomas

<?

//Hier test Nachricht 
$nachricht = "Dieses ist eine Test Nachricht";

// Telegram
$TelegramID = 22786 /*[Module\TelegramMessenger IPS]*/;                    // ID vom Telegram-Modul
$UserID = XXXXXXXXXX;

// Schalter im Webfront ob Pushnachrichten versendet werden sollen
$id_pushnachricht_empfangen = 48490 /*[WORK\Push empfangen]*/;

// ID des Webfront Meldungen Scriptes
$webfront_meldung = 25111 /*[Scripte & Variablen\Meldungen & Push-Nachrichten\Meldungen\System Dashboard]*/;

// Type - ob anzeige nur im Webfront oder auch als Push Nachricht


Hallo Thomas,

es scheint an der Übergabe der zu liegen.
Ich bekomme als Ergebniss in Telegram und Meldungsanziege im WF „Dieses ist eine Test Nachricht“ angezeigt.

2018-03-03 11_05_41-Telegram.png

Beste Grüße
Kai