Scriptfehler oder was ist falsch?

Wenn ich der Registervariable mein Script zuweise, wird das HID-Gerät per Script, scheinbar immer wieder beschrieben.

Lasse ich die Zuweisung weg funktioniert es Super und wird auch nur einmal aufgerufen.

Anbei ein zusammen gesetzes Bild von der Konfiguration und den Meldungen.
Im Debugfenster des HID-Gerätes kann man sehen, dass es immer wieder angesteuert wird.

Habe leider wenig Ahnung von PHP, weiß aber nicht was ich da falsch mache, wenn ich dann Execute anklicke…

Hier mein Script:

<?
$ProduktID=1;
$VendorID=1;
$SerienNr=1;
//##########################   Hole  ProduktID und zeige sie    ############
$ProduktID=HID_GetDeviceProductID(13116 /*[HID]*/);
//Echo "ProduktID: ".  $ProduktID." ";

//##########################   Hole  VendorID und zeige sie     ############
$VendorID=HID_GetDeviceVendorID(13116 /*[HID]*/);
//Echo "VendorID: ".$VendorID;

//#########################    Hole Ser ien Nr des Geräte        ############
$SerienNr=HID_GetDeviceSerial(13116 /*[HID]*/);
//Echo "VendorID: ".$SerienNr;

//###########        Wenn das Gerät da ist mach mal was         ############
If (($ProduktID=="1206") And ($VendorID=="5840") And ($SerienNr=="00001"))
{
echo " Das ist Helmut`s Funk-Modul Nr 1";

//#  Schalte Funksteckdose Hauscode 31 Steckdose A für 2 Sekunden " Ein "  #
HID_SendEvent(13116 /*[HID]*/,0 , chr(0x1F).chr(0x01).chr(0x01).chr(0x02));
}

//##############       man muss nicht alle 12 Parameter übertragen  #######
//HID_SendEvent(13116 /*[HID]*/,0 , chr(0x1F).chr(0x01).chr(0x01).chr(0x02).chr(0x00).chr(0x01).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00));

$RegVarID =58534 /*[HID\Register Variable]*/;
$data=RegVar_GetBuffer($RegVarID);
//echo  " RegVar: ". $RegVarID. " ";
echo  " Buffer: ".$data." Länge: ". strlen($data). " ";


?&gt;

Kann mit der Suchfunktion keine gleichwertige Fragestellung finden…

Edit 21:53,
habe ein 2. Script mit den beiden PWM-Anweisungen geschrieben.
Ohne Register Variabel zuweisungen klappt es wunderbar.

Weise ich der Registervariabel irgend Einen der beiden Scripte zu, wird der auf „ausführen“ geklickte Script scheinbar dann immer wieder aufgerufen.
Objektbaum dazu als Bild angehängt.

<?
$ProduktID=1;
$VendorID=1;
$SerienNr=1;
//##########################   Hole  ProduktID und zeige sie    ############
$ProduktID=HID_GetDeviceProductID(13116 /*[HID]*/);
//Echo "ProduktID: ".  $ProduktID." ";

//##########################   Hole  VendorID und zeige sie     ############
$VendorID=HID_GetDeviceVendorID(13116 /*[HID]*/);
//Echo "VendorID: ".$VendorID;

//#########################    Hole Ser ien Nr des Geräte        ############
$SerienNr=HID_GetDeviceSerial(13116 /*[HID]*/);
//Echo "VendorID: ".$SerienNr;

//###########        Wenn das Gerät da ist mach mal was         ############
If (($ProduktID=="1206") And ($VendorID=="5840") And ($SerienNr=="00001"))
{
echo " Das ist Helmut`s Funk-Modul Nr 1 mit 2x PWM 
";

//##########     Setze die beiden PWM-Ausgänge auf 50%          ############
HID_SendEvent(13116 /*[HID]*/,0 , chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x7D).chr(0x7D));
}

