# HID-Verbindungsskript

**URL:** <https://community.symcon.de/t/hid-verbindungsskript/19402>\
**Category:** Skripte, PHP, SQL (Anleitungen)\
**Created:** [12. Juni 2009 um 20:11 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402 "2009-06-12T20:11:16Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Horst](https://community.symcon.de/user_avatar/community.symcon.de/horst/32/195_2.png) [@Horst](https://community.symcon.de/u/Horst)\
**Post date:** [12. Juni 2009 um 20:11 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/1 "2009-06-12T20:11:16Z")

</div>

Folgendes Skript dient zur Suche eines HID-Gerätes mit gegebener Vendor- und Product-ID und anschließendem Verbinden. Das ist z.B. bei Benutzung von USB-LAN-Bridges oder anderen Gründen von USB-Neuverbindungen nützlich.

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

$vendor_id = 6789; // Vendor-ID des zu suchenden HID-Geräts
$product_id = 98765; // 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! ";
    }
    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);
?>

```

Vendor- und Product-ID aller am PC angeschlossenen HID-Devices lassen sich mit folgendem Skript auflisten:

```php
<?php
$hid_id = 12345;
print_r(HID_GetDevices($hid_id));
?>

```

---

<div class="post-metadata">

**Author:** ![RWN](https://community.symcon.de/user_avatar/community.symcon.de/rwn/32/125_2.png) [@RWN](https://community.symcon.de/u/RWN)\
**Post date:** [12. Juni 2009 um 21:06 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/2 "2009-06-12T21:06:50Z")

</div>

Habs in der Sammlung verewigt. 🙂

---

<div class="post-metadata">

**Author:** ![Helmut](https://community.symcon.de/user_avatar/community.symcon.de/helmut/32/54_2.png) [@Helmut](https://community.symcon.de/u/Helmut)\
**Post date:** [13. Juni 2009 um 02:37 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/3 "2009-06-13T02:37:47Z")

</div>

Ja, lieber Horst, probiere ich gerne aus,  
was ich gerne hätte, ist, dass ich ich in die Sendebuffer schreiben kann.

Beispiel, ich habe iM ein HID-Gerät (kann PWM, 433MHz-Baumarkt-Steckdosen, Ports,- analog und digital beschalten) gebastelt, welche mir 12 Sende und 12 Empfangsbuffer (je ein Daten-Byte) liefert.

Lesen ist kein Problem, aber wie schreibe ich in die 12 Sendebuffer?

Beispiel: Byte 2 und 3 ist für HAUSCODE und STECKDOSENCODE der Baumarktsteckdosen, Byte 4 und 5 ist für 2 PWM(0-10Volt), wie schreibe ich gezielt da hinein??

Gruß Helmut

---

<div class="post-metadata">

**Author:** ![BerndJ](https://community.symcon.de/user_avatar/community.symcon.de/berndj/32/177_2.png) [@BerndJ](https://community.symcon.de/u/BerndJ)\
**Post date:** [13. Juni 2009 um 15:03 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/4 "2009-06-13T15:03:07Z")

</div>

> [@Helmut](#):
>
> Lesen ist kein Problem, aber wie schreibe ich in die 12 Sendebuffer?

Hi Helmut,

hab zwar noch keine Erfahrungen mit HID, aber wie ist es mit dem:

```php
<?

HID_SendEvent(InstanceID, ReportID, SendEvent);

?>

```

Hab ihn über die registrierten IPS Funktionen

Im neuen Script entweder rechte Mautaste –\> Funktionsliste anzeigen

oder aber:

CTRL + SPACE drücken,

dann Anfangsbuchstaben zum vorselektieren

DA sind Sie ALLE die einem i.d.R. entfallen sind,

die Gefahr, sich zu vertippen umgeht man:

einfach beim selektierten ENTER reinhauen,

ist IPS nicht schön. 🙂

gefunden.

mfg

BerndJ

PS: Frag mich bitte nicht, was die ReportID ist, ich hab keine Ahnung und träume auch noch von der Möglichkeit in dieser Funktionsliste direkt eine entsprechende Hilfe „quasi per Tastendruck“, zu erhalten.

---

<div class="post-metadata">

**Author:** ![Helmut](https://community.symcon.de/user_avatar/community.symcon.de/helmut/32/54_2.png) [@Helmut](https://community.symcon.de/u/Helmut)\
**Post date:** [13. Juni 2009 um 16:34 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/5 "2009-06-13T16:34:27Z")

</div>

> [@BerndJ](#):
>
> Hi Helmut,…
> 
> HID\_SendEvent(InstanceID, ReportID, SendEvent);

Habe 12 HID IN/OUT- Buffer, wenn ich nun alle auf einmal beschreiben will, geht  
123 234 001 065 098… usw? Lesen geht ja.

Und woher bekomme ich die ReportID, sind das die HID-Buffer mit Nr. ?

Ein Beispiel wäre schön, für RS232 geht es, mit vielen Parametern.

Gruß Helmut

---

<div class="post-metadata">

**Author:** ![Horst](https://community.symcon.de/user_avatar/community.symcon.de/horst/32/195_2.png) [@Horst](https://community.symcon.de/u/Horst)\
**Post date:** [13. Juni 2009 um 18:24 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/6 "2009-06-13T18:24:43Z")

</div>

Mal ein Beispiel zum Senden:

```php
HID_SendEvent($hid, 0, chr(0x20).chr(0x00).chr(0x08).chr(0x01).chr(0x00).chr(0x00).chr(0x00).chr(0x00));

