Hi,
also hier mal, wie versprochen, eine kleine Zusammenfasssung wie ich den rfxtrx433 in IPS integriert habe.
Vorab muss ich schonmal sagen das ich den rfxtrx433 per FritzBox Fernanschluss betreibe, aber lokal am IPS-Server sieht das ja fast gleich aus.
- Gerät anschliessen per USB
- SeriellPort unter I/O Instanzen anlegen
3a. Script zum Senden der Befehle an die Aktoren schreiben. Die Infomationen lassen sich am besten aus dem dazugehörigen rfxmanager extrahieren.
Für einen meiner Homeeasy-Aktoren sieht das dann folgendermaße aus (Schalter im Webfront):
<?
if($_IPS['SENDER'] == "WebFront")
{
if($_IPS['VALUE'])
{
$str=chr(0x0B).chr(0x11).chr(0x01).chr(0x02).chr(0x03).chr(0xFF).chr(0xFF).chr(0xFF).chr(0x01).chr(0x01).chr(0x00).chr(0x00);
}
else
{
$str=chr(0x0B).chr(0x11).chr(0x01).chr(0x02).chr(0x03).chr(0xFF).chr(0xFF).chr(0xFF).chr(0x01).chr(0x00).chr(0x00).chr(0x00);
}
COMPort_SendText(15683 /*[rfxtrx]*/,$str);
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
}
?>
Um an die Hexwerte zu kommen muss man den Hersteller nach dem SDK fragen, dort ist alles aufgeführt.
Um werte abzufragen bediene ich mich derzeit einer Bastellösung. Ich kann diese gerne hier einstellen, möchte aber direkt darauf hinweisen das das Script durch copy&paste aus anderen Forums- und Interneteinträgen entstanden ist. Das ganze lässt sich wahrscheinlich deutlich besser schreiben, aber für mich funktionierts:
3b. Cutter anlegen mit dem serialport als übergelagerte Instanz
4. RegisterVariable mit dem Cutter als übergelagerte Instanz anlegen
- Script zur RegisterVariable anlegen:
<?
if ($_IPS['SENDER'] == "RegisterVariable")
{
// bereits im Puffer der Instanz vorhandene Daten nach $data kopieren
$data = RegVar_GetBuffer($_IPS['INSTANCE']);
// neu empfangene Daten an $data anhängen
$data .= $_IPS['VALUE'];
// Umwandlung von bin in hex
$wertinhex = bin2hex($data);
// Hex-Zeichen für die Länge extrahieren
$laenge = substr(bin2hex($data),0,2);
//erhaltene Länge in Dezimal umwandeln
$decwert = hexdec($laenge);
// und nun in Integer
$decwert2 = intval($decwert);
//+1 addieren um die gesamte Message zu bekommen
$decwert3 = ($decwert2 + 1);
// wenn $data mindestens so lang ist wie gewuenscht
if (strlen($data) >= $decwert3)
{
// $data in Blöcke von bis zu x Zeichen zerlegen
$datasets = str_split($data, $decwert3);
// $data leeren
$data = "";
// alle Datensätze durcharbeiten
for ($i = 0; $i < count($datasets); $i++)
{
// vollständige Datensätze (genau so lange wie gewuenscht) ausgeben
if (strlen($datasets[$i]) == $decwert3)
{
// Message ausgeben
//echo "empfangener Datensatz: ".bin2hex($datasets[$i])."
";
// Message in Variable zur weiteren Verarbeitung speichern
$message = bin2hex($datasets[$i]);
// Message in Array aufteilen
$arr = str_split($message, 2);
// Laenge des Arrays bestimmen
//$arr_laenge = count($arr);
// gesamtes Array ausgeben, unabhaengig von der Laenge
//foreach ($arr as $werte) echo $werte."
";
//letzte Element des Arrays ausgeben
//echo end($arr);
if ($arr[1] == "52" and $arr[4] == "c3")
{
//Umrechnung in Dezimal
$humidity = hexdec($arr[8]);
//Variable setzen
SetValueInteger(56646 /*[Test\Humidity]*/, $humidity);
//Temperatur in Integer / Dezimal
$test = hexdec($arr[7]);
// Umwandlung in Float
$temperatur = ($test/10);
SetValueFloat(29042 /*[Test\TH1_Temperatur]*/, $temperatur);
}
//neuer Sensor
/*if ($arr[1] == "50" and $arr[2] == "05")
{
$temp = hexdec($arr[7]);
$temperatur_lacrosse =($temp/10);
SetValueFloat(48191 /*[Test\Temperatur_LaCrosse_WZ]*/, $temperatur_lacrosse);
}
*/
if ($arr[1] == "50" and $arr[2] == "06")
{
$temp1 = hexdec($arr[7]);
$temperatur_tcm =($temp1/10);
SetValueFloat(40377 /*[Test\Temperatur_TCM]*/, $temperatur_tcm);
}
}
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);
}
?>
So kann ich einige Temperatursensoren (meist im Resteverkauf eines Baumarktes erstanden) abfragen!
Hoffe das das einigermaßen verständlich ist, ansonsten bei Fragen einfach melden!
Gruß
spooniester