Variable als Puffer?

Ich habe etwas gelesen, daß man keine Variablen als Puffer hernehmen soll…
Ich verstehe nicht ganz :frowning:
Was soll ich meiden?

da solltest Du schon den Kontext einer solchen Aussage mitliefern. Ich kann mir unter einer solchen, alleinstehenden Aussage überhaupt nichts vorstellen.

Sieht nach Register-Variable aus:
RegisterVariable: IP-Symcon :: Automatisierungssoftware

Gruß
Bruno

Hi Bruno,

hört sich plausibel an :wink: jetzt müssten wir nur noch wissen, was genau er vor hat.

Hallo
Ja ich meine diesen text bei der Register Variable.
Ich habe nichts vor, ich versuche nur das zu meiden.
Jedoch versteh ich nicht was es heissen soll eine Variable als puffer zu nehmen.
Irgendwie scheitert es an dem Begriff Puffer

Ich denke, das bezieht sich auf den Text darüber:

Es gibt Datenquellen, bei denen erst mehrere empfangende Datensendungen eine sinnvolle Auswertung ermöglichen. Daher müssen die empfangenen Daten zwischengespeichert werden. Da Probleme auftreten können, wenn man binäre Daten in einer normalen String-Variable in IP-Symcon speichert (defekte IP-Symcon-Konfiguration), gibt es die Funktion RegVar_SetBuffer(integer $InstanzID, string $Puffer), der Daten im einen zur RegisterVariable-Instanz gehörigen Puffer speichert. Die im Puffer gespeicherten Daten lassen sich mit der Funktion RegVar_GetBuffer(integer $InstanzID) auslesen. Mit der Funktion RegVar_SendText(integer $InstanzID, string $Text) lassen sich Datenstrings über die Kommunikationsschnittstelle senden. Intern wird hierbei die passende Sendefunktion, wie z.B. COMPort_SendText, ausgeführt.

solange Du die Register-Variable nicht verwendest kommst Du mit dem „Problem“ gar nicht in Berührung. Da Du gar nichts vor hast… hat sich die Farge damit eigentlich beantwortet;)

Hallo
Danke dafür. Ich habe nur eine Registervariable um Rückmeldungen des Verstärkers anzuzeigen. Ich schreibe in die Register Variable gar nichts, sondern lese sie nur aus. Somit brauche ich mir darüber keine Gedanken zu machen.

das kann aber nicht sein: mit einer RegVar kann man zwar auslesen, aber nichts anzeigen…

Natürlich meinte ich nur auslesen. Ich übergebe den wert dann an eine normale variable, welche mir dann den wert anzeigt.
Action Script meiner Register Variable:

$newsdata = $IPS_VALUE;
$A = (hexdec($newsdata));
SetValue (ID, $A-9807); // der Wert wird in eine normale Integer variable übergeben

ok, jetzt wird es rund :wink:

auch damit kommst Du nicht mit dem Thema „Puffer“ in Konflikt. Die Doku meint damit, dass man keinesfalls binäre (Teil-)Werte aus der RegVar in eine richtige Var schreiben soll (weil man diese evtl. hinterher zusammenfügen will), da man sich damit ggf. die IPS-Konfig zerschießt.

Hallo
Danke für die erklärung. Ich habe IP-Symcon nun ca 1 jahr. Ich bin als absoluter Laie in Thema Programmieren und Automatisierung hier eingestiegen. Als ich das Programm das erste mal gesehen hab dachte ich mir, das wird gar nix. Doch mit hilfe der absolut Genialen Modulreferenz und durch dieses Hammer Forum habe ich das meiste so weit geschafft, daß ich schon etwas (sehr) Stolz auf meine Automatisierung bin.
Als noch einmal ein herzliches Danke für euere Hilfe

ich auch :wink:

ich auch, deshalb meine Antworten nicht überbewerten :wink:

Als Ergänzung:

Ich fand das Handling mit den Puffervariablen im Skript recht unübersichtlich und es war auch recht fehleranfällig.

Ich nutze dafür jetzt ein Cutter Modul (Splitter Instanz zwischen Port und Registervariable). Das Modul kann über 2 Strings die Meldungen passend zuschneiden und an ein Skript weitergeben. :slight_smile:

Grüße, Benjamin

Hallo Benjamin,

Ich fand das Handling mit den Puffervariablen im Skript recht unübersichtlich und es war auch recht fehleranfällig.
was meinst Du damit, im Beispiel Script. Das ist der interne Buffer der Registervariable und hat nichts mit externen Variablen zutun.