//##############       man muss nicht alle 12 Parameter übertragen  #######
//HID_SendEvent(13116 /*[HID]*/,0 , chr(0x1F).chr(0x01).chr(0x01).chr(0x02).chr(0x00).chr(0x01).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00));

$RegVarID =58534 /*[HID\Register Variable]*/;
$data=RegVar_GetBuffer($RegVarID);
//echo  " RegVar: ". $RegVarID. " ";
echo  " Buffer: ".$data." Länge: ". strlen($data). " ";


?&gt;

Hallo Helmut,

wo genau liegt jetzt dein Problem.

Wenn ich der Registervariable mein Script zuweise, wird das HID-Gerät per Script, scheinbar immer wieder beschrieben.

Das wird daran liegen, das Daten in der Regvar anstehen. D.h. dass dein HID-Gerät ständig sendet.

Hallo Rainer!

Eigentlich tut mein HID-Gerät das nicht.
Wenn ich die Reg-Variable nicht zuweise, führt ein Execute auf mein Script dazu, dass es die Daten, die im HIDsent drin stehen, bekommt.

Mein HID-Gerät schickt als Antwort ein Report von 12 Bytes zurück.
Dann ist auch Ruhe.

Genau Dieses funktioniert dann nur einmal, läßt sich auch mehrfach „executen“.
Ohne Probleme.

Nur wenn ich die Registervariable dem HID-Gerät zuweise, was sicher Vorteile hat, dann wird das Script bei einmal „execute“ geklickt scheinbar ständig aufgerufen.

Jedenfalls bekomme ich im HID-Debugfenster send und receive-Meldungen.

Wenn man in das Meldungsfenster schaut, dann steht, bei der „vollzogenen RegVarzuweisung“ die Echomeldung meines Script drin ??? Wieso ???

Edit:
Habe im ersten Tread eine Zusatz geschrieben.

Kann es was damit zu tun haben, dass die Register Variabel 14 Bytes auswirft und das HID-Gerät eigentlich nur 12 ausgibt?

Also mit 00 7C was passiert?

Aber wieso beeinflußt es mein Script?

Nachtrag:
Habe ich die Registervariable zugewiesen, wird, nach Scriptaufruf, immer wieder auf das HID-Gerät geschrieben.
Sobalt ich die Zuweisung lösche ( bei der Register Variable) hört die HID-Schreiberei auch gleich auf.

Hi Helmut,

also ich bin ja nu auch PHP Analphabet, aber so wie ich das sehe, ruft der erste Aufruf des Skriptes das Modul auf, und es antwortet.

Die Registervariable merkt das, und da dort das aufrufende Skript wieder aufgerufen wird: geht es los:
Onanie des Skriptes mit Hilfe der Registervariable, es ruft wieder …

Wenn ich mich recht entsinne, nennt man so etwas Rekursion, eine geschlossene Schleife ohne Ende… oder liege ich da falsch?

Was willst Du von der Antwort des Modules auswerten?

Ich würde entweder ein neues Skript zum Auswerten anlegen oder aber im bestehenden eine Case Anweisung einfügen um eine Verzweigung innerhalb des Skriptes zu erreichen, so dass der Teil abgearbeitet wird, welche die Auswertung der Antwort übernimmt (ohne erneutes Aufrufen des Skriptes).

mfg

Bernd

PS:

//#  Schalte Funksteckdose Hauscode 21 Steckdose A für 2 Sekunden " Ein "  #
HID_SendEvent(13116 /*[HID]*/,0 , chr(0x1F).chr(0x01).chr(0x01).chr(0x02)); 

Den kannte ich noch nicht für den 433 MHz Sender, hast Du noch mehr solche Überraschungen?
Zeitrahmen 16bit, sprich 256 Werte, entsprechend max. 255 Sekunden??

Hab ihn gefunden. Toll. In der Praxis wünscht man dann doch ab einer bestimmten Zeit längere Intervalle, Thema Treppenhauslicht oder aber energiesparende Aussenbeleuchtung, würde das gehen??, zumal ja der nächste, gesendete, Befehl diesen alten abhakt; sauber programmiert.

