HID device automatisch connecten

Ich habe folgendes Problem:

Mein Oregon WMRS200 USB HID hängt an einem LAN USB Extender.
Beim boot meines USB Servers steht das HID oft erst nach IPS zur Verfügung. Dieses Problem könnte ich über einen konditionierten Start von IPS nach dem LAN/USB Hub Treibers lösen.

Allerdings steht (ich meine in zufälliger Reihenfolge) das HID Interface mit wechselnden Namen (Die aber bekannt sind) im System.

Beispiel:

Name 1: „?: Universal Bridge (2872)“
Name 2: „?: Universal Bridge (2836)“

Obwohl in meinen Instanzeigenschaften „HID Gerät öffnen“ angeklickt ist, wird natürlich nicht geöffnet, da der vormals bekannte HID Name jetzt ein anderer ist.

Kann mir jemand mit einem Skript helfen, welches ich bspw. jede Minute laufen lasse, dass nach den bekannten Namen sucht und falls diese nicht connected sind, diese connected.

Im Forum gab es hier mal ein ähnliches Skript, welches nach vendor ID und Product ID gesucht hat, habe versucht das anzupassen, funktioniert aber wegen der wechselnden Namen nicht, bzw. wegen meiner beschränkten programmierkenntnissen. :slight_smile:

Kann mir jemand helfen?

Gruss,

wupperi

Wenn Du http://www.ip-symcon.de/forum/f53/hid-verbindungsskript-7521/ meinst und nach der Serial suchen willst:

<?php
$hid_id = 12345;        // ID der HID-Instanz in IP-Symcon

$device_serial = 2048;  // Device-Serial des zu suchenden HID-Geräts

$interval = 5;          // Kontrollintervall in Minuten