Einen Cutter, kann man nicht immer gebrauchen und dafür ist der Buffer gedacht. Funktioniert bei mir seit Jahren problemlos sowie Set und Get. Zumal dieser immer vorhanden ist.

Hallo Rainer,

ich hatte versucht Antworten zu UPNP Subscriptions per Skript zu parsen und entsprechend ggf. wieder in den Buffer zurückzuschreiben, bis eine komplette und gültige Antwort vorliegt. Ich hatte dazu regexe benutzt und vielleicht auch auf Grund von Fehlern darin immer wieder Probleme, dass die Erkennung und Stückelung in einzelne Nachrichten nicht zuverlässig war.

Jetzt habe ich einen Cutter dafür angelegt und werte diese Daten fertig geschnitten im Skript aus, dadurch spare ich mir Quellcode und es ist auch performanter (sowie die Fehler beim Schneiden sind weg).

Vorher: http://www.ip-symcon.de/forum/f52/php-parsen-bzw-alternative-split-join-split-16016/#post138200

Grüße, Benjamin

Kannst Du Deinen Ansatz, UPNP mitzuhören mal darstellen hier?

Ich habe darn großes Interesse und ich denke, dass das für einige User in Zukunft mehr und mehr interessant werden kann.

Danke im Voraus!
jwka

Hallo Jwka,
ich habe mir die Intel Dev Tools für UPNP downgeloadet. Dort kannst Du z.B. über den Device Spy auf die Geräte gehen und dir die entsprechenden Urls raussuchen an die Du Deinen Subcribe senden musst:

	function SubscribeMRAVTransport($callback){ // added br
$content='SUBSCRIBE /MediaRenderer/AVTransport/Event HTTP/1.1
HOST: '.$this->address.':1400
CALLBACK: <'.$callback.'>
NT: upnp:event
TIMEOUT: Second-300
Content-Length: 0

';
$this->sendPacket($content);
}

