Nachfrage zu Newbie Register Variablen

hallo zusammen,
erst mal noch ein Lob für jwka. Die Anleitung http://www.ip-symcon.de/forum/f52/newbie-fuer-newbies-register-variablen-10754/ funktioniert so weit ohne Fehler. Und ich glaube auch halbwegs die Abäufe verstanden zu haben. Die Zunkunft wirds zeigen.

Leider hab ich bis jetzt trotz Studium vieler Beiträge und Versuchen nicht herausgefunden wie ich die ermittelten Daten dann über irgend ein „Modul/Variable“ im Webconfigurator anzeigen lassen kann. Was muss ich dazu noch alles anlegen und wie verknüpfen?

Weiter hat mir die Ausgabe des Debugfensters jede, erst mal manuelle, ausführung des SendScripts angezeigt. Jetzt nicht mehr. Wie kann ich das wieder herstellen?

  • plötzlich (am nächsten Tag) gehts wieder. Ursache?
  • plötzlich (2h später) gehts wieder nicht. Ursache?

Weiter hats mir in der Anzeige des Debugfensters gezeigt, dass der neue Wert immer an den alten angehängt wird. Ist das so ok? Oder muss ich den Buffer vor erneutem senden erst mal leeren? Wenn ja wie? Im Script einfach

$data = "";

? Hat nicht funktioniert. Wieder auskommentiert und gespeichert.

  • plötzlich (am nächsten Tag) werden die werte nicht mehr angehängt. Ursache?

Ein neues Thema weil ich die Anleitung von jwka nicht mit meinen Fragen unnötig in die Länge ziehen wollte.

vielen Dank für Eure Antworten,

Hallo Wolfgang,

die Auswertung der Registervariable, kannst Du nicht verallgemeinern. Das Script dafür muss an deine Bedürfnisse und die Hardware welche die Daten sendet angepasst werden.

Wenn Du Daten im Webfront anzeigen willst, musst Du die Daten in Variablen schreiben und anzeigen.

Falls Du uns verräts, was Du machen willst, kann dir auch eventuell geholfen werden. :wink:

Hallo Rainer,
aktuell habe ich kein konkretes Projekt. Ich versuche nur an Hand von Doku und Forum verschiedene Beispiele nachzuvollziehen. Rein zu Lern und Verständniszwecken.
Im aktuellen Fall will ich nur den String der im Beispiel von jwka in die Registervariable geschrieben wird im Webfont anzeigen.

Sorry, hab Deine Antwort nicht auf Anhieb verstanden.
Versuch einer präzieseren Frage:
Wie schreibe ich die Daten im Script in eine Variable?

Danke und

Hallo Rainer,
habs hin bekommen indem ich im EmpfangsScript folgende Zeilen angefügt habe:

$IPS_VARIABLE = 21082 /*[TestRegVar_Server Socket Tutorial\TestRegVarTutorialAusgabe]*/;
$IPS_VALUE = $data;
SetValue($IPS_VARIABLE, $IPS_VALUE);

Ist das der Richtige Weg oder gibt es einen anderen, für Folgeaufgaben sinnvolleren Weg?

Leider habe ich nun wieder das bereits zuvor beschriebene Phänomen, dass sich die Daten im Buffer aneinanderreihen, und sich so auch in die Variable schreiben, statt sich zu aktualisieren. wie kann ich den Buffer vor aktualisierung löschen? Oder noch besser, erklär mir wie ich den Buffer steuern kann. Aktualisieren oder anreihen?

Danke für deine Hilfen

Daten im Buffer, kannst Du so löschen.

RegVar_SetBuffer($_IPS['INSTANCE'], ""); 

Oder noch besser, erklär mir wie ich den Buffer steuern kann. Aktualisieren oder anreihen?

Das kommt, wie oben schon geschrieben auf deine Gegebenheiten an.

Daten anhängen kannst Du mit .=$daten