Ich sollte anscheinend nochmal Deinen Tread durch arbeiten um alle Möglichkeiten in die Anleitung mit aufzunehmen.
Aber wieso ist Hauscode 1F = Dez. 21??, ich lande da bei 31. Nächste Frage: hast Du an dem Modul schon mal ´nen Dimmer von diesem 433 MHz Schrott dran gehabt? Da die bei Minus nach dem runterdimmen wieder blöd hochdimmen kann man das anscheinend vergessen, oder?

Du hast in deinem Skript ja auch ein SendEvent drin, welches jedes mal ausgeführt wird, wenn die registerVariable das Skript ausführt.

Teile einfach dein Skript in 2 auf. Ein Request Skript und eines, dass die Antwort auswertet.

paresy

Hallo Bernd, hallo Paresy.
ich sag’ ja ich behersche das nicht.

Die Registervariable ruft das Script auf…:loveips: ich muß den Kram echt mal genau durchlesen.

Ich gebe es zu, ich benutze die 1, mit der 2er spiele och nur rum.

@wegen der Zeitsteuerung: dat is der Hit woll :D, geht auch mit den Ports.

@Dimmer habe ich keinen, kann es nicht ausprobieren, muß mir mal einen besorgen.

@PWM hast du denn schon gemacht?

Aber dafür nicht schlecht:p

Hi Helmut,

hab mir erst am Samstag so einen gegönnt. Ist ab heute bei Bah* im Angebot für 9,99 (1 Funke, 2 Schalter, 1 Dimmer).
Aus meiner Sicht per IPS nur mit kurzen Schaltbefehlen nutzbar, also

Kaufempfehlung: Spar Dir diese Knete.

Der Grund ist die typisch unzuverlässige Funkverbindung, das Manko in der Firmware (die Dinger stellen sich für eine Zeit auf Taub, wenn „zu viel“ an Tasteninput erfolgt) und das Fehlen eines definierten Punktes im Dimmbereich um ihn per IPS gezielt anzufahren
(Druck auf die Minus Taste: er dimmt runter und wenn er da angekommen ist: WIEDER HOCH).

Nachdem ich Dein Spielzeug in den Grabbeln hatte bin ich zu nichts anderem gekommen als die ganze Hütte mit diesen Schaltern voll zu pflastern und in IPS einzubinden.

WebFront und iFront sind dann ja der Hit und da in den Räumen, wo die Schalter eingesetzt werden, noch die originalen Fernbedienungen liegen lässt es sich auch ohne IPS autark bedienen (bis auf die zusätzlichen 27 Kanäle per Hauscode).

Das mit den zusätzlichen Kanälen hat auch einen Vorteil: angenommen,
Dein Nachbar hätte begriffen, auf welchem Kanal er deine Stereoanlage auf der Terrasse ausschalten könnte,
das ist bei Nutzung von diesen „Sonderkanälen“ vorbei.

Als nächstes kommt dann der Test der IO Ports, anschliessend die analogen Eingänge und dann PWM.

Zur Leiterplatte:
die mit dem RFM12, würde die auch gehen,
für den Fernbedienungssender brauchen wir ja nur 2 Drähte, sprich einen Port?
was ist da sonst noch so alles drauf?

@Uwe: Danke für die Blumen, aber das bisschen was ich davon kenne habe ich nur aus diesem Forum, daher gilt der Dank allen aktiven Mitgliedern hier.:slight_smile:

mfg

Bernd

Hallo Bernd,
könntest du dann auch hier deinen PHP-Code anpreisen?
Ich bin zu blöde dafür. Maxi mea Culpa heißt es als Messdiener, glaube ich…:rolleyes:
Ich bekomme da keine Daten raus.:loveips:

<?
$RegVarID =58534 /*[HID\Register Variable]*/;
$data=RegVar_GetBuffer($RegVarID);
echo  " RegVar: ". $RegVarID. " ";
echo  " Buffer: ".ord($data)." Länge: ". strlen($data). " ";

?>

Also Dimmer lohnt sich nicht?
Wäre aber auch oberplööde, wenn man den Dimmpunkt nicht genau bestimmen kann.

Abhife: ich versuche mich an so einem Empfängerersatz.

Habe den Sender hinbekommen, dann kann ich auch die Manchesterhose anziehen.
Vorteil: kann man dann auch schon bidiektional machen.
Ein Chip, ein Empfänger, ein Sender.

Wer Tostmann kennt: pimp my Funksteckdose!

Aber wie du schon richtig erkannt hast, das ist mein neuestes Projekt: das kommt mit dem RFM12-Funkchip und der Schalterdosenplatine.

Vorher kommt aber noch die Temperaturerfassung und die Ansteuerung der ELV Funk-Stellventile in den PIC-Kontroller, angepasst auf PIC, von meinem Bascom-AVR-Code. Ev. noch 3 statt 2 PWM, für RGB-LED-Ansteuerung…

Beide Codes laufen schon für sich, muß ich noch in den Multi-Funki-Code mit reinpflegen.
Allein die Zeit fehlt…

Habe es aufgeteilt. 4 Stunden investiert, einmal Frustspaziergang gemacht, ich gebe auf.

Ich checke das nicht, es müste doch in der Registervariable was von dem übergeordneten HID-Gerät drin stehen.
[b]Bild[/b]

Das HID-Debugfenster zeigt mir Daten, die Registervariable nicht.

auf die Knie fall
Kann mir Einer, der es kann, mal den „TomTom“ für die IPSymcon-HID-Auswertekarte machen.

Bitte mit Steffi`s Stimme, weich und einfühlsam.

Anmerkung zum Funkdimmer: Off-Taste dimmert, „ON“- Taste toogelt mit dem letzen Dimmwert -----> kann man doch gebrauchen?!

Hi Helmut,

so, ich konnte Dich nicht leiden sehen und hab mal folgenden Skript zusammengeklaubt:

<?

switch($IPS_SENDER)                                // ermitteln, wodurch das Skript aufgerufen wurde
{
    case "Execute":                                // von Hand aufgerufen: Schleife starten
    case "TimerEvent":                             // vom Timer aufgerufen: Schleife starten
		HID_SendEvent(42538 /*[Helmut´s 433 MHz Modul]*/, 0, chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x7D).chr(0x7D).chr(0x00).chr(0x00));       // Blankoaufruf senden
    break;

    case "RegisterVariable":                       // durch Registervariable aufgerufen: neuer Wert wurde empfangen
       SetValue(45705 /*[Technik\Helmut´s 433MHz Modul\vom 433MHz Modul]*/, $IPS_VALUE);               // empfangenen Wert abspeichern, aber wo ist der ??, Variable wird aktualisiert, aber ohne Inhalt
    break;
}

?>

Mir ist folgendes aufgefallen:

Bei Aufruf des Skriptes antwortet das Modul wunderbar, man erkennt das in dem Debug Fenster der Registervariablen. Der Skript aktualisiert auch die String Variable (erkennbar an der geänderten Zeit); dort kommt aber nichts an.

Bei dem Versuch einen Cutter zwischen zu schalten, folgendes:

Mir fehlt im Auswahlfenster Dein HID Device zur Auswahl, gibbet nich!, siehe anliegendes Bild.

Anders bei der Auswahlmöglichkeit der Registervariablen, dort gibt es das Modul und das Debugfenster kennt ja auch die eingehenden Daten; anscheinend gehen die aber danach auf dem Wege innerhalb der Instanz Registervariable verloren?

Oder könnte der Fehler wo anders liegen, ist der mikrige PHP Code richtig?

mfg

Bernd

PS: nächtliche Ergänzung:
Bei HID Geräten werden für einen Tastendruck normalerweise zwei unterschiedliche Codes gesendet:
Der erste sagt aus: diese Taste wurde gedrückt,
der zweite (abweichender Code): diese Taste wurde wieder losgelassen.
Grund: der angeschlossene Rechner kann die Länge des Tastaturanschlages auswerten.
Mit dieser Hoffnung bewaffnet habe ich versucht das Skript zu ändern, weil ich der Meinung war:
2 Antworten und somit überschreiben wir die erste: ist nicht gegeben, es gibt anscheinend nur eine Antwort.

Paresy könnte evtl. die Frage beantworten: sind 14 Werte bei HID von der Registervariable noch zulässig??, oder fängt er ab 12 wieder neu an?

Mit welchen Skripten haben andere HID Geräte ausgewertet und, falls das klappte: wie lang waren die Antworten?

Müssen für eine Zuordnung der Antwort vorher noch andere Parameter mitgeteilt werden??

In der Hoffnung, dass wir gemeinsam die Kuh vom Eis kriegen, gute Nacht.

Nachtrag: alles dumm Tuech auf dem Weg zur Lösung, die gibt´s HIER

Hallo Bernd,
habe dein Script mal ausprobiert.

Ist für mich nicht verständlich, wie ich nun die Registervariable in Hexaform mit dem ord-Befehl oder Dezimal verwerten kann.

Ich kann es einfach nicht.

Dass Cutter nicht geht, wußte ich schon.

Aber es geht sicherlich… allein, ich komme nicht drauf.:rolleyes:Habe diese Zeile noch in`s Script geschrieben:

//  ############    mal zur Info:
print_r(IPS_GetInstance(58534 /*[HID\Register Variable]*/));

Hi Helmut,

die Registervariabe übergibt den vorher im Debugfenster gesehenen Wert nicht an die Variable. Bei Verwendung der gleichen Syntax in Verbindung mit einer seriellen Schnittstelle lüppt dat.

Da sitzen wir beiden nun wie die begossenen Pudel und jammern gemeinsam.:stuck_out_tongue:

mfg

Bernd

PS: noch ein paar Ideen:

braucht die Registervariable ein abschliessendes CR/LF??, und woher kommen in der Registervariablen die ersten 4 Bytes, im HID Sendefenster sind die ja nicht drin??

@ Helmut: ist der Aufwand gewaltig, in der Firmware zum Ermitteln der Grenzen einmal die Länge der Antwort zu kürzen?

Nachtrag: alles dumm Tuech auf dem Weg zur Lösung, die gibt´s HIER

@Bernd,
das ist kein Thema, da kann ich einiges machen.

Ich hoffe auf das Forum. Ich denk`wahrscheinlich im Kreis, da muß es eine Lösung geben.

Habe Freitag einen Frustkauf bei ELV gemacht.

Eine USB Steckdose [b]USB SI1[/b].

Gerät kam heute. Um aus zu testen, dass es nicht unbedingt an meiner Hardware liegt, habe ich es mal auch mal in IPSymcon eingebunden.

Geht auch nicht… Das Gerät sendet noch ein paar mehr Bytes…:eek:

Hat es jemand erfolgreich in IPSymcon eingebunden?

zeig mal deine php.ini

register_globals=on

das sollte drinnen stehen, hatten wir die Woche schon mal.

Hi Helmut,

hast Recht.

Nimm den und werd glücklich, läuft so bei mir.

<?
switch($IPS_SENDER)                                // ermitteln, wodurch das Skript aufgerufen wurde
{
    case "Execute":                                // von Hand aufgerufen: Schleife starten
    case "TimerEvent":                             // vom Timer aufgerufen: Schleife starten
		HID_SendEvent(42538 /*[Helmut´s 433 MHz Modul]*/, 0, chr(0x00).chr(0x01).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x7D).chr(0x7D).chr(0x00).chr(0x00)); // Blankoaufruf senden
    break;

    case "RegisterVariable":                       // durch Registervariable aufgerufen: neuer Wert wurde empfangen

       SetValue(45705 /*[Technik\Helmut´s 433MHz Modul\vom 433MHz Modul]*/, $IPS_VALUE);  // empfangenen Wert abspeichern

// Erklärung der neu kennengelernten PHP Befehle:
// SetValue sollte klar sein, speichert den Krempel in die rot gekennzeichnete Objekt ID
// ord sorgt für die Darstellung des ASCII Wertes des selektierten Bytes
// substr beginnt bei dem Zeichen, welches im ersten Parameter genannt wird für die Länge des im im 2.ten Parameter genannten Wertes2

       SetValue(14144 /*[Technik\Helmut´s 433MHz Modul\1]*/, ord(substr ($IPS_VALUE, 1, 1)));
       SetValue(47900 /*[Technik\Helmut´s 433MHz Modul\2]*/, ord(substr ($IPS_VALUE, 2, 1)));
       SetValue(51969 /*[Technik\Helmut´s 433MHz Modul\3]*/, ord(substr ($IPS_VALUE, 3, 1)));
       SetValue(56301 /*[Technik\Helmut´s 433MHz Modul\4]*/, ord(substr ($IPS_VALUE, 4, 1)));
       SetValue(17189 /*[Technik\Helmut´s 433MHz Modul\5]*/, ord(substr ($IPS_VALUE, 5, 1)));
       SetValue(27399 /*[Technik\Helmut´s 433MHz Modul\6]*/, ord(substr ($IPS_VALUE, 6, 1)));
       SetValue(39903 /*[Technik\Helmut´s 433MHz Modul\7]*/, ord(substr ($IPS_VALUE, 7, 1)));
       SetValue(48195 /*[Technik\Helmut´s 433MHz Modul\8]*/, ord(substr ($IPS_VALUE, 8, 1)));
       SetValue(31921 /*[Technik\Helmut´s 433MHz Modul\9]*/, ord(substr ($IPS_VALUE, 9, 1)));
       SetValue(54861 /*[Technik\Helmut´s 433MHz Modul\10]*/, ord(substr ($IPS_VALUE, 10, 1)));
       SetValue(23687 /*[Technik\Helmut´s 433MHz Modul\11]*/, ord(substr ($IPS_VALUE, 11, 1)));
       SetValue(13591 /*[Technik\Helmut´s 433MHz Modul\12]*/, ord(substr ($IPS_VALUE, 12, 1)));
       SetValue(58687 /*[Technik\Helmut´s 433MHz Modul\13]*/, ord(substr ($IPS_VALUE, 13, 1)));
       SetValue(20603 /*[Technik\Helmut´s 433MHz Modul\14]*/, ord(substr ($IPS_VALUE, 14, 1)));

    break;
}

?>

Musst noch ein paar String Variablen anlegen, (hat mal einer ´nen Tip, wie automatisier ich das?) und gut. :slight_smile:

Das geht alles bestimmt viel eleganter, mit Array´s, Schleifen usw… Mir ging es vor allem erst mal darum zu zeigen: es lüppt doch!
Falls einer der PHP Spezies sich austoben möchte, wir lernen gerne dazu. :rolleyes:

mfg

Bernd

@Bernd,
Your are the best,
Sind zwar Bytes, aber das ist ja wurscht, wenn es funzt!

Geht bestimmt irgendwie mit Array`s.
Schnurz, bin schwer begeistert von dir, möchte nicht wissen wieviel Zeit das wieder gekostet hat.

Vielen Dank für deine Mühe!!

Ausprobieren muß ich aber später, ich werde mich jetzt erst einmal totstellen. Morgenabend teste ich es.

@Rainer,
steht drin:


max_execution_time=30
register_globals=on
error_reporting=E_ALL
extension_dir=C:\IP-Symcon\ext
extension = php_gd2.dll
[DATE]
date.timezone="Europe/Berlin"

Auch dir vielen Dank!!