RS232 illegal formart

Der Beamer versteht nix, weil bei Befehl testen der Befehl noch einmal bei den Nutzdaten steht.
Sieht man im Transmit. Dort darf nur der Teil \r*pow=on#\r stehen.
Michael

ne sorry klappt nicht !

immer noch die Fehlermeldung

Liegt aber daran, dass die Konsole die Zeichen anders maskiert.
Das \r steht für das Steuerzeichen Return oder .
Du musst also

[ol]
[li]Ein Script im Objektbaum anlegen[/li][li]Den Befehl SPRT_SendText eingeben[/li][li]Die ObjektID des SerialPort als ersten Parameter eintragen[/li][li]Und als zweiten Parameter deine zu sendenen Nutzdaten in doppelten Hochkomma[/li]
z.B. so:


SPRT_SendText (12345, "\r*pow=on#\r");

[li] Das Script ausführen.[/li][/ol]
Michael

Versuche es mal mit dem Code „\x38\x39\x39\x73\x24\x30\x37\x36\x0d“. Es müsste sich die Helligkeit ändern, wenn der Beamer an ist.

Oder

„\x38\x39\x39\x73\x21\x30\x30\x31\x0D“ Beamer an

„\x38\x39\x39\x73\x21\x30\x30\x30\x0D“ Beamer aus

„\x38\x39\x39\x73\x21\x30\x30\x32\x0D“ Beamer Standby

Wird aus dem Befehle testen Menü nicht funktionieren.
Dann wird wirklich \x38 (4 Byte) anstatt p (1 Byte) gesendet!
Michael

Und wie kann man den Hexcode übertragen?

Hex ist nur eine andere Darstellung.
Und wie gesagt, über Befehle testen kannst du keine Steuerzeichen oder Bytes in Hexadezimaler Darstellung versenden. Die Konsole maskiert alles, so das wirklich /r (2 Byte) anstatt 0x0d oder <CR> (1 Byte) übertragen wird.

Da man Steuerzeichen schlecht sichtbar machen kann, gibt es in PHP (wie auch in jeder anderen Sprache) Möglichkeiten diese dennoch zu benutzen.

Das wäre in PHP entweder die Hexadezimal Schreibweise wie von dir vorgeschlagen oder auch halt
usw…
Das funktioniert aber nur in einem PHP Script. Nicht über Befehle Testen Dialog.
Michael

wie gehe ich an diese Sache dran PHP Skript habe leider da kein plan

Siehe mein Beitrag #23.
Da steht alles.
Michael

hat wunderbar geklappt !!!

wie bekomme ich die Rückmeldung ob der Beamer an oder aus ist ?

Und was hast Du jetzt denn gesendet bzw. wie ist das Kabel jetzt angeschlossen?

Was bekommst Du denn in Debug Fenster als Antwort wenn Du per Skript


SPRT_SendText (12345, "\r*pow=?#\r"); // ObjektID anpassen

sendest?

Hi Urlauber :slight_smile:

Beamer ist mit der Variante 2 angeschlossen USB RS232 Kabel mit Nullmodel Kabel die Adapter wurden nicht benötigt

Im Debug : Serial port habe ich den befehl gesendet bekomme den Status OFF angezeigt ( ist auch korrekt )

Wenn das so weit funktioniert musst Du Dir jetzt eine Instanz erstellen mit Variablen, diese Variablen kannst Du dann beschreiben bzw. über diese Variablen das Gerät schalten.

Als Beispiel:

[ul]
[li]Anlegen einer Dummy Instanz[/li][li]unterhalb der Dummy Instanz legst Du eine Variable vom Typ Bool an mit dem Variablenprofil ~Switch[/li][li]Dann weist Du der Variable ein Aktion Skript zu in der Form[/li]


if ($_IPS['VALUE']) {
SPRT_SendText (12345, "\r*pow=on#\r"); // Objekt ID anpassen
}
else
{
SPRT_SendText (12345, "\r*pow=off#\r"); // Objekt ID anpassen
}
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);

[li]Als nächstes brauchst Du ein weiteres Skript das Dir die Rückmeldung die Variablen aktualisiert [/li]


if ($_IPS['VALUE'] == "ON") {
SetValue(12345, true); // Objekt ID für die Variable zum Einschalten anpassen
}
elseif($_IPS['VALUE'] == "OFF")
{
SetValue(12345, false); // Objekt ID für die Variable zum Einschalten anpasse
}

[li]Dann brauchst Du noch eine Registervariable die übergeordnete Instanz ist der Serial IO und als auswerte Skript das Skript dasDu vorher angelegt hast. Die Instanz Registervariable gibt den Wert den Du vom IO erhälst an das Skript weiter das dann die Variable aktualisiert.[/li][/ul]

Wenn alles richtig eingerichtet ist kannst Du mit der Variable den Beamer ein/ausschalten und die Variable aktualisiert sich sobald der Beamer den Status ändert.
Das gleiche Vorgehen gilt für alle weiteren Befehle auch das ist dann Fleißarbeit. Du legt also jeweils für den Befehl eine passende Variable mit Aktion Skript an und musst dann in dem Auswerteskript jeweils ergänzen was die Rückmeldung ist und welche Variable in dem Fall aktualisiert werden soll.

habe soweit eine Dummy Instanz erstellt habs unter Dummy Module ( Gerät ) gefunden kann ich diese nehmen ?

bzgl des PHP Skripts wo die Befehle ein und ausschalten kommen würde ich gerne seperat machen ein Skript zum Einschalten und eins zum Ausschalten ( habe ich vorher bereits in IPS) Hintergrund ist NEO kann dann expliziert auf den Befehl zugreifen und ausführen: aktuell wüsste ich nicht wie ich dann dieses über neo machen müsste.

