KNX Uhrzeit und Datum richtig darstellen

Moin,
ich habe ein Problem mit der Darstellung von Uhrzeit und Datum, die ich vom KNX an IPS sende.
Importiert werden Uhrzeit und Datum als EIS4 und EIS5 (beides als String).
Wie kann ich nun aus den Werten 3215100 bzw. 20200401 wieder ein Mi. 21:51 01.04.2020 machen?
(Alternativ würde es mir auch ausreichen die Werte korrekt in IPSStudio darzustellen.)

Vielen Dank für eure Hilfe und bleibt gesund!

Hast du dir die EIB Group Instanzen angesehen? Die können eigentlich EIS4 und EIS5 dekodieren.

paresy

Bitte entschuldige meine Unwissenheit.
Wo finde ich diese Instanz?
Habe auch in der Online Hilfe nichts dazu gefunden.

Einfach Instanz erstellen drücken und nach EIB Group suchen.

paresy

Hmm, woher nehmen, wenn nicht stehlen, oder was mache ich falsch?

KNX/EIB Device ist es. Sorry :slight_smile: Ich glaube intern heißt das Modul EIB Group.

peresy

Hallo,
ich hoffe ich konnte folgen:
Dort steht aber das Datum YYYYMMDD. Wie kann ich denn nun daraus DD.MM.YYYY machen?
Funktioniert das, wenn wie, mit einem Script?


Hallo guwen,

Ich habe auch KNX, aber verwende für Symcon das Skript von brownson.

Sieht nach Ausführung des Skriptes so aus:

<?
	/**
	 * @file          IPSView_CurrentDateTimeStrings.ips.php
	 * @author        brownson
	 * @version
	 *   Version 1.0, 2014-09-14 brownson: Initiale Version
	 *
	 * Skript um String Variablen mit aktuellem Datum und aktueller Uhrzeit anzulegen
	 * und periodisch zu aktualisieren.
	 *
	 * Konfiguration Einstellungen:
	 *   keine
	 *
	 */
 
	$scriptID = $_IPS['SELF'];
	$parentID = IPS_GetParent($scriptID);
 
	$variableIDDateLong  = CreateVariable('DateLong',  3, $parentID, 0, '~String', null);
	$variableIDDateShort = CreateVariable('DateShort', 3, $parentID, 0, '~String', null);
	$variableIDTime      = CreateVariable('Time',      3, $parentID, 0, '~String', null);
 
	SetValue($variableIDTime,      CorrectNames(date('H:i')));
	SetValue($variableIDDateShort, CorrectNames(date('Y-m-d')));
	SetValue($variableIDDateLong,  CorrectNames(date('l, d. F Y')));
 
   CreateTimer_CyclicBySeconds ('RefreshTimer', $scriptID, 60);
 
 	function CreateTimer_CyclicBySeconds ($name, $parentId, $seconds) {
		$timerId = @IPS_GetObjectIDByIdent($name, $parentId);
		if ($timerId === false) {
 			$timerId = IPS_CreateEvent(1 /*Cyclic Event*/);
			IPS_SetParent($timerId, $parentId);
			IPS_SetName($timerId, $name);
			IPS_SetIdent($timerId, $name);
			if (!IPS_SetEventCyclic($timerId, 2 /*Daily*/, 1 /*Int*/,0 /*Days*/,0/*DayInt*/,1/*TimeType Sec*/,$seconds/*Sec*/)) {
				die ("IPS_SetEventCyclic failed !!!");
			}
			IPS_SetEventActive($timerId, true);
			echo 'Created Timer '.$name.'='.$timerId."".PHP_EOL;
		}
		return $timerId;
	}
 
	function CreateVariable ($name, $type, $parentId, $position=0, $profile="", $action=null) {
		$variableId = @IPS_GetObjectIDByIdent($name, $parentId);
		if ($variableId === false) {
 			$variableId = IPS_CreateVariable($type);
			IPS_SetParent($variableId, $parentId);
			IPS_SetName($variableId, $name);
			IPS_SetIdent($variableId, $name);
			IPS_SetPosition($variableId, $position);
  			IPS_SetVariableCustomProfile($variableId, $profile);
 			IPS_SetVariableCustomAction($variableId, $action);
		}
		return $variableId;
	}
	
	function CorrectNames($value) {
	   $result = $value;
		$result = str_replace('Monday',    'Montag',     $result);
		$result = str_replace('Tuesday',   'Dienstag',   $result);
		$result = str_replace('Wednesday', 'Mittwoch',   $result);
		$result = str_replace('Thursday',  'Donnerstag', $result);
		$result = str_replace('Friday',    'Freitag',    $result);
		$result = str_replace('Saturday',  'Samstag',    $result);
		$result = str_replace('Sunday',    'Sonntag',    $result);
 
		$result = str_replace('January',   'Jänner',     $result);
		$result = str_replace('February',  'Februar',    $result);
		$result = str_replace('March',     'März',       $result);
		$result = str_replace('April',     'April',      $result);
		$result = str_replace('May',       'Mai',        $result);
		$result = str_replace('June',      'Juni',       $result);
		$result = str_replace('July',      'Juli',       $result);
		$result = str_replace('August',    'August',     $result);
		$result = str_replace('September', 'September',  $result);
		$result = str_replace('October',   'Oktober',    $result);
		$result = str_replace('November',  'November',   $result);
		$result = str_replace('December',  'Dezember',   $result);
 
	   return $result;
	}
