<?
/*
*******************************
IP-SYMCON Event Scripting
*******************************
File : HS485_Datenempfang.ips.php
Trigger : OnUpdate Hs485_Daten
Interval :
*/
$ComID = 33104; // Comport ID
define ("STARTZEICHEN1", "\xFD"); // Startzeichen 1
define ("STARTZEICHEN2", "\xFE"); // Startzeichen 2
define ("ESCAPE", "\xFC"); // ESCAPE-Zeichen
define ("MAXZEIT", 2); // maximale Wartezeit in Sekunden
$stopzeit = time() + MAXZEIT;
do
{
$datenstrom = GetValueString("HS485_Daten");
$startzeichengefunden = false;
$CRC16 = 1;
$daten = "";
$laenge = strlen($datenstrom);
for ($i=0; $i<$laenge and $CRC16!=0; $i++)
{
$chr = $datenstrom[$i]; // Zeichen einlesen
if (!$startzeichengefunden) // STARTZEICHEN schon gefunden?
{
if (($chr == STARTZEICHEN1) or ($chr == STARTZEICHEN2)) // nein, daher suchen nach STARTZEICHEN
{
$startzeichengefunden = true; // STARTZEICHEN gefunden
$daten = $chr;
}
continue; // STARTZEICHEN immer noch nicht gefunden
}
if ($chr == ESCAPE) // falls ESCAPE gefunden wurde
{
$i++; // ESCAPE verwerfen
$chr = chr(ord($datenstrom[$i]) + 0x80); // und nachfolgendes Zeichen korrigieren
}
$daten .= $chr; // ab hier Checksumme suchen
$CRC16 = GetCRC16($daten);
}
} while (($CRC16 != 0) and ($stopzeit > time()));
if ($CRC16 != 0)
return "ungültige Daten!"; // keine gültigen Daten innerhalb von MAXZEIT empfangen
else
SetValueString("HS485_Daten", ""); // Daten gültig, Puffer kann gelöscht werden
// Daten aus empfangenem String extrahieren, Zuweisung der einzelnen Bytes
$Startzeichen = String2Value($daten,0,1);
$KontrollByte = String2Value($daten,5,1);
$Moduladresse = String2Value($daten,6,4);
$Moduladresse1 = 6378; //HS485_127IO
$Moduladresse2 = 4248; //HS485 _S
$Moduladresse3 = 3250; //HS485_LX1
$Moduladresse4 = 4848; //HS485_TFS Keller
$Moduladresse5 = 4826; //HS485_TFS Wohnzimmer
$Framelaenge = String2Value($daten,10,1);
$Frame4 = 4;
$Frame5 = 5;
$Frame6 = 6;
$Datenframe1 = String2Value($daten,11,1);
$KeyEvent = 75;
$Datenframe2 = String2Value($daten,12,1);
$Datenframe3 = String2Value($daten,13,1);
$Datenframe4 = String2Value($daten,14,1);
$Datenframe5 = String2Value($daten,15,1);
$Datenframe6 = String2Value($daten,16,1);
$Datenframe7 = String2Value($daten,17,1);
$HS485_127IO_A1 = 12; // 127IO Relais 1
$HS485_127IO_A2 = 13; // 127IO Relais 2
$HS485_127IO_A3 = 14; // 127IO Relais 3
$HS485_127IO_A4 = 15; // 127IO Relais 4
$HS485_127IO_A5 = 16; // 127IO Relais 5
$HS485_127IO_A6 = 17; // 127IO Relais 6
$HS485_127IO_A7 = 18; // 127IO Relais 7
$HS485_S_A1 = 0; // S Relais 1
$HS485_S_A2 = 1; // S Relais 2
$Ein = 1; // Event Ein
$Aus = 0; // Event Aus
$Toggle = 255; // Event toggle
//$CRC = "\x00\x00";
// Rückmeldung Schaltzustand der Aktoren
$Schaltzustand = $Startzeichen.$Moduladresse.$Frame4.$Datenframe1.$Datenframe2;
if ($Schaltzustand == $Startzeichen.$Moduladresse2.$Frame4.$HS485_S_A1.$Aus)
{
SetValueBoolean("HS485S_Aktor1", false);
}
if ($Schaltzustand == $Startzeichen.$Moduladresse2.$Frame4.$HS485_S_A1.$Ein)
{
SetValueBoolean("HS485S_Aktor1", true);
}
if ($Schaltzustand == $Startzeichen.$Moduladresse2.$Frame4.$HS485_S_A2.$Aus)
{
SetValueBoolean("HS485S_Aktor2", false);
}
if ($Schaltzustand == $Startzeichen.$Moduladresse2.$Frame4.$HS485_S_A2.$Ein)
{
SetValueBoolean("HS485S_Aktor2", true);
}
// Rückmeldung des Schaltzustandes HS485_S nach Taster/Schalterbetätigung
$SchaltzustandModul = $Startzeichen.$Moduladresse.$Frame6.$Datenframe1.$Datenframe2;
if ($SchaltzustandModul == $Startzeichen.$Moduladresse2.$Frame6.$KeyEvent.$HS485_S_A1)
{
$S1 = "\xFD\x00\x00\x10\x98\x98\x00\x00\x00\x00\x04\x53\x00";
$ZHS485_S_A1 = $S1;
$CRC16 = GetCRC16 ($ZHS485_S_A1."\x00\x00"); // Checksumme berechnen
$CRC16str = chr($CRC16>>8). chr($CRC16&0xff); // Hi-Lo-Byte der Checksumme extrahieren
$S_A1 = $ZHS485_S_A1.$CRC16str; // Checksumme an Datenframe übergeben
COMPort_SendText($ComID, $S_A1); // Datenframe über Comport senden
}
if ($SchaltzustandModul == $Startzeichen.$Moduladresse2.$Frame6.$KeyEvent.$HS485_S_A2)
{
$S2 = "\xFD\x00\x00\x10\x98\x98\x00\x00\x00\x00\x04\x53\x01";
$ZHS485_S_A2 = $S2;
$CRC16 = GetCRC16 ($ZHS485_S_A2."\x00\x00"); // Checksumme berechnen
$CRC16str = chr($CRC16>>8). chr($CRC16&0xff); // Hi-Lo-Byte der Checksumme extrahieren
$S_A2 = $ZHS485_S_A2.$CRC16str; // Checksumme an Datenframe übergeben
COMPort_SendText($ComID, $S_A2); // Datenframe über Comport senden
}
// Auswertung Helligkeitssensor LX1. Bereich von 0-200000 Lux
$Helligkeit = 0;
$LX1 = $Startzeichen.$KontrollByte.$Moduladresse.$Framelaenge;
if($LX1 == $Startzeichen.$KontrollByte.$Moduladresse3.$Frame6)
{
$Helligkeit += $Datenframe1;
$Helligkeit <<= 8;
$Helligkeit += $Datenframe2;
$Helligkeit <<= 8;
$Helligkeit += $Datenframe3;
$Helligkeit <<= 8;
$Helligkeit += $Datenframe4;
SetValueInteger("HS485_Luxsensor", $Helligkeit);
}
// Auswertung Temperatur-Feuchtesensor JCU10_TFS. Bereich von 0-65°C und 0-100%
$Temp = 0;
$Feuchte = 0;
$TFS = $Startzeichen.$KontrollByte.$Moduladresse.$Framelaenge;
if($TFS == $Startzeichen.$KontrollByte.$Moduladresse4.$Frame5)
{
$Temp += $Datenframe1;
$Temp <<= 8;
$Temp |= $Datenframe2;
$Temp = (float)$Temp/10;
$Feuchte = $Datenframe3;
SetValueFloat("TFS_Temperatur", $Temp);
SetValueInteger("TFS_Feuchte", $Feuchte);
}
// Funktion zur Checksummenberechnung
function GetCRC16($s)
{
$CRCreg = 0xffff00;
for ($cp=0; $cp<strlen($s); $cp++)
{
$CRCreg |= ord($s[$cp]);
for ($bp=0; $bp<8; $bp++)
{
$CRCreg <<= 1;
if ($CRCreg & 0x1000000) $CRCreg ^= 0x100200; // hier ist das Polynom 0x1002 enthalten
$CRCreg &= 0xffffff;
}
}
return $CRCreg >> 8;
}
// Funktion zur Umwandlung eines Teil eines String in eine Zahl, Zählung beginnt bei Null
function String2Value($str, $p, $c) // String, Position, Anzahl Characters
{
$val = 0;
for ($i=0; $i<$c; $i++)
{
$val <<= 8;
$val += ord($str[$p+$i]);
}
return $val; // Rückgabe: Zahl
}
// Funktion zur Umwandlung eines String nach Hex
function Str2Hex($daten)
{
$Hex = "";
for($i=0; $i<strlen($daten); $i++)
$Hex .= sprintf("%02X ", ord($daten[$i]));
return $Hex; // String in hexadezimaler Schreibweise
}
$daten = Str2Hex($daten);
IPS_LogMessage($IPS_SELF,"HS485_Daten: ". $daten);
?>
Auslesen der Daten Helligkeitssensor sowie Temp/Feuchtemodul
// Rückmeldung des Schaltzustandes HS485_S nach Taster/Schalterbetätigung
korrigiert, Beschreibung nicht stimmig.
Danke Jens.