```

Die ReportID unterscheidet verschiedene Typen von Reports. Die sind für jedes HID-Gerät implementationsabhängig. Da musst Du in der Protokollbeschreibung nachsehen oder selbst das Protokoll analysieren. Die offizielle HID-Spezifikation findet sich unter [USB.org - HID Tools](http://www.usb.org/developers/hidpage/). Mehr als mit der WMRS200 zu reden hab ich mit HID bisher nicht gemacht. Der Begriff HID-Buffer ist mir auch nicht geläufig.

---

<div class="post-metadata">

**Author:** ![Helmut](https://community.symcon.de/user_avatar/community.symcon.de/helmut/32/54_2.png) [@Helmut](https://community.symcon.de/u/Helmut)\
**Post date:** [13. Juni 2009 um 20:02 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/7 "2009-06-13T20:02:59Z")

</div>

Hallo Horst, hallo Alle,

hier: [bei Sprut in Deutsch](http://www.sprut.de/electronic/pic/8bit/18f/interfaces/usb/usb.htm)

wird es gut verständlich beschrieben.

Sind die ReportID`s dann die da beschriebenen Endpunktebuffer?

Das wären nämlich meine Parameterübergabe-Buffer zu meinem Interface, Marke Selbstbau.

Und dann fehlt mir noch der Zusammenhang mit dem Wert „ReportID“, kann man denn dadurch einen von max.64 Buffer direkt ansprechen?

Lieber Paresy, kann man Einen von 64 max. damit gezielt ansprechen?

PS: Falls es in der falschen Rubrik ist, verschiebe es bitte.

Gruß Helmut

---

<div class="post-metadata">