?>

Hallo nicolino,
danke Dir.
mit der Einbindung von Scripten kenne ich mich (noch) nicht so wirklich aus.
Aber das sieht doch so aus, als würde dieses Script nicht die Zeit vom KNX nehmen, sondern die eigene. Oder habe ich das falsch verstanden?
Hintergrund: Ich möchte natürlich überall die gleiche Zeit angezeigt haben. Und für den KNX habe ich eine DCF77 Uhr in Gebrauch. Daher möchte ich diese Zeit nehmen. Zudem ist diese Zeit auch auf allen KNX Sensoren.

Ja, das hast Du richtig erkannt. Das obige Skript erzeugt die Variablen aus dem Symcon System heraus.
Diese Uhrzeit und das Datum nutze ich für die Anzeige an den Webfronts, wenn überhaupt.

Alles was KNX betrifft, also zum Beispiel die Uhrzeit-Anzeige meiner KNX-Raumthermostate oder sonstiger KNX Geräte zeigt die Uhrzeit an, die über den Bus kommt. Dabei habe ich es so eingestellt, dass die Uhrzeit alle 15 Minuten einmal an die entsprechende Gruppenadresse geschickt wird. Ein häufigeres Senden habe ich nicht eingestellt, da das zum einen den Bus für mich unnötig belasten würde und zum anderen, die einzelnen Geräte die Uhrzeit ja nur einmalig brauchen, um dann selbst „weiterzuzählen“. Den 15-minütigen Rhythmus habe ich nur drin, falls ich irgendein Gerät mal neu parametrieren will und dann innerhalb der 15 Minuten wieder eine richtige Uhrzeit und ein Datum angezeigt haben möchte.

Ansonsten werden bei mir alle zeitlichen Funktionen, wie Automatismen und Logiken durch Symcon gesteuert. Logiken in KNX habe ich kaum welche und wenn, dann werden diese zyklisch und ausgelöst durch Symcon ausgeführt. Auf zeitbasierte Dinge habe ich bis auf die minutengenaue Anzeige der Uhrzeit in KNX komplett verzichtet. Ich habe es bisher noch nicht beobachten können, dass die angezeigte KNX-Uhrzeit, nicht mit der Symcon Uhrzeit und den zeitlichen Aktionen übereinstimmt. Das ist bei minutengenauer Anzeige bei mir wirklich zu vernachlässigen.

