Phidget RFID Reader

Hallo,

ich habe mich in der vergangenheit mal daran gemacht und einen Phidget RFID Reader eingebunden. Ich hänge das script mal an fals jemand das auch gebrauchen kann. Es ist nicht perfekt aber hinreichend.

Den Reader per HID device einbinden.

Das Skript einfach als Zielskript einer registerd variable anlegen und eimal zur installation ausführen.

<?
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

// Ein paar globale Variablen
$HID_ID = 56353 /*[HID für Phidget RFID Reader]*/  ;

$lock_time = 2;



// Installer
if ($IPS_SENDER == "Execute")
{

	// Das Skript richtig benennen
	IPS_SetHidden($IPS_SELF, true);
   IPS_SetName($IPS_SELF, "RFID Daten behandeln");

	$instanceID = CreateDummyInstanceByName(0, "Phidget RFID Reader");

   // und an die richtige Stelle verschieben
	$parentObject = IPS_GetObject($parentID);
   if ($parentObject['ObjectType'] !== 1)
   {
       IPS_SetParent($IPS_SELF, $instanceID);
   }

	// die Variablen anlegen
	SetValueBoolean(CreateVariableByName($parentID, "Antenne", 0), false);
	SetValueBoolean(CreateVariableByName($parentID, "LED", 0), false);
	SetValueBoolean(CreateVariableByName($parentID, "Out 0", 0), false);
	SetValueBoolean(CreateVariableByName($parentID, "Out 1", 0), false);

	$RFID_ID = CreateVariableByName($parentID, "RFID Code", 3);

	if (!IPS_GetScriptEventList($IPS_SELF))
	{
		$eid = IPS_CreateEvent(0);        //Ausgelöstes Ereignis
		IPS_SetEventTrigger($eid, 1, $RFID_ID); //Bei Änderung von RFID
		IPS_SetParent($eid, $IPS_SELF); //Ereignis zuordnen
		IPS_SetEventActive($eid, true);    //Ereignis aktivieren
	}


 	// alle 60 sekunden nach dem rechten schauen
	IPS_SetScriptTimer($IPS_SELF, 60);

	Antenne(true);
}

// Der Timer um die stabilität zu gewährleisten
if ($IPS_SENDER == "TimerEvent")
{
	$vendor_id = 1133;      // Vendor-ID des zu suchenden HID-Geräts
	$product_id = 50437 /*[Objekt #50437 existiert nicht]*/;    // Product-ID des zu suchenden HID-Geräts

	$interval = 5;          // Kontrollintervall in Minuten

	$instance = IPS_GetInstance($HID_ID);
	if ($instance['InstanceStatus'] >= 200)
	{
	    $found_device = false;

	    if (((int)HID_GetDeviceVendorID($HID_ID) != $vendor_id) && ((int)HID_GetDeviceProductID($HID_ID) != $product_id))
	    {
	        echo "looking for hid device... ";
	        $devices = HID_GetDevices($HID_ID);
	        foreach ($devices as $data)
	        {
	            if (((int)$data['VendorID'] == $vendor_id) && ((int)$data['ProductID'] == $product_id))
	            {
	                echo "found device... ";
	                $found_device = true;
	                HID_SetDeviceSerial($HID_ID, (String)$data['DeviceSerial']);
	                HID_SetDeviceVendorID($HID_ID, $vendor_id);
	                HID_SetDeviceProductID($HID_ID, $product_id);
	                IPS_ApplyChanges($HID_ID);
	                break;
	            }
	        }
	        if (!$found_device) echo "no device found! ";

	  			$Betreff = "Mit dem RFID READER ist ein Fehler aufgetreten";
				$EmpfaengerName = "";
				$EmpfaengerMailadresse = "";
				$Nachricht = "Mit dem RFID Reader ist ein Fehler aufgetreten der nicht automatisch behoben werden konnte.";

				SMTP_SendMailEx(35070 , $EmpfaengerMailadresse, $Betreff, $Nachricht);

	    }
	    else
	    {
	        $found_device = true;
	        echo "found device... ";
	    }

	    if ($found_device)
	    {
	        HID_SetOpen($HID_ID, true);
	        IPS_ApplyChanges($HID_ID);
	        echo "device opened... ";
	    }
	}
	Antenne(true);
}

