LCN GT10D und andere Displaytaster dynamische Texte setzen

Ich habe heute nach einer Funktion gesucht, um die „dynamischen Texte“ bei LCN GT-Displaytastern setzen zu können. Da ich keine finden konnte, habe ich selbst eine geschrieben.

Genauer gesagt sind es mittlerweile zwei Funktionen. Eine, die den „korrekten“ Weg über den Befehl LCN_SendCommand und die Modulinstanz geht (SetGTTextLineI) und eine, bei der man direkt und dreckig über den CSCK_SendText der Client Socket geht (SetGTTextLineS).

Warum gibt es zwei unterschiedliche?

Eigentlich sollte man vorsichtshalber die „saubere“ Version einsetzen, da diese Probleme mit dem Befehlslimit der PCHK umgeht.

Allerdings ist die „dirty“ Version leider vom Effekt her schöner. Sendet man die Daten direkt über die Socket, erscheint der Text mehr „am Stück“, ansonsten setzt er sich leider etwas sehr stückelig zusammen.

Muss man überlegen, was einem wichtiger ist.

$socket = die ID der Client Socket für LCN
$seg = das Segment in dem das Modul hängt
$mod = die ID-Nummer des Moduls im Bus
$line = die Zeile (1…4)
$text = ein bis zu 58 Zeichen langer Text