Alternativ und weil ich früher keinen Uhrzeitgeber in KNX hatte, habe ich die Symcon-Zeit und das Datum regelmässig in meinen KNX-Bus auf zwei getrennte Gruppenadressen übergeben. So hatte ich früher den umgekehrten Weg von Symcon in KNX. Wenn Dich das interessiert, kann ich Dir gerne zeigen, wie ich das bei mir gelöst habe.

Da bei mir aber erst später eine KNX Wetterstation mit Uhrzeit- und Datumsfunktion installiert wurde, habe ich dann auf die dort gemeldeten Daten umgestellt. Das hat den Vorteil, dass die Uhrzeit auch dann angezeigt würde, wenn Symcon mal nicht läuft.
Aber das ist bei mir wirklich sehr selten der Fall.

99,9% der KNX Geräte fragen die Uhrzeit nach dem Neustart vom Bus ab.

Natürlich hast Du recht, werde ich bei mir umstellen.
Danke für den Tipp.

Wenn beim einmaligen Abfrage beim Gerätestart etwas schief geht würde das Gerät „nie wieder“ eine korrekte Zeit bekommen, weil es bestenfalls einmal beim Start abfragt. Sich darauf zu verlassen ist eine unnötige Fehlerquelle.

Ich halte es für sinnvoller, die Uhrzeit zyklisch zu senden, so wie du es gemacht hast. Beispiel MDT, die Voreinstellung von 10min bedeutet minimale Busbelastung und im Zweifelsfall hat man nach 10 Minuten einen korrekten Wert in den Zeitnehmern.

Danke, so sehe ich das auch. Ich habe nun beides gemacht, sowohl die Anfrage beim Start, als auch das zyklische Senden in den Bus.

Du kannst dir ja mal die DPT Instanzen ansehen für 10.x und 11.x. Diese kodieren Datum und Uhrzeit so wie du es haben willst :slight_smile:

paresy

Danke Dir, Paresy.
Das macht mich fast glücklich. Das Datum funktioniert gut. Mit der Uhrzeit habe ich noch ein Problem. Der DPT010.x ist noch auf Winterzeit.
Und das verstehe ich nicht. Beides kommt von der gleichen GA. Der EIS3 macht (die korrekte) Sommerzeit. Der DPT010 macht Winterzeit?!?!



Das Telegramm sende ich auf jeden Fall zyklisch auf den Bus.
Ich habe da noch den Einen oder Anderen älteren Sensor im Einsatz (ich glaube u.a. der BJE 6128? und das Gira Infoterminal touch 2072??). Diese haben keinen Quarz eingebaut. Da läuft die Zeit nur über ein (minütliches) Telegramm. Aber wenn die beiden Telegramme pro Minute den Bus zum Platzen bringen läuft da doch was anderes falsch.

Ich habe auch nirgends behauptet, dass man die Uhrzeit nicht zyklisch senden sollte. Das sollte eigentlich selbstverständlich sein.

Das Thema Buslast kann diesbezüglich ignoriert werden - auch bei minütlicher Sendung der Uhrzeit.

Ich habe es soeben noch einmal mit der ETS gegengeprüft. Die Uhrzeit stimmt. Ich vermute also eher, dass dein DCF irgendwie etwas anders macht, als die ETS (und der Standard) es erwartet. Oder kommt die Zeit aus der DCF in der ETS bei dir korrekt an und nur in IP-Symcon nicht?

paresy

Ich kann das Problem hier reproduzieren: die Zeit laut DPT 10-Instanz hinkt um eine Stunde zurück gegenüber der EIB-Instanzt mit EIS3, wenn beide auf dieselbe (!) GA hören. Die KNX-Zeit wird also auch innerhalb von IPS nicht konsistent behandelt, beim identischen KNX Telegramm.

Der ETS Gruppenmonitor zeigt ebenso wie die EIB-Instanz die korrekte Uhrzeit (Sommerzeit).

Im KNX-Standard kann ich keine Hinweise erkennen, daß Sommerzeit separat im DPT10 codiert wäre, daher wird IPS es hier wohl intern unterschiedlich umrechnen.