Wenn deine Daten vollständig sind, löschst Du den Buffer mit obigen Befehl.

Aufteilen in Variablen, kann man z.B. über ein Array oder auch den Inhalt über stringbefehle teilen.

Beispiel in array aufteilen. Wenn die Daten, komma getrennt sind.

$data = explode(",", $_IPS['VALUE']);
SetValue(12345, $data[0]);
SetValue(23456, $data[1]);
//usw...

jenachdem wieviele Blöcke dann vorhanden sind.

Daten über einen String zerlegen.

if($_IPS['SENDER'] == "RegisterVariable")
{
    $mac = strstr(urldecode($_IPS['VALUE']), " ", true);
    $value = trim(stristr(urldecode($_IPS['VALUE']), " "));
    if(strpos($value, "playlist newsong") !== false)
   {
      $befehl = substr($value, 0, 16);
      $play = substr(utf8_decode($value), 16);
      if(strrpos($play, "0") !== false)
      {
         $sender = substr($play, 0, -1);
         if($mac == $wohnzimmer) SetValue(25596 /*[Squezzeboxen\Wohnzimmer\Sender]*/, $sender." # ");
         if($mac == $buero) SetValue(57152 /*[Squezzeboxen\Büro\Sender]*/, $sender." # ");
      }

Das ist nur ein Ausschnitt.

Wenn es dich weiter interessiert, schreib ich dir mal was zusammen, womit Du selber testen kannst.

Hier ist noch mal ein Ausschnitt mit Auslesen, Rückschreiben und leeren des Buffers.

if($IPS_SENDER  == "RegisterVariable") 
{
   $parentID = 0;
   $CatID = IPS_GetCategoryIDByName("ELV Bussystem HS485", $parentID );
   $CatModuleID = IPS_GetCategoryIDByName("Module", $CatID); // prüfen ob KategorieID Module exsistiert
   $CatLinkID = IPS_GetCategoryIDByName("HS485 Linkvariablen", $CatID);
   
    // Steuerzeichen definieren
    define ("FD", "\xFD"); // Startzeichen
    define ("FE", "\xFE");
    define ("FC", "\xFC"); // ESCAPE-Zeichen
    
    $startzeichengefunden = false;
    $frameAktiv = false;
     $CRC16 = 1;
     $daten = "";
     $newFrame = "";
     
    $datenFrame = RegVar_GetBuffer($IPS_INSTANCE); // Buffer Registervariable auslesen
     $datenFrame .= $IPS_VALUE;
     $lastFrame = strpos($datenFrame, FD, 1);
     if(strlen($datenFrame) && $lastFrame)
    {
       $frameAktiv = true;
       $newFrame = substr(strrchr($datenFrame, FD), 0);
        $datenFrame = substr($datenFrame, 0, $lastFrame);
        if($newFrame == $datenFrame) $newFrame = "";
    }
     //print_r(Str2Hex($datenFrame));
 
     for($i=0; $i<strlen($datenFrame) && $CRC16 != 0; $i++)
     {
          $chr = $datenFrame[$i]; // Zeichen einlesen
          if(!$startzeichengefunden) // STARTZEICHEN schon gefunden?
          {
           if($chr == FD) // nein, daher suchen nach STARTZEICHEN
           {
               $startzeichengefunden = true; // STARTZEICHEN gefunden
                $daten = $chr;
           }
           continue; // STARTZEICHEN immer noch nicht gefunden
        }
          if($chr == FC) // falls ESCAPE gefunden wurde
          {
            $i++;  // ESCAPE verwerfen
           $chr = @chr(ord($datenFrame[$i]) | 0x80); // und nachfolgendes Zeichen korrigieren
          }
        $daten .= $chr; // ab hier Checksumme suchen
          $CRC16 = CRC16($daten);
     }
    if($CRC16 != 0)
    {
       RegVar_SetBuffer($IPS_INSTANCE, $daten); // keine gültigen Daten empfangen, daher in Buffer schreiben
       if(strlen($daten) > 18) // wenn Buffer größer .. löschen
        {
           RegVar_SetBuffer($IPS_INSTANCE, "");
        }
       return;
    }
    else
    {
        RegVar_SetBuffer($IPS_INSTANCE, ""); // Daten gültig, Buffer kann gelöscht werden
        if($frameAktiv) RegVar_SetBuffer($IPS_INSTANCE, $newFrame);
    }

Hallo Rainer,
vielen Dank für Deine ausführliche Hilfe und Dein Angebot.
Werde erst mal vesuchen damit was anzufangen.
Dein Angebot mir was zu schreiben womit ich dann testen kann nehme ich gerne an.

Wenn ich den Befehl RegVar_SetBuffer($RegVarID, „“); wie u.g. in Zeile 7 einfüge wird der Buffer leider nicht gelöscht.

<?

$RegVarID = $IPS_INSTANCE;
$newdata = $IPS_VALUE;

// fetch data in buffer
//RegVar_SetBuffer($RegVarID, ""); // soll lt rwn den buffer löschen. Funzt an dieser Stelle aber nicht. Daher wieder auskommentiert. ?
$data = RegVar_GetBuffer ( $RegVarID );

// add received data
$data = $newdata; //mit einem Punkt vor dem = werden die Daten an den Buffer angefügt. Ohne Punkt überschrieben.

// wrte back data to variable for use in other scripts
RegVar_SetBuffer($RegVarID, $data);

IPS_LogMessage( "EmpfangsTest" , $newdata );

//eigener Code
$IPS_VARIABLE = 21082 /*[TestRegVar_Server Socket Tutorial\TestRegVarTutorialAusgabe]*/;
$IPS_VALUE = $data;
SetValue($IPS_VARIABLE, $IPS_VALUE);

?>

Nur wenn ich den Punkt vor dem = in Zeile 11 entferne werden die Daten überschrieben/aktualisiert. Was ist die Ursache und der Unterschied der Methoden? die ja wie ich das interpretiere das selbe machen.

Gibts die Antworten dazu vielleicht, halbwegs so leicht vertändlich wie Du’s erklärst und findbar schon irgend wo. Hab schon fast ein schlechtes gewissen Dich permanent mit Fragen nach Bassiswissen zu beläsigen.

Vieeelen Dank

Ich hab es dir mal angepasst. Wichtig ist, das Du das Script der Registervariable übergeben hast. Bei Zielscript.

<?


// fetch data in buffer
//RegVar_SetBuffer($IPS_INSTANCE , ""); // soll lt rwn den buffer löschen. Funzt an dieser Stelle aber nicht. Daher wieder auskommentiert. ?
$data = RegVar_GetBuffer ( $IPS_INSTANCE );

// add received data
$data .= $IPS_VALUE; //mit einem Punkt vor dem = werden die Daten an den Buffer angefügt. Ohne Punkt überschrieben.

// wrte back data to variable for use in other scripts
RegVar_SetBuffer($IPS_INSTANCE, $data);

IPS_LogMessage( "EmpfangsTest" , $data );

//eigener Code

SetValue(21082, $data);

?>

Ansonsten hier, sind 2 schöne Beispiele.

RegisterVariable: IP-Symcon :: Automatisierungssoftware

Daten werden zum Schluß gelöscht, am Anfang macht es wenig Sinn. :smiley:

Hallo Rainer,
vielen Dank für Deine Hilfe und Deine Erklärungen. Habe schon einiges davon umgesetzt. In parallel laufenden Themen habe ich auch Code-Schnipsel bekommen und angepasst die dann auch liefen, aber verstanden habe ich sie nicht. Deine erklärungen haben das zumindest teilweise geändert. Werde vorerst mal, neben kleineren Projekten, versuchen mehr über IPS Funktionen herauszubekommen und PHP ein wenig besser zu verstehen.
Nochmals Danke,