function SetGTTextLineI($instance, $line, $text)
{
	$text = utf8_encode(substr($text, 0, 58));

	for($part = 0; $part < ceil(strlen($text) / 12); $part++)
	{
	   if(!@LCN_SendCommand($instance, 'GT',
			'DT' .
			$line .
			($part + 1) .
			substr($text, $part * 12, 12) .
			"
")) return;
	}
}

function SetGTTextLineS($socket, $seg, $mod, $line, $text)
{
	$text = utf8_encode(substr($text, 0, 58));

	$data = '';

	for($part = 0; $part < ceil(strlen($text) / 12); $part++)
	{
	   $data .=
			'>M' .
			str_pad($seg, 3, '0', STR_PAD_LEFT) .
			str_pad($mod, 3, '0', STR_PAD_LEFT) .
			'.' .
			'GTDT' .
			$line .
			($part + 1) .
			substr($text, $part * 12, 12) .
			"
";
	}

	CSCK_SendText($socket, $data);
}

Moin Moin Socke,

Das würde also bedeuten ich könnte auf meinem GT6D und GT4D Modul eine Art Laufschrift anzeigen lassen und es z.B. als Börsenticker nutzen - so in der Art
„Dax 7000 -1% , NASDAQ 2000 -1% und das Fenster ist offen“
Oder wie kann ich mir das vorstellen?

Schaut euch bitte mal folgende Funktion an:
LCN_SendCommand: IP-Symcon :: Automatisierungssoftware

Die CSCK_* Methode unterwandert die Synchronisation/Limitierungen der PCHK/IP-Symcon und kann, gerade bei diesem High-Traffic-Beispiel, zu sehr unerwünschten Nebenwirkungen führen.

Außerdem wird diese Möglichkeit in späteren Versionen von IP-Symcon aus genau diesem Grund unterbunden werden, wodurch eine rechtzeitige Anpassung von Vorteil ist :slight_smile:

paresy

Ja, genau so. Die Begrenzung liegt bei 58 Zeichen pro Zeile (an meinem GT10D getestet, ich habe keinen anderen). Wenn der Text zu lang ist um auf einmal in die Zeile zu passen, läuft er als Laufschrift durch, das macht der Taster aber „von Haus aus“.

Ob es mit älteren Firmwares etc. schon gut funktioniert weiß ich allerdings nicht, mein Taster ist neu. Da können evtl. die Bus-Profis weitere Infos geben.

@Paresy: Werde ich nachher mal umstricken, sorry. :o

Code aktualisiert.

Hi,
Ich habe folgenden Code eingetippt:

<?
function SetGTTextLineS($socket = ‚48506‘, $seg = ‚0‘, $mod = ‚160‘, $line = ‚2‘, $text = ’ Hallo Welt !! ')
{
$text = utf8_encode(substr($text, 0, 58));

$data = '';

for($part = 0; $part &lt; ceil(strlen($text) / 12); $part++)
{
   $data .=
        '&gt;M' .
        str_pad($seg, 3, '0', STR_PAD_LEFT) .
        str_pad($mod, 3, '0', STR_PAD_LEFT) .
        '.' .
        'GTDT' .
        $line .
        ($part + 1) .
        substr($text, $part * 12, 12) .
        "

";
}

CSCK_SendText($socket, $data);

}
?>

…und es geht natürlich nichts.
Das GT4D hängt an einem UPP Modul mit der ID 160.
Ich denke ich mache einiges falsch…kannst Du mir bitte helfen?

Gruß
Michael

Morgen Michael,

du mußt die Funktionen so aufrufen

SetGTTextLineI(30905, 4, "Hallo Welt");
SetGTTextLineS(16619, 0, 88, 4, "test");

30905 ist der SLCN-Splitter
16619 ist der Client-Socket

und im GT die Zeile auf dyn.Test stellen.
dann funktioniert es auch.

Das heisst, dass ich die eigentliche Function so wie sie oben von SokkederHeld angegeben wurde an den Anfang des PHP Scripts kopiere, und dann unten im Script die Function mit der Werteübergabe an die Variablen aufrufen kann?

Ist das so richtig?

Muss Ich dafür dem GT4D eine eigene ID zuweisen?
Ich habe in LCN-PRO gesehn, dass das jetzt wohl möglich ist - macht das Sinn?

Die Funktionsdefinition (der Code von mir) kann irgendwo im Skript stehen; üblicherweise befinden sich Funktionsdefinitionen eher am Ende des Skripts. Macht aber technisch keinen Unterschied. Solange sie irgendwo im Skript stehen, kannst du anderswo im Skript die Funktion aufrufen.

Ich verstehe nicht ganz was du meinst. Der GT wird ja an einem Busmodul hängen, und dieses Modul hat eine ID. Ich wüsste nicht wie man anders als über das Modul auf dessen Peripherie zugreifen sollte - oder warum?

Mach den Funktionsaufruf mal so wie von Karlheinz beschrieben.

Wichtig ist natürlich, wie Karlheinz auch schon schreibt, dass die entsprechende Zeile des GT in der LCN-PRO auf „dynamischer Text“ gesetzt wird.

Soweit alles klar. Werde ich nachher testen.
Entschuldigt meine Fragen aber die Beispiele im Netz sind einfach zu kompliziert gehalten.

Anbei schonmal ein Bild zu der Frage nach der eigenen Modul ID.
Keine Ahnung was der große Vorteil wäre. Ich fände es übersichtlicher und das Modul wäre im direkten Zugriff.

In dem Dialog bedeutet „eigenes Modul“ dass der angezeigte Temperaturwert der des eigenen Moduls ist. Du kannst ja z.B. auf dem Modul im Keller auch die Temperatur im Dachgeschoss anzeigen wenn du willst. Das hat aber mit einer Zuweisung einer eigenen ID nichts zu tun.

Was du aber tun musst, um dynamische Texte nutzen zu können, ist die entsprechende Zeile in genau dem gezeigten Dialog auf „Dynamischer Text“ zu stellen. Sie erscheint dann zunächst leer, bis du irgendwas (z.B. aus IPS heraus) gesetzt hast.

Du kannst in dem Dialog dann auch eine Zeitdauer wählen, wie lange der Text angezeigt werden soll (0=ewig).

Viel Erfolg damit!

Hallo,
ich hol den alten Thread noch mal hoch. Bei Anwendung dieses Scriptes (bei beiden Versionen) habe ich ein Problem, welches ich bisher nicht lösen konnte.

Nutzung:
Ich möchte mir abwechselnd in den Displays meines GT10D und GT4D vier Raumtemperaturen anzeigen lassen.

Variante 1
Ich habe 4 Skripte geschrieben die sich in IPS über „getvalue“ die Temperatur für einen bestimmten Raum holen und im Display anzeigen.
Die Skripte lasse ich abwechselnd alle 20 Sek. starten, so dass alle 5. Sek. im Display die Temperatur wechselt. Das ganze funktioniert auch soweit, jedoch kommt es in regelmäßigen Abständen vor (alle 1- 3 Tage), dass sich das ganze Display oder die entsprechende Zeile aufhängt.

Variante 2
Ich nutze nur ein Skript und wechsele die 4 Temperaturen in dem ich das Skript immer durch den sleep Befehl für 5 Sek. unterbreche und im Anschluss eine neue Temperatur anzeigen lasse. Skript wird alle 23 Sek. ausgeführt. Funktioniert auch gut, aber mit gleichem Einfrierproblem.

Hat jemand schon mal ähnliche Erfahrungen gemacht? Ich werde heute Abend noch die genauen Codes einstellen. Kenne mich im Skripten auch nicht so gut aus. Vielen Dank für eure Unterstützung im Voraus.

Gruß Martin

Variante 1


<?
function SetGTTextLineI($instance, $line, $text)
{
    $text = utf8_encode(substr($text, 0, 58));

    for($part = 0; $part < ceil(strlen($text) / 12); $part++)
    {
       if(!@LCN_SendCommand($instance, 'GT',
            'DT' .
            $line .
            ($part + 1) .
            substr($text, $part * 12, 12) .
            "
")) return;
    }
}
$temperaturAu = getvalue (39962 /*[Statusanzeigen\Temperatur Außen\Temperatur Außen]*/);
$temperatur = "Außen ";
$temperatur .= $temperaturAu;
$temperatur .= "°C";
SetGTTextLineI(16902 /*[UPP (000,140)]*/, 2, $temperatur);
SetGTTextLineI(57194 /*[UPP (000,150)]*/, 2, $temperatur);
?>

Variante 2

<?
function SetGTTextLineI($instance, $line, $text)
{
    $text = utf8_encode(substr($text, 0, 58));

    for($part = 0; $part < ceil(strlen($text) / 12); $part++)
    {
       if(!@LCN_SendCommand($instance, 'GT',
            'DT' .
            $line .
            ($part + 1) .
            substr($text, $part * 12, 12) .
            "
")) return;
    }
}
$temp1w = getvalue (49462 /*[Wohnzimmer\Temperatur\Temperatur Wohnen]*/);
$temp1 = "Wohnen ";
$temp1 .= $temp1w;
$temp1 .= "°C";
$temp2k = getvalue (34827 /*[Küche\Temperatur\Temperatur Küche]*/);
$temp2 = "Küche ";
$temp2 .= $temp2k;
$temp2 .= "°C";
$temp3b = getvalue (58008 /*[Statusanzeigen\Temperatur Bad\Temperatur Bad]*/);
$temp3 = "Bad ";
$temp3 .= $temp3b;
$temp3 .= "°C";
$temp4a = getvalue (39962 /*[Statusanzeigen\Temperatur Außen\Temperatur Außen]*/);
$temp4 = "Außen ";
$temp4 .= $temp4a;
$temp4 .= "°C";

SetGTTextLineI(16902 /*[UPP (000,140)]*/, 2, $temp1);
SetGTTextLineI(57194 /*[UPP (000,150)]*/, 2, $temp1);
sleep(5);
SetGTTextLineI(16902 /*[UPP (000,140)]*/, 2, $temp2);
SetGTTextLineI(57194 /*[UPP (000,150)]*/, 2, $temp2);
sleep(5);
SetGTTextLineI(16902 /*[UPP (000,140)]*/, 2, $temp3);
SetGTTextLineI(57194 /*[UPP (000,150)]*/, 2, $temp3);
sleep(5);
SetGTTextLineI(16902 /*[UPP (000,140)]*/, 2, $temp4);
SetGTTextLineI(57194 /*[UPP (000,150)]*/, 2, $temp4);
?>

Vorschläge zur Optimierung der Skripte (oder hier besser Kürzungen/Vereinfachungen) werden darüber hinaus gerne entgegen genommen.

Funktionieren bei euch die Sonderzeichen im Display?

Kommt hier alles per :
LCN_SendCommand($Modulid, „GT“, „DT“ … rein
.