Hallo @Loewenkoenig,
wie hast du in deinem Visu unten die Gaugen gemacht? Grafana?
Gruß
Ja genau, mit Grafana.
Peter
Was hast du im Meldungen Script alles geändert? Farben auf der linken Seite und klein (ohne OK) würde ich auch gerne haben.
Kannst du dein Script Teilen?
Gruß
Verwende ebenfalls das Meldungsskript von Pitti dem Lieben!
Hier gibts auch Support wenns mal hackt, wie bei mir.
Ich habe mittlerweile 5 Meldungsskripte laufen:
Die Meldungen können entweder weggeklickt, oder automatisch nach Zeit gelöscht werden.
4 Farben stehen zur Verfügung (Prios)
Pitti, Danke für dein Skript!
gibt es einen Link wo ich das Script finde
Bittesehr
lg
Sicher teile ich es.
Hab genau die von dir erwähnten Dinge geändert, also das OK weg, die Punkte in unterschiedlichen Farben auf der linken Seite und das ganze in klein gehalten, danach wollte ich die Symbole haben und zum Schluss der Meldungstext.
Wenn keine Meldungen vorhanden sind, wollte ich einen zentrierten Text „Keine Meldungen vorhanden!“ haben und das ganze ohne Farbpunkt oder OK-Feld.
Bitte extrem zufrieden und nutze wie gesagt die Meldungsübersicht täglich mehrmals.
Bittesehr:
<?
################################################################################
# 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)
# geändert von Loewenkoenig (07.01.2020)
#
# 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'];
$timestamp = time();
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, $timestamp);
}
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, $timestamp)
{
$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, 'timestamp' => $timestamp);
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: 16px; text-align:center; padding: 0px; border-left: 0px solid rgba(255, 255, 255, 0.2); border-top: 0px solid rgba(255, 255, 255, 0.1); }';
$style = $style.'td.pre { width: 89px; padding: 5px; border-top: 0px solid rgba(255, 255, 255, 0.1); }';
$style = $style.'td.mid { width: 32px; padding: 0px; border-top: 0px solid rgba(255, 255, 255, 0.1); }';
$style = $style.'td.lst { padding: 2px; border-right: 0px solid rgba(255, 255, 255, 0.2); border-top: 0px solid rgba(255, 255, 255, 0.1); }';
$style = $style.'tr:last-child { border-bottom: 0px solid rgba(255, 255, 255, 0.2); }';
$style = $style.'.blue { padding: 7px; 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: 7px; 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: 7px; 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: 7px; 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><td></td></tr>'; // Diese Zeile ersetzt die nächsten 5 und bewirkt, dass das Meldungsfenster leer bleibt, wenn keine Meldungen anstehen.
$content = $content.'<tr>';
// $content = $content.'<td>'; // class="fst"><img src=\'img/icons/Ok.svg\'></img></td>';
$content = $content.'<td class="fst">Keine Meldungen vorhanden!</td>';
// $content = $content.'<td class=\'lst\'><div class=\'green\' onclick=\'alert("Nachricht kann nicht bestätigt werden.");\'>OK</div></td>';
$content = $content.'</tr>';
}
else {
foreach ($data as $number => $message) {
if ($message['type']) {
switch ($message['type']) {
case 3:
$type = 'blue';
break;
case 2:
$type = 'yellow';
break;
case 1:
$type = 'red';
break;
default:
$type = 'green';
break;
}
}
else {
$type = 'green';
}
if ($message['image']) {
$image = '<img src=\'img/icons/'.$message['image'].'.svg\'></img>';
}
else {
$image = '<img src=\'img/icons/Ok.svg\'></img>';
}
$content .= '<tr>';
if ($message['removable']) {
$content = $content.'<td class=\'fst\'><div class=\''.$type.'\' onclick="window.xhrGet=function xhrGet(o) {var HTTP = new XMLHttpRequest();HTTP.open(\'GET\',o.url,true);HTTP.send();};window.xhrGet({ url: \'hook/remove?ts=\' + (new Date()).getTime() + \'&ScriptID='.$_IPS['SELF'].'&number='.$number.'\' }); "></div></td>'; // original: ">OK</div></td>';
}
else {
$content = $content.'<td class=\'fst\'><div class=\''.$type.'\' onclick=\'alert("Nachricht kann nicht bestätigt werden.");\'></div></td>'; // original: '>OK</div></td>';
}
$date = '';
if (isset($message['timestamp'])) {
$date = date("d.m. H:i", $message['timestamp']);
}
else {
$date = date("d.m. H:i", time());
}
$content = $content.'<td class="pre">'.$date.'</td>';
$content = $content.'<td class="mid">'.$image.'</td>';
$content = $content.'<td class="lst">'.utf8_decode($message['text']).'</td>';
$content .= '</tr>';
}
}
$content = $content. '</table>';
SetValueString($MessagesID, $content);
}
function throwException ($message)
{
IPS_LogMessage($_IPS['SELF'], $message);
}
?>
Hallo Löwenkönig,
Vielen Dank auch dir für deine Mühe und das Skript, ich werde das gleich ausprobieren!
Muss man manuell einen WebHook erzeugen um löschen zu können?
Durch klicken auf das farbige Quadrat am Anfang geht die Meldung nicht weg.
lg
Christian
Guten Morgen,
sorry für die Anfänger-Frage, aber wie bekomme ich jetzt Meldungen in das Script ergänzt?
Ich konnte das Script hinzufügen und ausführen. Allerdings erhalte ich die Rückmeldung im WebFront, dass derzeit keine Meldungen vorliegen → klar, dass Script weiß ja noch nicht was es alles melden soll
Hi,
Im Script oben ist die Beschreibung
Meldung Erstellen:
$number = IPS_RunScriptWaitEx(ObjektID, array('action' => 'add', 'text' => 'Test', 'expires' => time() + 60, 'removable' => true));
ObjektID ist die ID von dem Script.
Gruß
Sagt mal,
wie kann ich denn beim Anlegen einer Meldung die Meldungsnummer selbst bestimmen?
Ich dachte da an Scriptnummer+2 Stellen zum durchnummerieren.
Oder anders gefragt, woher wisst ihr später in den Scripts, welche Meldungsnummer ihr nach Beseitigung des Ursprungs löschen müsst?
Oder denke ich da zu kompliziert?
Viele Grüße,
Doc
Hi Doc,
der Aufruf des Scripts liefert Dir die Nummer zurück … und die könnte man sich merken.
Man kann ja Meldungen zeitgesteuert löschen oder durch einen Button-Klick löschen.
Also es gibt 3 Möglichkeiten zum Löschen:
Gruß Heiko
Die Nummern musst du dir dann merken, wenn du auch automatisch löschen willst.
Ich nutze das eher zum Melden und Anzeigen von „Aufgaben“, die ich automatisch anlege.
Damit die nicht täglich neu angelegt werden, wenn sie schon vorhanden sind, erzeuge ich einen Hash, der aber im HTML durch die Farbe unsichtbar ist.
Es kommt auf die Aufgabenstellung an, dann findet sich immer ein Weg .
Ja das ich die Nummer geliefert bekomme, hatte ich gesehen.
Ich wollte aber nicht bei jeder Meldung extra eine Variable haben, um diese zu speichern.
Hintergedanke war der, das ich z.B. eine Meldung habe, das irgendwo eine Batterie leer wird.
Sobald ich dieses „Problem“ gelöst habe, soll die Meldung wieder verschwinden, ohne das ich etwas drücken muss.
Ich hätte mir jetzt gewünscht, das die Meldungsnummer eben die Nummer des ausführenden Scipts wäre plus 1 o. 2 Stellen um aus einem Script mehrere Meldungen generieren zu können.
Das gleiche Script kann dann seine eigenen Meldungen auch wieder löschen.
Wenn die Meldungen nur durchnummeriert werden, weiss ich nicht mehr, was zu löschen ist.
VG,
Doc
Hallo Christian,
hast du es zum Laufen gebracht?
lg
Peter
Das ist leider der Nachteil, dass du für jede Meldung eine Meldungs-Variable anlegen musst.
Das funktioniert bei mir einwandfrei.
Wenn ich eine Batterie wechsle, ändert das den Zustand der Batterie-Variable und diese wiederum löst das Skript aus und löscht die Meldung.
Ja Peter!
Vielen Dank. Jetzt laufen 4 Meldungsskripte einwandfrei!!!
Ich lasse so ziemlich alles melden, was mir wichtig erscheint.
Es ist mittlerweile elementares Bestandteil meiner Visualisierung !!!
lg aus Österreich
Hast du denn dafür jetzt auch für jede Meldung eine „Meldungsnummervariable“ angelegt oder setzt du alle Meldungen „händisch“ zurück?
Könnte man das Script nicht so umbauen, das es eben genau dafür die Scriptnummer benutzt?
Ich steig da gerade nicht so ganz hinter …
VG Doc
Legst du die Variablen dynamisch bei einer Meldung an und löscht die anschließend wieder oder wie machst du das?
meistens löschen nach zeit. oder händisch alle meldungen, z.b. gelb (warnungen)
…