PHP Script static variable

Hallo zusammen

ich filtere mit einem Script einen TCP Stream, dabei kommen die Werte wie folgt.

*ZINFO,ZON4,PWRON,SRC5,VOL34,MUTOFF<CR>
*ZINFO,ZON1,PWRON,SRC1,VOL17,MUTOFF<CR>

Sind alle aufgesplittet in die einzelnen Segmente nur wird mir beim Scriptduchlauf z.B. der Wert VOL von ZON4 auf 0 gesetzt sobald der Wert VOL von ZON1 auf 17 gesetzt wird.

Sobald ich $VOL_ZON4 = $VOL; in static $VOL_ZON4 = $VOL; ändere ist es eine ungültige Funktion.

Was verwendet ihr anstatt von static um die Werte erst bei aktivem Beschreiben zu ändern und nicht beim Scriptdurchlauf?

Danke für die Hilfe

Gruss Remo

Ich nehme mal an Du nutzt einen Clientsocket mit einer Registervariable und einem Skript.
Wie sieht das Skript das Du verwendest denn konkret aus?

Normalerweise bekommst Du ja über den Clientsocket kontinuierlich Daten die Du im Skript der Registervariable verarbeitest oder bei einem PHP Modul im Splitter. Letztlich must Du wissen was Du eigentlich von den Daten, die das Gerät überträgt, in IP-Symcon nutzten willst um diese zu visualisieren oder damit das Gerät zu schalten. Für die Daten, die Du nutzten willst, legst Du in IP-Symcon eine passende Variable mit entsprechendem Variablenprofil an. Dein Skript bekommt kontinuierlich Daten, in dem Skript kannst Du die aktuellen Daten des Geräts mit den Daten in IP-Symcon vergleichen, einen Wert neu in eine IP-Symcon Varibale schreiben musst Du nur wenn sich die Daten in IP-Symcon von den Daten, die das Gerät aktuell sendet unterscheiden.
Aber man kann Dir besser weiterhelfen wenn Du das Skript oder teile des Skripts der Registervariable postest bzw. wenn Du auch verräts um was für ein Gerät es sich genau handelt. Eventuell gibt es ja auch schon etwas um das Gerät auszulesen und zu steuern.