Bin leider immer noch bei der REgisterVariable stecken geblieben:
weiss nicht wie ich diese hinzufügen soll sorry für die nerven kosten…

ergänzung zum Text als rückmeldung bekomme im DEBUG folgendes rückgemeldet
*pow=off# ein reines OFF bekomm ich nicht

Ja

Wenn Du einzelne Skripte für Befehle nutzten willst dann nutzt Du im Aktion Skript einfach einen Verweis auf das auszuführende Skript
siehe IPS_RunScript

Also


if ($_IPS['VALUE']) {
IPS_RunScript(12345); // Einschaltskript, Objekt ID anpassen
}
else
{
IPS_RunScript(23456); // Ausschaltskript, Objekt ID anpassen
}
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']); 

Du importiert die Dummy Instanz im Geräte Manager in NEO, die darunter liegenden Variablen kannst Du dann normal schalten bei Boolean z.B. ein/aus, wenn dieser Variable auch ein Aktionskript zugewiesen worden ist.
Was nicht geht ist ein togglen mit einem Button, dazu brauchst Du wiederum ein Skript das auf dem Button liegt. Wenn Du also mit einem Button abwechselnd ein/aus schalten willst dann startest Du ein Skript in der Form


$state = GetValue(34567); // Wert der Variable mit dem Status auslesen
if ($state) // wenn der Wert true (ein) ist dann ausschalten
{
IPS_RunScript(23456); // Ausschaltskript, Objekt ID anpassen
}
else // ansonsten einschalten
{
IPS_RunScript(12345); // Einschaltskript, Objekt ID anpassen
}

Der Name mag verwirrend sein, es handelt sich um eine Instanz, also Rechte Maustaste -> Objekt hinzufügen -> Instanz -> und hier Register Variable als Gerät auswählen. Dann das Zielskript zuweisen und als übergeordnete Instanz den Serial IO einstellen.
Der Wert der hier hinter == im Skript steht muss dem Wert entsprechen den Du entsprechend von dem Gerät als Antwort bekommst. Im Zweifelsfall musst Du halt nochmal einen Auszug aus dem Debug Fenster posten wenn Du eine Antwort erhälst.

Hatte in NEO das mit den Skript gemacht hat funktioniert und würde jetzt ungern das noch komplizierter machen und euch mehr Haare vom Kopf fallen lassen…

Ich habe die Registervariable angelegt und habe von dir die Skripte der Variable zugewiesen.

habe mal das so probiert … aber keine Änderung.

wo kann man den einstellen das der Status alle 10 Sekunden aktualisiert erden soll ?

klappt wie nicht … wo liegt mein Fehler.?

Das hängt davon ab, wenn Du das Gerät einschaltest und Du bekommst automatisch eine Rückmeldung vom Gerät würde es auch reichen das auszuwerten. Wenn Du ständig eine Abfrage machen willst dann legst Du ein zyklisches Ereignis auf das Skript das dann zyklisch ausgeführt wird in dem Intervall wie Du das willst.

Ein Fehler ist das Du die Variable setzten musst mit SetValue, dort hast Du aber die Objekt ID vom IO hinterlegt, hier musst Du also die Objekt ID der Variable eintragen die beschrieben werden soll.

Der zweite „Fehler“ liegt darin das die Daten anscheinend in einzelnen Zeichen kommen, daher musst Du diese erst in einem Puffer sammeln und kannst diese erst dann auswerten.

Das Skript für die Registervariable muss also anders aussehen


<?php

// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($_IPS['SENDER'] == "RegisterVariable") {
    // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
    $data  = RegVar_GetBuffer($_IPS['INSTANCE']);
    // neu empfangene Daten an $data anhängen
    $data .= $_IPS['VALUE'];

    // wenn das Trennzeichen # in $data gefunden worden ist
    if (strpos($data, '#')) {
        // $data in durch # separierte Datensätze zerlegen
        $datasets = explode('#', $data);
 
        // alle nicht durch # terminierten Datensätze ausgeben
        for ($i = 0; $i < count($datasets) - 1; $i++) {
            echo "empfangener Datensatz: ".$datasets[$i]."
";
            if (strpos($datasets[$i], '*POW*OFF') >= 0)
            {
                SetValue(12345, false); // Objekt ID für die Variable zum Einschalten anpassen
            }
 elseif (strpos($datasets[$i], '*POW*ON') >= 0)
            {
                SetValue(12345, true); // Objekt ID für die Variable zum Einschalten anpassen
            }

        }
 
        // $data auf den Inhalt des letzten (unvollständigen) Datensatzes setzen
        $data = $datasets[count($datasets) - 1];
    }
 
    // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
    RegVar_SetBuffer($_IPS['INSTANCE'], $data);
}


Habe bei mir die Rückmeldung Fonzo geändert so wie von dir unten beschrieben

mein Beamer ist aktuell aus und das bekomme ich zu sehen :

im Debug Registervariable steht das da nach dem SPRT Befehl ausführen:

Im Debug der Schnittstelle:

Timer habe ich auf den Skript von dir gesetzt dieser aktualisiert sich nun alle 5 secunden

DIE Variable vom Dummey aktualiert sich nicht trotz wenn ich den Befehl gebe den Status zu prüfen das gerät ist aus bekomme aber den wert An ausgegeben …

sorry etwas glimpflich ausgedruckt der Zeitstempel aktualisiert sich aber der Status ist falsch