Hilfe zur Texbox befüllung

Ich habe folgendes Vorhaben.
Ich möchte eine Textbox fortlaufend mit meinem Täglichen Gasverbrauch befüllen.
Wenn möglich mit Zeitstempel.
Ich habe eine StringVariable mit dem Profil Text-Box angelegt.
Als Eigene Aktion habe ich dieses Skirpt hinzugefügt

 SetValue($_IPS['VARIABLE'], $_IPS['VALUE']); 

Ich finde hier im Forum aber leider nichts wie ich die Textbox fortlaufend befüllen kann.
So das die mein Gaszählerstand immer hinzugefügt wird.
Ich glaube es ist bestimmt ganz einfach aber leider reichen hierfür meine PHP Kenntnisse nicht aus.
Danke schön vor ab für eure Mühe, vielleicht kann mir ja jemand weiter helfen.

Grundsätzlich ist ja wie Frage wie das dann aussehen soll? Wenn Du die Werte aufzeichen willst oder später als Diagramm darstellen brauchst Du eine Float bzw. Integer Variable und zeichnest diese auf. Wenn es Dir darum geht in einer Liste die Einträge dargestellt zu bekommen, dann wäre da eine String Variable mit dem Variablenprofil ~HTMLBox geeignet.

Die nächste Frage wäre ja dann wie lange soll diese Liste werden? Sollen da nur die letzten X Einträge stehen oder soll die endlos werden? Wenn Du da fortlaufend den Gasverbrauch als Text reinschreibst bekommst Du ja irgendwann eine ewig lange Liste.

Wenn Du ein bisschen mehr Information lieferst wie das dann im Endeffekt aussehen soll kann man Dir da sicher auch helfen.

Mir würde reichen wenn ich ca. 30 Einträge in die HTML Box schreiben könnte. Mehr braucht es nicht.
Ich würde die HTML Box dem Diagramm vorziehen. Wenn ich mal weis wie es funktioniert könnte ich auch andere Dinge damit Aufzeichen und hätte wieder was gelernt.

Moin!

Hier im Forum ist mal ein Script „rumgegeistert“, welches genau sowas gemacht hat. Da konnte man Strings zu einem „Meldungen-Log“ hinzufügen und auch wieder rauslöschen und die Anzahl beschränken usw…
Finde es leider spontan nicht. Kannst ja selbst mal schauen, ob du es findest und dann hier den Link nochmal posten.

Zum Beispiel zur Anzeige der letzten Schaltungen/Ereignisse/…

Grüße,
Chris

Ich habe soetwas als Funktion in meinen Scripten:


function SetStatusMeldungen($MessageDB, $Sender, $Meldung) {
	$AnzahlMeldungen = 10;
	$MessageDBID =	$MessageDB;
	$header ='<body><style type="text/css">body {background-color:black; color:white; font-size:2em;} table.liste { width: 100%; border-collapse: true; border: 0px; } table.liste td { border: 1px solid white; } table.liste th { border: 1px solid white; } </style>';
	$header.='<table border = "0" class="liste"><tr align="left">';
	$header.='<th>Datum</th>';
	$header.='<th>Uhrzeit</th>';
	$header.='<th>Sender</th>';
	$header.='<th>Meldung</th></tr>';

	$data ='<tr align="left"><td>'.date("d.m.Y").'</td>';
	$data.='<td>'.date("H:i:s").'</td>';
	$data.='<td>'.$Sender.'</td>';
	$data.='<td>'.$Meldung.'</td>';

	$object = IPS_GetObject($MessageDBID);
	$buffer = explode("</tr>",$object['ObjectInfo'],$AnzahlMeldungen);
	array_unshift ($buffer, $data);							// neue Zeile ins Array eintragen
	$buffer = array_slice( $buffer, 0, $AnzahlMeldungen );		// alten Wert abschneiden
	$string = implode("</tr>",$buffer);
	IPS_SetInfo($MessageDBID,$string);					// im Infobereich der Variablen, das Array ablegen
	SetValue($MessageDBID, $header . $string . "</table></body>");      // Variable beschreiben
	return ($string);
}

Aufrufbeispiel:

SetStatusMeldungenB(StatusGartenbewaesserung, IPS_GetName($_IPS['SELF']), "Schlauch Garage manuell ein");

„StatusGartenbewaesserung“ ist bei mir als Konstante definiert, da gehört die ID der String Variablen rein.