Danke hat zumindest wieder einen anderen Denkansatz gegeben.

 $data=$_IPS['VALUE'];
 SetValueString(35697,$data);
 $Info = between('*', ',', $data );

 //String Positionenauswerten
 $strlen = strlen($data) -1;                                                    // korrektur der Stringlänge  -1 für richtiges Resultat

 // Zone Info
 if ($Info == 'ZINFO')
 {
    // PWR Filter
    $strPWRend = strpos($data, ",SRC")-1;                                         // StringEnde PWRON, oder PWROFF, - das ,
    $strPWRminus = - ($strlen - $strPWRend);                                       // ergibt die Subtraktion vom String um hinter OFF oder ON zu landen
    $PWR = substr($data, strpos($data, "PWR")+3, $strPWRminus);                        //-19 nicht wie berechnet -22 korrigiert in $strlen

    // Zone Filter
    $strZONend = strpos($data, ",PWR")-1;
    $strZONminus = - ($strlen - $strZONend); 
    $ZON = substr($data, strpos($data,"ZON")+3, $strZONminus);
    
    // Source Filter
    $strSRCend = strpos($data, ",VOL")-1;
    $strSRCminus = - ($strlen - $strSRCend); 
    $SRC = substr($data, strpos($data,"SRC")+3, $strSRCminus);

    // Volume Filter
    $strVOLend = strpos($data, ",MUT")-1;
    $strVOLminus = - ($strlen - $strVOLend); 
    $VOL = substr($data, strpos($data,"VOL")+3, $strVOLminus);

    // Mute Filter
    $MUT = substr($data, strpos($data, "MUT")+3, -1 );

    // Zonen

    switch($ZON)
    {
        case 1: 
        $PWRz1 = $PWR;
        $SRCz1 = $SRC;
        $VOLz1 = $VOL;
        $MUTz1 = $MUT;
        break;

        case 2:
        $PWRz2 = $PWR;
        $SRCz2 = $SRC;
        $VOLz2 = $VOL;
        $MUTz2 = $MUT;
        break;
        case 3:
        $PWRz3 = $PWR;
        $SRCz3 = $SRC;
        $VOLz3 = $VOL;
        $MUTz3 = $MUT;
        break;
        case 4:
        $PWRz4 = $PWR; 
        $SRCz4 = $SRC;
        $VOLz4 = $VOL;
        $MUTz4 = $MUT;
        break;
        case 5:
        $PWRz5 = $PWR;
        $SRCz5 = $SRC;
        $VOLz5 = $VOL;
        $MUTz5 = $MUT;
        break;
        case 6:
        $PWRz6 = $PWR;
        $SRCz6 = $SRC;
        $VOLz6 = $VOL;
        $MUTz6 = $MUT;
        break;
    }
    

    // STRING Ausgabe
    SetValueString(46038, $Info);
    SetValueInteger(44720, $ZON);
    SetValueString(51301, $PWRz4);
    SetValueInteger(52658, $SRCz4);
    SetValueInteger(58538, $VOLz4);
    SetValueString(11825, $MUTz4);

    SetValueInteger(44415, $VOLz1);

Ich möchte mein Multiroomsystem auslesen bzw steuern. Glaube kaum das dies schon jemand gemacht hat, kommt aus den USA, z.m. hab ich nichts im Forum und bei Tante Google gefunden. Name ist CASATUNES. Loxone hat das ursprünglich vertrieben, es aber dann mit eigenem Code zum Loxone Musikserver umgeschrieben. Ich nutze noch die Originale Version.

Bin mir nicht sicher ob das nur mit vergleichen getan ist. da ja bei jeder änderung in irgend einer Zone, ob VOL, Source, ON/OFF oder Mute ein string per Clientsocket kommt. Dabei fehlen jedoch die Werte der anderen Zonen, da nur die gesendet wird in der etwas geändert wurde.

was ich nicht verstehe warum er im switch die anderen Werte totzdem übergiebt obwohl z.B ZON = 1 angesprochen wird.

Ich nehme mal an Du nutzt einen Clientsocket mit einer Registervariable und einem Skript.

genau so mach ich es, wird jedoch bislang alles im Script verarbeitet und nicht im Splitter, evtl gibt es da eine Lösung?

Danke

Manchmal sieht man vor lauter CODE den Wald nicht mehr :banghead:

SetValueInteger(58538, $VOLz4);

in den case und gut ist :stuck_out_tongue:

$data sind ja die Rohdaten, die würde ich persönlich nicht in eine Variable ablegen, die müssen ja erst mal verarbeitet werden. Wenn man diese zum debugen sehen will kann man IPS_LogMessage nutzten oder bei einem Modul SendDebug.

Was Du genau bekommst ist ja egal. Du zerlegst die Rohdaten und bekommst dann Werte. Du weist dann ja ob Du z.B. einen Wert für Vol oder eine Zone oder sonst irgendwas erhalten hast. Im unteren Teil schreibst Du die Werte in IP-Symcon, das kannst Du ja einfach an eine if Bedingung knüpfen. Grundsätzlich sind alle Werte die Du erwartest erst mal leer. Wenn ein Wert also leer ist und Du das mit eine if Abfrage prüfst vor dem schreiben, wird auch nichts in IP-Symcon in einer Varibale abgespeichert. Zusätzlich kannst Du in einer Abfrage auch noch zunächst per Getvalue den aktuellen Wert in IP-Symcon auslesen und nur dann wirklich den Wert schreiben wenn dieser von dem aktuellen Wert abweicht. Wenn der Wert nicht übermittelt wurde hast Du diesen auch nicht aus den Rohdaten extrahiert, dementsprechend bleibt der Wert leer und wird auch nicht geschrieben.

Ohne das Skript jetzt im Detail durchgelesen oder verstanden zu haben Du bekommst Rohdaten aus denen schneidest Du die Informationen aus die Du haben willst.
Jetzt definierst Du zunächst alle Werte die Du eventuell in IP-Symcon abspeichern willst und setzt diese zunächst auf leer


$Vol = NULL;

jetzt liest Du wie auch immer im Detail die Rohdaten aus. Sollte darin ein Wert für Vol enthalten sein bekommt $Vol einen neuen Wert ansonsten eben nicht.
Am Ende des Skripts prüfst Du ob Du einen Wert erhalten hast


if(!is_null($Vol))
{
SetValue(12345, $Vol);
}

dann legst Du auch nur dann etwas ab wenn ein Wert übergeben wurde.

Das ist ja völlig ok wenn das in Skript abgearbeitet wird. Ein PHP Modul bzw. ein Splitter eines PHP Modul macht im Prinzip auch nichts viel anderes als Dein Skript nur ist das Modul die Hülle bzw. es lässt sich dann einfacher einrichten auch für andere Nutzer.
Daher ist es erst mal wichtig das die Werte die Du haben willst sauber ausgelesen werden. Wenn das dann funktioniert kann man in einem nächsten Schritt immer noch von einem reinen Skript auf ein PHP Modul umstellen. Letztlich kannst Du das, was Du Dir jetzt als Skript zusammen schreibst, dann später in einen Splitter übernehmen. Der Splitter ist aber auch nur eine Hülle und macht auch nur das was Du im anhand von Code anweist.