Hallo Zusammen,
ich möchte meine neue Klimaanlage von Samsung mit in das IP-Symcon integrieren. Die Geräte kommunizieren über eine RS 485 und sind sehr geschwätzig. Das Protokoll ist recht einfach aufgebaut. Jedes Telegramm hat eine Länge von14 Zeichen und beginnt stets mit eine 0x32.
Nun habe ich eine I/O Instanz Serial Port angelegt und mit eine Register variable Verknüpft. In der Doku gibt es zum bereits ein Beispielscript, welches die Daten bei eine fixen länge ausliest. Dies habe ich auf die Länge 14 korrigiert und mit der Register variable Verknüpft.
<?
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($_IPS['SENDER'] == "RegisterVariable")
{
// bereits im Puffer der Instanz vorhandene Daten in $data kopieren
$data = RegVar_GetBuffer($_IPS['INSTANCE']);
// neu empfangene Daten an $data anhängen
$data .= $_IPS['VALUE'];
// wenn $data mindestens 14 Zeichen lang ist
if (strlen($data) >= 14)
{
// $data in Blöcke von bis zu 14 Zeichen zerlegen
$datasets = str_split($data, 14);
// $data leeren
$data = "";
// alle Datensätze durcharbeiten
for ($i = 0; $i < count($datasets); $i++)
{
// vollständige Datensätze (genau 16 Zeichen lang) ausgeben
if (strlen($datasets[$i]) == 14)
{
//echo "!!!!!".bin2hex($datasets[$i])."
";
SetValueString (22616 /*[var\Klimaanlage\Dataset]*/ ,bin2hex($datasets[$i]));
}
else
{
// Unvollständige Datensätze in $data schreiben
$data = $datasets[$i];
}
}
}
// Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
RegVar_SetBuffer($_IPS['INSTANCE'], $data);
}
?>
Wenn man den Dienst IP-Symcon startet funktioniert das auch sehr gut. Die Ergebnis ist dann wie folgt:
Leider verschieben sich dann irgendwann die Zeichen und ich kann dann nichts mehr damit anfangen.
Die debug Ausgabe von der seriellen Schnittstelle sieht dann immer noch gut aus:
Die Daten aus dem Script sehen dann so aus:
Die Ausrufungszeichen sind von mir zum einfacheren filtern in den Meldungen vorangestellt.
Kennt jemand eine Lösung um hier die synchronität zu erhalten?
Danke und Gruß,
Dietmar