if (!HID_GetOpen($hid_id))
{
    $found_device = false;

    if ((int)HID_GetDeviceSerial($hid_id) != $device_serial)
    {
        echo "looking for hid device... ";
        $devices = HID_GetDevices($hid_id);
        foreach($devices as $data)
        {
            if((int)$data['DeviceSerial'] == $device_serial)
            {
                echo "found device... ";
                $found_device = true;
                HID_SetDeviceSerial($hid_id, (String)$data['DeviceSerial']);
                HID_SetDeviceVendorID($hid_id, (int)$data['VendorID']);
                HID_SetDeviceProductID($hid_id, (int)$data['ProductID']);
                IPS_ApplyChanges($hid_id);
                break;
            }
        }
        if(!$found_device) echo "no device found! ";
    }
    else
    {
        $found_device = true;
        echo "found device... ";
    }

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

IPS_SetScriptTimer($IPS_SELF, $interval * 60);
?>

Hallo Horst,

das wars leider nicht ganz.
Mein Problem ist, dass die USB serial zwischen bekannten Werten nach dem booten wechselt!

Beispiel: Ich hatte die ganze Zeit 2872, jetzt nach dem letzten Boot dann die 2792.

Ich habe das Skript dann so modifiziert:


<?php
$hid_id = 35227 /*[Oregon Scientific WMRS200 HID]*/;        // ID der HID-Instanz in IP-Symcon

$device_serial = 2872;  // Device-Serial des zu suchenden HID-Geräts
$device_serial_alt = 2792; //Alternative Device ID
$interval = 1;          // Kontrollintervall in Minuten

if (!HID_GetOpen($hid_id))
{
    $found_device = false;

    if ((int)HID_GetDeviceSerial($hid_id) != $device_serial or (int)HID_GetDeviceSerial($hid_id) != $device_serial_alt)
    {
        echo "looking for hid device... ";
        $devices = HID_GetDevices($hid_id);
        foreach($devices as $data)
        {
            if((int)$data['DeviceSerial'] == $device_serial)
            {
                echo "found device... ";
                $found_device = true;
                HID_SetDeviceSerial($hid_id, (String)$data['DeviceSerial']);
                HID_SetDeviceVendorID($hid_id, (int)$data['VendorID']);
                HID_SetDeviceProductID($hid_id, (int)$data['ProductID']);
                IPS_ApplyChanges($hid_id);
                break;
            }

             if((int)$data['DeviceSerial'] == $device_serial_alt)
            {
                echo "found device... ";
                $found_device = true;
                HID_SetDeviceSerial($hid_id, (String)$data['DeviceSerial']);
                HID_SetDeviceVendorID($hid_id, (int)$data['VendorID']);
                HID_SetDeviceProductID($hid_id, (int)$data['ProductID']);
                IPS_ApplyChanges($hid_id);
                break;
            }
            
        }
        if(!$found_device) echo "no device found! ";
    }
    else
    {
        $found_device = true;
        echo "found device... ";
    }

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

IPS_SetScriptTimer($IPS_SELF, $interval * 60);
?>

Das läuft zwar ohne Fehler / Meldung durch, connected mir aber die Serial 2792 nicht.

Stimmt da was mit der if / or / then Anweisung nicht?

wupperi

Hallo Wupperi,

ich habe mir dieses Skript zusammengestrickt:

Vielleicht hilft Dir das.

<?

$fehlversuche = GetValueInteger(36229 /*[Wetter\WMRS200 (Innen) Temperatur- und Feuchtigkeitssensor\Fehlversuche]*/);

if ($IPS_SENDER == "TimerEvent")
	{
		SetValueBoolean(10286 /*[Wetter\WMRS200 (Innen) Temperatur- und Feuchtigkeitssensor\Empfang]*/,false);
  		IPS_LogMessage($IPS_SELF,"192.168.2.105: ".Sys_Ping("192.168.2.105", 1000));
	
		if (HID_GetOpen(41030 /*[HID]*/) == false)
		   {
		   // HID öffnen
		   HID_SetOpen(41030 /*[HID]*/,true);
		   IPS_ApplyChanges(41030 /*[HID]*/);
			}
			
      if (HID_GetOpen(41030 /*[HID]*/) == true)
			{
			$status = HID_GetDevices(41030 /*[HID]*/);
			print_r ($status);
			$serial = $status['0']["DeviceSerial"];
			echo $serial."
";
			HID_SetDeviceSerial(41030 /*[HID]*/,$serial);
			IPS_ApplyChanges(41030 /*[HID]*/);
			}
		
		if ($fehlversuche == 2 )
		   {
			SetValue(31054 /*[Überwachung\Meldung (aktuell)]*/,date("d. M.  H:i:s")."  ACHTUNG: keine Verbindung zur Wetterstation");
			IPS_LogMessage($IPS_SELF,"keine Verbindung zur Wetterstation");
			}
			
		if ($fehlversuche == 3)
			{
			//$result = IPS_Execute("Meinen Lan-Server neu starten.bat", " ", False,true);
			
			SetValue(31054 /*[Überwachung\Meldung (aktuell)]*/,date("d. M.  H:i:s")." Neustart Lan Server");
			}
			
		if ($fehlversuche > 3)
			{
			//$result = IPS_Execute("evtl Rechner neu starten", " ", False,False);
			
			SetValue(31054 /*[Überwachung\Meldung (aktuell)]*/,date("d. M.  H:i:s")." Neustart Rechner");
			}
		
   	SetValueInteger(36229 /*[Wetter\WMRS200 (Innen) Temperatur- und Feuchtigkeitssensor\Fehlversuche]*/,$fehlversuche + 1);
	}

if ($IPS_SENDER == "Variable")
{
	SetValueBoolean(10286 /*[Wetter\WMRS200 (Innen) Temperatur- und Feuchtigkeitssensor\Empfang]*/,true);
	IPS_SetScriptTimer($IPS_SELF,240);
	SetValueInteger(36229 /*[Wetter\WMRS200 (Innen) Temperatur- und Feuchtigkeitssensor\Fehlversuche]*/,0);
}

?>

Trigger onupdate auf eine Variable (z.B.Temperatur Innen) nicht vergessen

Vielen Dank für das Skript, aber so richtig komme ich nicht weiter.
Habe noch ein wenig rumprobiert. Das Skript von Horts funktioniert, wenn ich die serial im Dropdown in den Instanzeigenschaften zumindest auswähle (aber den port ungeöffnet lasse).

Das eigentlich Problem scheint zu sein, über ein Skript die richtige Serial in IPS einzustellen, das öffnen geht dann.

Hallo,

sorry, wenn ich hier den alten Thread nochmal aktualisiere, aber irgendwie finde ich nichts aktuelles zu dem Thema.
Ich habe kuerzlich von 3.4 auf 4.2 unter W7 aktualisiert.

Das beschriebene Problem mit den wechselnden IDs nach IPS Neustart hatte ich vorher auch schon, aber das script zum automatischen öffnen funktionierte, wenn ich die richtige ID für das USB Gerät hatte.

Das script funktioniert jetzt nicht mehr (ohne Fehlermeldung), in der doku finde ich nur noch boolean HID_SendEvent.

Gibt es jetzt eine alternative ? Gibt es die alten Befehle wie boolean HID_GetdeviceSerial noch ?

Wenn ich nach einem Neustart von IPS unter IO das HID Device manuell auswähle und öffne, funktioniert es einwandfrei.

VG

Frank

Die Funktionen gibt es immer noch, sofern du die Kompatibilitätsfunktionen aktiviert hast. (Unter Windows ist dies Standard)

paresy