// Wenn daten vom RFID reader kommen
if ($IPS_SENDER == "RegisterVariable")
{
	$daten = $IPS_VALUE;

	$RFID = str_pad(dechex(ord($daten[3])), 2 ,'0', STR_PAD_LEFT) .str_pad(dechex(ord($daten[4])), 2 ,'0', STR_PAD_LEFT) . str_pad(dechex(ord($daten[5])), 2 ,'0', STR_PAD_LEFT) . str_pad(dechex(ord($daten[6])), 2 ,'0', STR_PAD_LEFT) . str_pad(dechex(ord($daten[7])), 2 ,'0', STR_PAD_LEFT);

	if ((ord($IPS_VALUE[4]) == "00") AND (ord($IPS_VALUE[5]) == "00") AND (ord($IPS_VALUE[6]) == "00") AND (ord($IPS_VALUE[7]) == "00"))
	{
		// Wenn die hinteren vier bits 00 sind wurde der aktuelle Status im Bit 3 gesendet
		$lockID = CreateVariableByName($parentID, "lock", 0);
		$lock_Info = IPS_GetVariable($lockID);
		$lock_changed = $lock_Info["VariableChanged"];
		if (($lock_changed + $lock_time) < time())
		{
					SetValueBoolean($lockID, false);
		}

		if (!GetValueBoolean(CreateVariableByName($parentID, "lock", 0)))
		{
			$vid = CreateVariableByName($parentID, "RFID Code", 3);
			SetValueString($vid, "");

	/*
			$Statusbit = ord($IPS_VALUE[3]);
			if ($Statusbit >= 8)
			{
				SetValueBoolean(CreateVariableByName($parentID, "Antenne", 0), true);
				$Statusbit = $Statusbit - 8;
			}
			else
			{
				SetValueBoolean(CreateVariableByName($parentID, "Antenne", 0), false);
			}

			if ($Statusbit >= 4)
			{
				SetValueBoolean(CreateVariableByName($parentID, "LED", 0), true);
				$Statusbit = $Statusbit - 4;
			}
			else
			{
				SetValueBoolean(CreateVariableByName($parentID, "LED", 0), false);
			}

			if ($Statusbit >= 2)
			{
				SetValueBoolean(CreateVariableByName($parentID, "Out 0", 0), true);
				$Statusbit = $Statusbit - 2;
			}
			else
			{
				SetValueBoolean(CreateVariableByName($parentID, "Out 0", 0), false);
			}

			if ($Statusbit >= 1)
			{
				SetValueBoolean(CreateVariableByName($parentID, "Out 1", 0), true);
				$Statusbit = $Statusbit - 1;
			}
			else
			{
				SetValueBoolean(CreateVariableByName($parentID, "Out 1", 0), false);
			}
	*/
		}
	}
	else
	{
	 	// bei allem anderen handelt es sich um einen RFID Code

		$vid = CreateVariableByName($parentID, "RFID Code", 3);
		// prüfen ob es die widerholungsmeldung ist oder ob was neues glesen wurde
		if ((GetValueString($vid) != $RFID) AND (!GetValueBoolean(CreateVariableByName($parentID, "lock", 0))))
		{
			SetValueBoolean(CreateVariableByName($parentID, "lock", 0), true);
			SetValueString($vid, $RFID);
			IPS_LogMessage("Neue RFID Code gelesen: ", $RFID);
		}

	}
}

// Bei einer RFID Änderung
if ($IPS_SENDER == "Variable")
{
$RFID = GetValueString(CreateVariableByName($parentID, "RFID Code", 3));
	if ($RFID != "")
	{

	}
}

function error_blink()
{
global $lock_time;
	LED(true);
	IPS_Sleep($lock_time * 100);
	LED(false);
	IPS_Sleep($lock_time * 100);
	LED(true);
	IPS_Sleep($lock_time * 100);
	LED(false);
	IPS_Sleep($lock_time * 100);
	LED(true);
	IPS_Sleep($lock_time * 100);
	LED(false);
	IPS_Sleep($lock_time * 100);
	LED(true);
	IPS_Sleep($lock_time * 100);
	LED(false);
	IPS_Sleep($lock_time * 100);
	LED(true);
	IPS_Sleep($lock_time * 100);
	LED(false);
	IPS_Sleep($lock_time * 100);
	LED(true);
	IPS_Sleep($lock_time * 100);
	LED(false);
	IPS_Sleep($lock_time * 100);
	LED(true);
	IPS_Sleep($lock_time * 100);
	LED(false);
	IPS_Sleep($lock_time * 100);
	LED(true);
	IPS_Sleep($lock_time * 100);
	LED(false);
	IPS_Sleep($lock_time * 100);
	LED(true);
	IPS_Sleep($lock_time * 100);
	LED(false);
	IPS_Sleep($lock_time * 100);
	LED(true);
	IPS_Sleep($lock_time * 100);
	LED(false);
}

function ok_blink()
{
global $lock_time;
	LED(true);
	IPS_Sleep($lock_time * 1000);
	LED(false);
}