Als Callback übergebe ich oben den HTTP Pfad zu meinem IPS Server Socket mit dem Cutter (z.b. http://myips:7788). Das UPNP Gerät verbindet sich daraufhin aktiv mit meinem Serversocket und liefert dort die Events ab.
Über den Cutter starte ich dann z.B. dieses Skript:

<?
require ("functions.inc.php");

$notify=$IPS_VALUE;
$notify = substr($notify, stripos($notify, '<'));
$notify = substr($notify, 0, strrpos($notify, '>') + 4);
$notify = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $notify);
$notify = str_replace(array("<", ">", """, "&", "%3a", "%2f", "%25"), array("<", ">", "\"", "&", ":", "/", "%"), $notify);


// Nextsong
$suchen = preg_match('/(.+)<item id="-1" parentID="-1" restricted="true">(.*?)<\/item><\/DIDL-Lite>(.+)"\/><r:EnqueuedTransportURI/is', $notify,$gefundenes_wort);
$ergebnis = '<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/">'.$gefundenes_wort[2].'</DIDL-Lite>';



   
            $xml = new SimpleXMLElement($ergebnis);
            $title = $xml->xpath("dc:title");
            $cover = $xml->xpath("upnp:albumArtURI");
            $album = $xml->xpath("upnp:album");
            $artist = $xml->xpath("dc:creator");
            $file = $xml->res;
            
            $nextsong['title'] = (string)$title[0];
         //   $nextsong['albumArtURI'] = "http://".$_SESSION[$aktuell]['IP'].":1400".(string)$cover[0];
            $nextsong['artist'] = (string)$artist[0];
            $nextsong['album'] = (string)$album[0];
            $nextsong['file'] = (string)$file;
 print_r($nextsong);

?>

Grüße, Benjamin

Hi bengie,

die UPNP Tools habe ich auch. War jetzt Interessiert, wie Du das Monitoring machst und dachte, man könnte/müsste den gesamten UPNP Verkehr monitoren.

Dass man jedes Gerät subscriben muss, soweit bin ich durch die Spec noch nicht durch.

Grübel.

Noch ein paar Fragen:

Wie hast Du den Cutter eingestellt (was cuttest Du)?

Wie machst Du das bei mehreren Geräten? Ich hab 5 UPNP Mediastreamer und da kommen wohl noch ein paar dazu?

Wie kriegst Du mit, wenn ein Gerät eingschaltet wird (das vorher aus war --> Advertisement Message, geht die nicht per UDP??)?

Controls an das Gerät setzt Du dann wie die Subscription ab, nehme ich an?

Danke
jwka

Hi,
zum Cutter:

Ja, Du musst jedes Gerät subscriben von dem Du aktiv eine Info erhalten willst. Das Discovery geht auch per SDDI (ich meine UDP) das fand ich aber für PHP und IPS recht unpraktikabel und Subcribe direkt über eine feste IP bzw. sende die Kontrollkommandos an diese (ich kriege also nicht direkt mit, wann ein Gerät angeschaltet ist; meine SOnos sind allerdings immer an). Für die Kontrolle / das Auslesen kannst Du Dir die PHPSonos Klasse als Beispiel nehmen oder auch die Fritzbox Skripte. Wenn Du die Kommandos nicht aus den Dokumentationen entwickeln kannst, hilft es die Originalkommandos z.B. des DeviceSpy mitzusniffen.

[Edit:Fiddler und Firebug sind noch ganz hilfreich; viele Geräte kann man auch mit dem in PHP eingebauten soapclient ansprechen]

Ich hoffe ich konnte Deine Fragen beantworten?
Grüße, Benjamin

Beispiel einer empfangenen Meldung:

10.01.2012 19:35:43.00 |        Received Data | 
HOST: 192.168.0.5:6666
CONTENT-TYPE: text/xml
CONTENT-LENGTH: 6760
NT: upnp:event
NTS: upnp:propchange
SID: uuid:RINCON_000E5832FB5C01400_sub0000017285
SEQ: 0

<e:propertyset xmlns:e="urn:schemas-upnp-org:event-1-0"><e:property><LastChange><Event xmlns="urn:schemas-upnp-org:metadata-1-0/AVT/" xmlns:r="urn:schemas-rinconnetworks-com:metadata-1-0/"><InstanceID val="0"><TransportState val="PLAYING"/><CurrentPlayMode val="NORMAL"/><CurrentCrossfadeMode val="0"/><NumberOfTracks val="15"/><CurrentTrack val="14"/><CurrentSection val="0"/><CurrentTrackURI val="x-file-cifs://starter/music/Interpret/Mark%20Knopfler/2006%20-%20All%20the%20Road%20Running/Emmylou%20Harris%20And%20Mark%20Knopfler%20-%2014%20-%20This%20Is%20Us%20-%20Live.mp3"/><CurrentTrackDuration val="0:05:20"/><CurrentTrackMetaData val="&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;-1&quot; parentID=&quot;-1&quot; restricted=&quot;true&quot;&gt;&lt;res protocolInfo=&quot;x-file-cifs:*:audio/mpeg:*&quot; duration=&quot;0:05:20&quot;&gt;x-file-cifs://starter/music/Interpret/Mark%20Knopfler/2006%20-%20All%20the%20Road%20Running/Emmylou%20Harris%20And%20Mark%20Knopfler%20-%2014%20-%20This%20Is%20Us%20-%20Live.mp3&lt;/res&gt;&lt;r:streamContent&gt;&lt;/r:streamContent&gt;&lt;r:radioShowMd&gt;&lt;/r:radioShowMd&gt;&lt;upnp:albumArtURI&gt;/getaa?u=x-file-cifs%3a%2f%2fstarter%2fmusic%2fInterpret%2fMark%2520Knopfler%2f2006%2520-%2520All%2520the%2520Road%2520Running%2fEmmylou%2520Harris%2520And%2520Mark%2520Knopfler%2520-%252014%2520-%2520This%2520Is%2520Us%2520-%2520Live.mp3&amp;amp;v=412&lt;/upnp:albumArtURI&gt;&lt;dc:title&gt;This Is Us - Live&lt;/dc:title&gt;&lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt;&lt;dc:creator&gt;Emmylou Harris And Mark Knopfler&lt;/dc:creator&gt;&lt;upnp:album&gt;All The Road Running&lt;/upnp:album&gt;&lt;upnp:originalTrackNumber&gt;14&lt;/upnp:originalTrackNumber&gt;&lt;r:albumArtist&gt;Emmylou Harris And Mark Knopfler&lt;/r:albumArtist&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;"/><r:NextTrackURI val="x-file-cifs://starter/music/Interpret/Mark%20Knopfler/2006%20-%20All%20the%20Road%20Running/Emmylou%20Harris%20And%20Mark%20Knopfler%20-%2015%20-%20If%20This%20Is%20Goodbye%20-%20Live.mp3"/><r:NextTrackMetaData val="&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;-1&quot; parentID=&quot;-1&quot; restricted=&quot;true&quot;&gt;&lt;res protocolInfo=&quot;x-file-cifs:*:audio/mpeg:*&quot; duration=&quot;0:04:55&quot;&gt;x-file-cifs://starter/music/Interpret/Mark%20Knopfler/2006%20-%20All%20the%20Road%20Running/Emmylou%20Harris%20And%20Mark%20Knopfler%20-%2015%20-%20If%20This%20Is%20Goodbye%20-%20Live.mp3&lt;/res&gt;&lt;upnp:albumArtURI&gt;/getaa?u=x-file-cifs%3a%2f%2fstarter%2fmusic%2fInterpret%2fMark%2520Knopfler%2f2006%2520-%2520All%2520the%2520Road%2520Running%2fEmmylou%2520Harris%2520And%2520Mark%2520Knopfler%2520-%252015%2520-%2520If%2520This%2520Is%2520Goodbye%2520-%2520Live.mp3&amp;amp;v=412&lt;/upnp:albumArtURI&gt;&lt;dc:title&gt;If This Is Goodbye - Live&lt;/dc:title&gt;&lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt;&lt;dc:creator&gt;Emmylou Harris And Mark Knopfler&lt;/dc:creator&gt;&lt;upnp:album&gt;All The Road Running&lt;/upnp:album&gt;&lt;upnp:originalTrackNumber&gt;15&lt;/upnp:originalTrackNumber&gt;&lt;r:albumArtist&gt;Emmylou Harris And Mark Knopfler&lt;/r:albumArtist&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;"/><r:EnqueuedTransportURI val="x-rincon-playlist:RINCON_000E58250B9C01400#A:ALBUMARTIST/Emmylou%20Harris%20And%20Mark%20Knopfler/All%20The%20Road%20Running"/><r:EnqueuedTransportURIMetaData val="&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:r=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;&lt;item id=&quot;A:ALBUMARTIST/Emmylou%20Harris%20And%20Mark%20Knopfler/All%20The%20Road%20Running&quot; parentID=&quot;A:ALBUMARTIST/Emmylou%20Harris%20And%20Mark%20Knopfler&quot; restricted=&quot;true&quot;&gt;&lt;dc:title&gt;All The Road Running&lt;/dc:title&gt;&lt;upnp:class&gt;object.container.album.musicAlbum&lt;/upnp:class&gt;&lt;desc id=&quot;cdudn&quot; nameSpace=&quot;urn:schemas-rinconnetworks-com:metadata-1-0/&quot;&gt;RINCON_AssociatedZPUDN&lt;/desc&gt;&lt;/item&gt;&lt;/DIDL-Lite&gt;"/><PlaybackStorageMedium val="NETWORK"/><AVTransportURI val="x-rincon-queue:RINCON_000E5832FB5C01400#0"/><AVTransportURIMetaData val=""/><CurrentTransportActions val="Play, Stop, Pause, Seek, Next, Previous"/><TransportStatus val="OK"/><r:SleepTimerGeneration val="0"/><r:AlarmRunning val="0"/><r:SnoozeRunning val="0"/><r:RestartPending val="0"/><TransportPlaySpeed val="NOT_IMPLEMENTED"/><CurrentMediaDuration val="NOT_IMPLEMENTED"/><RecordStorageMedium val="NOT_IMPLEMENTED"/><PossiblePlaybackStorageMedia val="NONE, NETWORK"/><PossibleRecordStorageMedia val="NOT_IMPLEMENTED"/><RecordMediumWriteStatus val="NOT_IMPLEMENTED"/><CurrentRecordQualityMode val="NOT_IMPLEMENTED"/><PossibleRecordQualityModes val="NOT_IMPLEMENTED"/><NextAVTransportURI val="NOT_IMPLEMENTED"/><NextAVTransportURIMetaData val="NOT_IMPLEMENTED"/></InstanceID></Event></LastChange></e:property>


sonoscutter.png

Erstmal ja, danke.

Bin gerade im Ausland, wenn ich zurück bin (Ende April) geht’s an der UPNP Baustelle wohl weiter. Wenn ich dann Fragen hab, melde ich mich. Das war ja ohnehin eher Off Topic hier.

Thx.
jwka