Das Infofeld der Variablen wird als Zwischenspeicher für die Zeilen missbraucht und in der Variablen ist der HTML Inhalt.

Alternativ Variante zwei:

function LogMyMessages($MessagesID, $visuID, $anzahl, $zeile) {
	//CEL holen
	$cel = array();
	$cel = unserialize(GetValue($MessagesID));
	//Wurden Alarme rückgelesen?
	if (!is_array($cel)) {
	  //Leeres Array anlegen
	  $cel = array();
	}
	//Eintrag anfügen
	array_unshift($cel,date("d.m. H:i")." :: ".$zeile);
	//Mehr als 30 Einträge
	if (count($cel) > $anzahl) {
	//ältesten Eintrag löschen
	    $cel = array_slice($cel,0,-1);
	}

	//für Designer aufbereiten
	$cel_liste = "";
	foreach ($cel as $cel_entry){
	  $cel_liste .= $cel_entry."
";
	}
	SetValue($visuID,$cel_liste);

	//CEL speichern
	SetValue($MessagesID,serialize($cel));
}

Ich hätte so etwas:

@bumaas:

Das sieht sehr ordentlich aus - wie hast Du das realisiert?

Kannst Du da einem (noch) Anfänger helfen?

Nurmalsonebenbei: So was hatte ich auch mal und das kam gar nicht gut bei der Family und vor allen bei meiner Frau an. Überwachung pur. [emoji6]

Gesendet von iPhone mit Tapatalk

Aber gerne. Komme aber erst Anfang der nächsten Woche dazu.

PS: meine Familie hat da überhaupt kein Problem mit. Ganz im Gegenteil, sie nutzt es selber um nachzusehen, wann etwas passiert ist.

Muss ich dieses Skript als Eigene Aktion in der StringVariable mit dem Profil HTML Box anlegen?
Ich tue mich mit der ganzen Sache noch etwas schwer.Und komme leider nicht weiter.
Vielleicht würde mir eine kurze Schritt für Schritt Anleitung helfen.
Danke für eure Mühe!

function SetStatusMeldungen($MessageDB, $Sender, $Meldung) {
    $AnzahlMeldungen = 10;
    $MessageDBID =    $MessageDB;
    $header ='<body><style type="text/css">body {background-color:black; color:white; font-size:2em;} table.liste { width: 100%; border-collapse: true; border: 0px; } table.liste td { border: 1px solid white; } table.liste th { border: 1px solid white; } </style>';
    $header.='<table border = "0" class="liste"><tr align="left">';
    $header.='<th>Datum</th>';
    $header.='<th>Uhrzeit</th>';
    $header.='<th>Sender</th>';
    $header.='<th>Meldung</th></tr>';

    $data ='<tr align="left"><td>'.date("d.m.Y").'</td>';
    $data.='<td>'.date("H:i:s").'</td>';
    $data.='<td>'.$Sender.'</td>';
    $data.='<td>'.$Meldung.'</td>';

    $object = IPS_GetObject($MessageDBID);
    $buffer = explode("</tr>",$object['ObjectInfo'],$AnzahlMeldungen);
    array_unshift ($buffer, $data);                            // neue Zeile ins Array eintragen
    $buffer = array_slice( $buffer, 0, $AnzahlMeldungen );        // alten Wert abschneiden
    $string = implode("</tr>",$buffer);
    IPS_SetInfo($MessageDBID,$string);                    // im Infobereich der Variablen, das Array ablegen
    SetValue($MessageDBID, $header . $string . "</table></body>");      // Variable beschreiben
    return ($string);
}  

Du brauchst:

[ul]
[li]eine String Varibale mit dem Varibalen Profil ~HTMLBox, diese mit CTRL+2 anlegen und das Variablenprofil ~HTMLBox zuweisen[/li][li]ein Skript das vom Ereignis aufgerufen wird, CTRL+3 Skript anlegen und Inhalt s.u. reinkopieren und Parameter anpassen[/li][li]ein Ereignis, rechts klick auf das Skript, CTRL+4 Ereignis hinzufügen. Je nachdem was Du machen willst, eben ein Zyklisches Ereignis oder ein Ereignis, das unter bestimmten Bedingungen eintritt und das Skript auffruft[/li][li] ein Ausgangswert mit Variable die Du ausliest, wenn Du den Wert als Diagramm darstellen willst, musst Du bei dieser Variable „Alle Variablenänderungen aufzeichnen“[/li][/ul]