// die HID Funktionen aus dem RE
// mit HID sniffer geloggt:
// Antenne aus 	00 00 00 00	=>	00000000
// Antenne an		08 00 00 00	=>	00001000
// Led An			0C 00 00 00	=>	00001100
// Led Aus			08 00 00 00	=>	00001001
// Out 0 An			09 00 00 00	=>
// Out 0 Aus		08 00 00 00	=>
// Out 1 An			0A 00 00 00	=>	00001010
// Out 1 Aus		08 00 00 00	=>
// 					    					 ^^^^
// 										    ||||
// Antenne Bit-----------------------+|||
// LED Bit----------------------------+||
// Out 0 Bit---------------------------+|
// Out 1 Bit----------------------------+


function Output_0($AnAus)
{
	global $parentID;
	global $HID_ID;

	SetValueBoolean(CreateVariableByName($parentID, "Out 0", 0), $AnAus);

	$Status_Antenne = GetValueBoolean(CreateVariableByName($parentID, "Antenne", 0));
	$Status_LED = GetValueBoolean(CreateVariableByName($parentID, "LED", 0));
	$Status_Out_0 = GetValueBoolean(CreateVariableByName($parentID, "Out 0", 0));
	$Status_Out_1 = GetValueBoolean(CreateVariableByName($parentID, "Out 1", 0));

	$Statusbit = ($Status_Out_1 * 1) + ($Status_Out_0 * 2) + ($Status_LED * 4) + ($Status_Antenne * 8);

	return HID_SendEvent($HID_ID, 0, chr($Statusbit) . chr(0x00) . chr(0x00) . chr(0x00));
}

function Output_1($AnAus)
{
	global $parentID;
	global $HID_ID;

	SetValueBoolean(CreateVariableByName($parentID, "Out 1", 0), $AnAus);

	$Status_Antenne = GetValueBoolean(CreateVariableByName($parentID, "Antenne", 0));
	$Status_LED = GetValueBoolean(CreateVariableByName($parentID, "LED", 0));
	$Status_Out_0 = GetValueBoolean(CreateVariableByName($parentID, "Out 0", 0));
	$Status_Out_1 = GetValueBoolean(CreateVariableByName($parentID, "Out 1", 0));

	$Statusbit = ($Status_Out_1 * 1) + ($Status_Out_0 * 2) + ($Status_LED * 4) + ($Status_Antenne * 8);

	return HID_SendEvent($HID_ID, 0, chr($Statusbit) . chr(0x00) . chr(0x00) . chr(0x00));
}

function Antenne($AnAus)
{
	global $parentID;
	global $HID_ID;

	SetValueBoolean(CreateVariableByName($parentID, "Antenne", 0), $AnAus);

	$Status_Antenne = GetValueBoolean(CreateVariableByName($parentID, "Antenne", 0));
	$Status_LED = GetValueBoolean(CreateVariableByName($parentID, "LED", 0));
	$Status_Out_0 = GetValueBoolean(CreateVariableByName($parentID, "Out 0", 0));
	$Status_Out_1 = GetValueBoolean(CreateVariableByName($parentID, "Out 1", 0));

	$Statusbit = ($Status_Out_1 * 1) + ($Status_Out_0 * 2) + ($Status_LED * 4) + ($Status_Antenne * 8);

	return HID_SendEvent($HID_ID, 0, chr($Statusbit) . chr(0x00) . chr(0x00) . chr(0x00));
}

function LED($AnAus)
{
	global $parentID;
	global $HID_ID;

	SetValueBoolean(CreateVariableByName($parentID, "LED", 0), $AnAus);

	$Status_Antenne = GetValueBoolean(CreateVariableByName($parentID, "Antenne", 0));
	$Status_LED = GetValueBoolean(CreateVariableByName($parentID, "LED", 0));
	$Status_Out_0 = GetValueBoolean(CreateVariableByName($parentID, "Out 0", 0));
	$Status_Out_1 = GetValueBoolean(CreateVariableByName($parentID, "Out 1", 0));

	$Statusbit = ($Status_Out_1 * 1) + ($Status_Out_0 * 2) + ($Status_LED * 4) + ($Status_Antenne * 8);

	return HID_SendEvent($HID_ID, 0, chr($Statusbit) . chr(0x00) . chr(0x00) . chr(0x00));
}

//Ein paar Hilfsfunktionen, angelehnt oder kopiert aus dem IPS Forum
function CreateDummyInstanceByName($id, $name)
{
    global $IPS_SELF;
    $vid = @ IPS_GetInstanceIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this instance was created by script #$IPS_SELF");
    }
    return $vid;
}

function CreateVariableByName($id, $name, $type)
{
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
    }
    return $vid;
}

?>