**Author:** ![Horst](https://community.symcon.de/user_avatar/community.symcon.de/horst/32/195_2.png) [@Horst](https://community.symcon.de/u/Horst)\
**Post date:** [13. Juni 2009 um 21:32 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/8 "2009-06-13T21:32:13Z")

</div>

Ich sehe da leider nirgendwo das Wörtchen HID. Das sieht mir da eher nach einem USB-Gerät mit eigenem Treiber aus. Die ReportID beim HID beschreibt von welchem Datensatztyp die gesendeten Daten sind (siehe [HID Reports](http://www.osronline.com/ddkx/intinput/hidclass_5dev.htm)).  
Da da Delphi-Beispielcode bei ist könntest Du Dir ein IP-Symcon-Modul schreiben. Ist eigentlich recht unkompliziert. Meine Delphi-Kenntnisse haben nach vier Jahren Inaktivität immernoch dafür gereicht.

---

<div class="post-metadata">

**Author:** ![Helmut](https://community.symcon.de/user_avatar/community.symcon.de/helmut/32/54_2.png) [@Helmut](https://community.symcon.de/u/Helmut)\
**Post date:** [13. Juni 2009 um 22:42 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/9 "2009-06-13T22:42:43Z")

</div>

> [@Horst](#):
>
> Ich sehe da leider nirgendwo das Wörtchen HID. Das sieht mir da eher nach einem USB-Gerät mit eigenem Treiber aus. Die ReportID beim HID beschreibt von welchem Datensatztyp die gesendeten Daten sind (siehe [HID Reports](http://www.osronline.com/ddkx/intinput/hidclass_5dev.htm)).  
> Da da Delphi-Beispielcode bei ist könntest Du Dir ein IP-Symcon-Modul schreiben. Ist eigentlich recht unkompliziert. Meine Delphi-Kenntnisse haben nach vier Jahren Inaktivität immernoch dafür gereicht.

Hallo Horst,  
hab`noch nie Delphie gemacht und meine Basic oder PHP-Kenntnisse  
sind auch nicht soo dolle.

Dein Link würde meine Frage nach der direkten Adressierung der ReportID bejahen…???..

Ich meine, ob ein USB-Gerät ein HumanInterfaceDevice oder eine andere Anwendung, zB eine USB-Festplatte, wird liegt an den Descriptoren dazu.

Ein HID-Device hat den Vorteil: es braucht keine Treiber.

Gruß und vielen Dank für alle Antworten, wieder viel gelernt.

Helmut

---

<div class="post-metadata">

**Author:** ![Horst](https://community.symcon.de/user_avatar/community.symcon.de/horst/32/195_2.png) [@Horst](https://community.symcon.de/u/Horst)\
**Post date:** [13. Juni 2009 um 23:41 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/10 "2009-06-13T23:41:02Z")

</div>

Keine Treiber ist auch nicht richtig. Eher: Der Treiber ist beim OS dabei. Als was das USB-Gerät anzusehen ist steht dann schon in den Deskriptoren. Ich vermute, dass die Befehle in IP-Symcon nur für richtige HID-Devices funktionieren und nicht für jedes USB-Gerät.  
Meinen Link würde ich so interpretieren, dass für identisch große Datensätze anhand der ReportID eine Unterscheidung möglich ist, wie diese zu interpretieren sind. Nimmt man z.B. einen Block von 3 Byte Länge könnte ReportID 0 bedeuten, dass Byte 1 Luftfeuchtigkeit, Byte 2 und 3 Temperatur darstellen; ReportID 1 sagt, dass Byte 1 bis 3 zusammen einen 24bit Zählerwert darstellen.  
Bei der WMRS200 hat das keinen interessiert, da gibt es nur ReportID 0. Empfange Pakete sagen dann in Byte 1, wie viele Bytes des Datenblocks zu verwerten sind. Diese muss man dann bis zum Auftauchen einer Trennfolge zusammensetzen und die Datensätze interpretieren. Welcher Sensor was gesagt hat ist dann im jeweiligen Datenblock zu finden.

---

<div class="post-metadata">

**Author:** ![Helmut](https://community.symcon.de/user_avatar/community.symcon.de/helmut/32/54_2.png) [@Helmut](https://community.symcon.de/u/Helmut)\
**Post date:** [14. Juni 2009 um 01:01 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/11 "2009-06-14T01:01:45Z")

</div>

Jo,  
will mich aber bestärkt fühlen, da ich auch in deinem Link von ReportID Nr.4 und 5 usw. lese.

Werde es ausprobieren.  
Gruß Helmut

---

<div class="post-metadata">

**Author:** ![paresy](https://community.symcon.de/user_avatar/community.symcon.de/paresy/32/29554_2.png) [@paresy](https://community.symcon.de/u/paresy)\
**Post date:** [14. Juni 2009 um 10:14 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/12 "2009-06-14T10:14:30Z")

</div>

Wofür die ReportID gut ist, kann ich dir auch nicht sagen. In Protokollen wird nur definiert, wohin man senden soll. Ich kenne bis jetzt auch nur Geräte, wo an an die #0 gesendet werden muss. Der Rest wird dann über die folgenden Bytes geregelt, da dort meistens ein RS232 ähnliches Protokoll aufgesetzt ist.

paresy

---

<div class="post-metadata">

**Author:** ![Helmut](https://community.symcon.de/user_avatar/community.symcon.de/helmut/32/54_2.png) [@Helmut](https://community.symcon.de/u/Helmut)\
**Post date:** [14. Juni 2009 um 10:36 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/13 "2009-06-14T10:36:12Z")

</div>

Hallo Paresy!

Ja, es gibt auch eine Fehlermeldung, sobald man grösser 0 als Parameter angibt.

Eine Anreihung von Bytes ist scheinbar möglich.

Ein gezieltes Schreiben ist also nicht möglich.

Gruß Helmut

---

<div class="post-metadata">

**Author:** ![tommi](https://community.symcon.de/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@tommi](https://community.symcon.de/u/tommi)\
**Post date:** [14. Juni 2009 um 17:23 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/14 "2009-06-14T17:23:49Z")

</div>

Das würde gehen, wenn die Implementation auf Deinem PIC das zuläßt.  
Man könnte das so implementieren, das man die übergebenen Daten als Addresse, Value -Paare versteht.  
Also um Register 1 mit Wert 255 zu versorgen, kann man chr(1).chr(255) senden.  
Zum Auslesen könnte man es so machen, das auf alle Addressen 128 addiert wird. Alle übergebenen Werte sind dann halt Adressen (oder man macht noch ein Befehlsbyte statt dem Adressbit dazu)  
BTW: da ich das Projekt ja kenne: Der PIC sollte auch eine Quittung liefern, ob er einen Befehl angenommen und ausgeführt hat.

Tommi

---

<div class="post-metadata">

**Author:** ![Ferengi-Master](https://community.symcon.de/user_avatar/community.symcon.de/ferengi-master/32/126_2.png) [@Ferengi-Master](https://community.symcon.de/u/Ferengi-Master)\
**Post date:** [1. Januar 2011 um 14:32 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/15 "2011-01-01T14:32:10Z")

</div>

Ich bin der Meinung das Horsts Script noch einen Fehler hat.

```php

if (((int)HID_GetDeviceVendorID($hid_id) != $vendor_id) && ((int)HID_GetDeviceProductID($hid_id) != $product_id))    

```

An dieser Stelle wird davon ausgegangen das die HID noch eine Verbindung hat. Welche aber schon nicht mehr vorhanden sein kann. Hier müßte meines Erachtens noch eine Prüfung über HID\_GetDevices erfolgen ob z.B. die Product ID überhaupt noch existiert.

---

<div class="post-metadata">

**Author:** ![Horst](https://community.symcon.de/user_avatar/community.symcon.de/horst/32/195_2.png) [@Horst](https://community.symcon.de/u/Horst)\
**Post date:** [1. Januar 2011 um 18:31 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/16 "2011-01-01T18:31:54Z")

</div>

Ob die Verbindung nicht mehr in Ordnung ist, wird mit $instance[‚InstanceStatus‘] \>= 200 geprüft.

---

<div class="post-metadata">

**Author:** ![Ferengi-Master](https://community.symcon.de/user_avatar/community.symcon.de/ferengi-master/32/126_2.png) [@Ferengi-Master](https://community.symcon.de/u/Ferengi-Master)\
**Post date:** [1. Januar 2011 um 18:36 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/17 "2011-01-01T18:36:54Z")

</div>

Nein. Das sagt meiner Meinung nur aus ob ein Fehler vorliegt. Nicht aber ob die Instanz eine Verbindung zum PC hat.

---

<div class="post-metadata">

**Author:** ![Hausautomation](https://community.symcon.de/letter_avatar_proxy/v4/letter/h/d2c977/32.png) [@Hausautomation](https://community.symcon.de/u/Hausautomation)\
**Post date:** [2. Oktober 2011 um 10:19 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/18 "2011-10-02T10:19:41Z")

</div>

Mein Velleman Board verliert auch manchmal die Verbindung. Ich muss dann den HID schließen und wieder öffnen - dann klappts wieder.  
Deswegen habe ich mal das Skript ausprobiert. Ich habe die 3 IDs korrekt eingetragen - leider setzt das Skript nur den Timer und scheint sonst nichts zu machen? Es kommt keine Meldung (echo) und ein geschlossenes HID wird auch nicht geöffnet…😕

LG, Andreas

---

<div class="post-metadata">

**Author:** ![paresy](https://community.symcon.de/user_avatar/community.symcon.de/paresy/32/29554_2.png) [@paresy](https://community.symcon.de/u/paresy)\
**Post date:** [2. Oktober 2011 um 10:22 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/19 "2011-10-02T10:22:24Z")

</div>

Wenn der HID das Gerät ansich nicht verliert, dann reicht ja, wenn du per Timer eine IPS\_ApplySettings im Skript ausführst. Du kannst dir das Gesuche dann quasi sparen 🙂

paresy

---

<div class="post-metadata">

**Author:** ![Hausautomation](https://community.symcon.de/letter_avatar_proxy/v4/letter/h/d2c977/32.png) [@Hausautomation](https://community.symcon.de/u/Hausautomation)\
**Post date:** [2. Oktober 2011 um 10:33 UTC](https://community.symcon.de/t/hid-verbindungsskript/19402/20 "2011-10-02T10:33:07Z")

</div>

> Wenn der HID das Gerät ansich nicht verliert, dann reicht ja, wenn du per Timer eine IPS\_ApplySettings im Skript ausführst. Du kannst dir das Gesuche dann quasi sparen

Danke, werde ich ausprobieren 😃

[Nächste Seite](https://community.symcon.de/t/hid-verbindungsskript/19402.md?page=2)