Wenn Du nicht das Beschreibungsfeld nutzten willst kannst Du das Skript von Ralf noch erweitern, dann wird die Tabelle jeweils direkt aus der HTMLBox gelesen und wieder neu beschrieben, dann kannst Du das Beschreibungsfeld anderweitig benutzten.

Skript zum Anlegen einer Liste bei einem Ereignis


$max_elements = 30; // max elements in table
$message = GetValue(23456); // Wert aus der Variable auslesen
$sender = "Test"; // Name des Senders
$list_id = 12345; // String Variable mit Profil ~HTMLBox
// CSS Helper for tables http://divtable.com/table-styler/
$css = 'body {background-color:black; color:white; font-size:2em;}
table.liste { width: 100%; border-collapse: true; border: 0px; }
table.liste td { border: 1px solid white; }
table.liste th { border: 1px solid white; }'; // configuration of the table layout

$HTML = SetHTMLList($list_id, $sender, $message, $max_elements, $css);
//var_dump($HTML);

function SetHTMLList($list_id, $sender, $message, $max_elements, $css)
{
	$table_info = GetTable($list_id);
	$table_header = $table_info["table_header"];
	$table_rows = $table_info["table_rows"];
	$HTML = WriteTable($list_id, $table_header, $table_rows, $sender, $message, $max_elements, $css);
	return $HTML;
}

function WriteTable($list_id, $table_header, $table_rows, $sender, $message, $max_elements, $css)
{
	$HTML_Head = '<html>
	<head>
		<title>HTML Table</title>
	</head>
	<style type="text/css">'
	.$css.
	'</style>
	<body>';
	$HTML_Footer = '</body>
	</html>';

    $html_table_header ='<table border = "0" class="liste"><tr align="left">';
    $html_table_header.='<th>'.$table_header[0].'</th>';
    $html_table_header.='<th>'.$table_header[1].'</th>';
    $html_table_header.='<th>'.$table_header[2].'</th>';
    $html_table_header.='<th>'.$table_header[3].'</th></tr>';
	
	$data = array($table_header[0] => date("d.m.Y"), $table_header[1] => date("H:i:s"), $table_header[2] => $sender, $table_header[3] => $message);
	array_unshift ($table_rows, $data);                            // add new value to array
    $table_rows = array_slice($table_rows, 0, $max_elements);        // cut off old value
    $html_table_rows = '';
	foreach($table_rows as $key => $table_row)
	{
		$html_table_rows .= '<tr align="left"><td>'.$table_row[$table_header[0]].'</td>';
	    $html_table_rows .= '<td>'.$table_row[$table_header[1]].'</td>';
	    $html_table_rows .= '<td>'.$table_row[$table_header[2]].'</td>';
	    $html_table_rows .= '<td>'.$table_row[$table_header[3]].'</td></tr>';
	}
	$HTML_Table = $html_table_header.$html_table_rows;
	$HTML = $HTML_Head.$HTML_Table.$HTML_Footer;
	SetValue($list_id, $HTML);
	return $HTML;
}

function GetTable($list_id)
{	
	
	$htmlContent = GetValue($list_id);
		
	$DOM = new DOMDocument();
	$domhtmlcontent = @$DOM->loadHTML($htmlContent);
	if(empty($domhtmlcontent))
	{
		$aDataTableHeaderHTML = array("Datum", "Uhrzeit", "Sender", "Meldung");
		$aDataTableDetailHTML = array();
	}
	else
	{
		$DOM->loadHTML($htmlContent);
	
		$Header = $DOM->getElementsByTagName('th');
		$Detail = $DOM->getElementsByTagName('td');
		
		//#Get header name of the table
		foreach($Header as $NodeHeader) 
		{
			$aDataTableHeaderHTML[] = utf8_decode(trim($NodeHeader->textContent));
		}
		
		if(empty($aDataTableHeaderHTML))
		{
			$aDataTableHeaderHTML = array("Datum", "Uhrzeit", "Sender", "Meldung");
			$aDataTableDetailHTML = array();
		}
		else
		{
			//#Get row data/detail table without header name as key
			$i = 0;
			$j = 0;
			foreach($Detail as $sNodeDetail) 
			{
				$aDataTableDetailHTML[$j][] = utf8_decode(trim($sNodeDetail->textContent));
				$i = $i + 1;
				$j = $i % count($aDataTableHeaderHTML) == 0 ? $j + 1 : $j;
			}
			
			//#Get row data/detail table with header name as key and outer array index as row number
			for($i = 0; $i < count($aDataTableDetailHTML); $i++)
			{
				for($j = 0; $j < count($aDataTableHeaderHTML); $j++)
				{
					$aTempData[$i][$aDataTableHeaderHTML[$j]] = $aDataTableDetailHTML[$i][$j];
				}
			}
			$aDataTableDetailHTML = $aTempData; unset($aTempData);
		}
	}	
	$table_header = $aDataTableHeaderHTML;
	$table_rows = $aDataTableDetailHTML;
	return array("table_header" => $table_header, "table_rows" => $table_rows);
}
?>

Erst mal Danke für die ausführliche Anleitung.
Ich habe alles so gemacht wie beschrieben.

Meine HTML-Box sieht jetzt so aus:

Ich habe zum Test das Script alle 5 Sekunden getriggert.
Es wird jetzt immer nur die Uhrzeit Aktualisiert ansonsten wir in der HTML-Box nichts angehängt oder Aktualisiert.

Wo könnte ich den den Fehler suchen?

Fehler liegt im Skript, mea culpa. Kopiere den Inhalt oben noch mal neu raus dann sollte es funktionieren.

Wie Du den Wert darstellen willst ist ja Dir überlassen, es wäre aber in dem Zusammenhang vielleicht sinnvoller nicht den echten Wert sondern den Wert des Variablenprofiles auszulesen.

Also


$message = GetValueFormatted(12345);

statt


$message = GetValue(12345);

nutzten, dann hast die vielen Nachkommastellen weg und die passende Einheit.

Den Kopf der Tabelle kannst Du ja in dem Skript anpassen.

Super! Vielen vielen Dank für die Hilfe jetzt funktioniert es so wie es soll. Auch das mit den Nachkommastellen hab ich angepasst. Wieder was da zu gelernt.

Das ist ja schön zu hören.

Wenn Du das Layout der Tabelle anpassen willst oder die Schriftart musst Du einfach das bei CSS ergänzen. Falls Du kein Freund von CSS bist kann z.B. so was wie
Table Styler
eine Hilfestellung sein.

Hallo Fonzo,

wäre es auch möglich, mehr als eine Variable auszulesen und die Werte in einer einzigen Liste darzustellen?

VG …

Ja klar Du kannst so viele Werte auslesen wie Du willst und diese in einer Liste darstellen.

Dazu musst Du nur mit mehreren Skripten arbeiten. Das Skript oben enthält


$message = GetValue(23456); // Wert aus der Variable auslesen
$sender = "Test"; // Name des Senders

diese Werte sind fest im Skript eingetragen. Wenn Du dass jetzt Variabel haben willst arbeitest Du mit einem zweiten Skript und IPS_RunScriptEx das das eigentliche Skript, das die Liste erstellt, aufruft.

Du ersetzt also


$message = GetValue(23456); // Wert aus der Variable auslesen
$sender = "Test"; // Name des Senders

durch


$message = GetValue($_IPS['objectid']); // Wert aus der Variable auslesen
$sender = $_IPS['sendername']; // Name des Senders

Und dann hast Du das Skript auf dem ein Ereignis liegt wenn etwas passieren soll, das dann dieses Listenskript aufruft.
In dem Aufrufenden Skript wird der Wert übergeben


IPS_RunScriptEx(12345 /*[Objekt ID des Listenscripts]*/, Array("objectid" => 23456, "sendername" => "Auslösername"));

Von den Skript kannst Du so viele Variationen anlegen wie Du willst, Du musst nur jeweils den Wert der Objectid ändern, das ist dann der Wert, der abgerufen wird und in die Liste eingetragen, sowie den Auslösernamen anpassen. Das Ereignis liegt dann nicht mehr auf dem Listenskript sondern jeweils auf dem Skript das die Daten übergibt.

Wenn Du das Ganze ausbauen willst kannst Du auch noch zusätzliche Parameter übergeben, wenn Du die unterschiedlichen Einträge z.B. in unterschiedlichen Farben unter Schriften darstellen willst.

Super Fonzo, vielen Dank!!! Ich werde es ausprobieren, sobald Familie und Gäste es zulassen.

Das mit den unterschiedlichen Farben für jede auszulesende Variable wäre natürlich die Krönung. Welche Parameter müsste ich hier anpassen und übergeben?

Auswendig weis ich das auch nicht, auf alle Fälle müsstest Du einen zusätzlichen Parameter style übergeben und dann die Tabelle noch anpassen siehe z.B. HTML Styles