Einbindung Multimedia Anlage in IPS (Auslesen vom COM PORT)

Hallo ihr wissenden,

also nun hab ich folgendes: Einige haben vielleicht mitbekommen, ich habe in meinem Haus eine Russound Multiroom anlage. Soweit funktioniert alles Super, läßt sich über Comport_sendtext auch wunderbar steuern! Alle Funktionen in allen Räumen. Aber ich bin damit noch nicht zufrieden, ich möchte natürlich auch Rückmeldungen über welcher Raum an ist, welche Lautstärke und welche Quelle dort an ist. Über das Roussund RNET Protokoll soll das auch funktionieren, ich sende einen Befehl hin (wie ist dein Status), und bekomme über den COM auch eine Antwort. Das alles aber nun in HEX daten. Könnte mir einer mal ein wenig mehr auf die Sprünge helfen, was nun zu tun ist? Wie kann ich das, was die anlage sendet verarbeiten? Es gibt ja dann zich zustände, Raum 1-6 an/aus, Lautstärke 0-100, Quelle 1-6 gewählt (das sind die Info´s die mir reichen)

Hab auch noch mal aus der RNET Beschreibung den Teil angehängt, der relevant sein müsste. Falls ihr noch mehr wissen müsst, in dem Dokument steht noch sehr viel mehr drin :slight_smile:

Get All Zone info
As stated previously, a message can be used to request all of a particular Zone’s parameter values at once. This can be very useful for updating panel displays. The following is an example of how to request Zone information for a particular Zone and what the return message would look like.
7.8.7 Get State
This is the Request message for the parameter values of the selected Zone.

Value F0/cc/00/7F/00/00/70/01/04/02/00/zz/07/00/00/xx/F7

cc = controller number -1
zz = zone number -1
xx = checksum

The return message would look like the following.

Value F0/00/00/70/cc/00/7F/00/00/04/02/00/zz/07/00/00/01/00/0C/00/##/##/##/##/##/##/##/##/##/##/##/00/xx/F7

cc = controller number -1
zz = zone number -1
xx = checksum

The parameter values are depicted in bytes 21 – 31. These values will change depending on the state of the selected Zone. The above example shows the parameter values for a Zone configured and being used as follows:
Byte #21 = Current Zone On/Off state (0x00 = OFF or 0x01 = ON)
Byte #22 = Current Source selected -1
Byte #23 = Current Volume level (0x00 - 0x32, 0x00 = 0 Displayed … 0x32 = 100 Displayed)
Byte #24 = Current Bass level (0x00 = -10 … 0x0A = Flat … 0x14 = +10)
Byte #25 = Current Treble level (0x00 = -10 … 0x0A = Flat … 0x14 = +10)
Byte #26 = Current Loudness (0x00 = OFF, 0x01 = ON )
Byte #27 = Current Balance level (0x00 = More Left … 0x0A = Center … 0x14 = More Right)
Byte #28 = Current System On state (0x00 = All Zones Off, 0x01 = Any Zone is On)
Byte #29 = Current Shared Source (0x00 = Not Shared 0x01 = Shared with another Zone)
Byte #30 = Current Party Mode state (0x00 = OFF, 0x01 = ON, 0x02 = Master)*
Byte #31 = Current Do Not Disturb state (0x00 = OFF, 0x01 = ON )*

*NOTE: Unsupported Features, information not available for CAS44 and CAA66 controllers

Hier nochmal eine Abfrage für den Status der Zone, EIN ODER AUS:

7.1.2 Get State
This is the Request message for the On/Off State of the selected Zone.
Value F0 cc 00 7F 00 00 70 01 04 02 00 zz 06 00 00 xx F7
cc = controller number -1
zz = zone number -1
xx = checksum

The return message would look like the following.

Value F0 00 00 70 cc 00 7F 00 00 04 02 00 zz 06 00 00 01 00 01 00 ## xx F7
cc = controller number -1
zz = zone number -1
xx = checksum
Byte #21 = 0x00 (off) or 0x01(on)

Zur Checksum, die muss man aus der gesamtsumme der BYTES mit einer Formel ausrechnen, damit die Meldung auch vom Controller angenommen wird

Vielen DANK, ich hoffe einer von euch kann mir helfen

Gruß
Benny

Hallo Benny,

wie sind denn Deine PHP Kenntnisse? Klar kann man Dir jetzt das ganze Protokoll implementieren, aber das ist eigentlich nicht Sache des Forums, das musst Du entweder selbst machen oder es hat schon jemand gemacht. Das ist nicht mal in fuenf Minuten programmiert, wenn man es richtig machen moechte. Da steckt schon einiges an Aufwand dahinter. Suche einfach mal im Forum, Du wirst da schon einige Ansaetze dazu finden, bspw. unter den Begriffen DENON und ONKYO und ich glaube auch Beamer.

Das das nicht so mal eben geht war mir klar, aber vielleicht kann mir jemand die Schritte zeigen die notwendig sein müssten, etc. Mein PHP ist noch nicht so gut, aber so eine Aufgabe wird das ganze sicherlich verbessern, wenn ich nicht dran verzweifel…

DAnke

Steht in der Anleitung wie die Checksumme berechnet wird? Das wäre noch nötig.

Gruß

Berechnung der Checksum

4.3.1 Checksum
All messages include a Checksum that helps protect the integrity of the message. The
Checksum is a single byte that can be calculated using the following formula (see example
below):
Checksum Calculation Example:
Value (Hex)

F0 Start of Message Character
00
67
7C
F1
0F
59 Checksum
F7 End of Message Character

Step #1 - Add the HEX value of every byte in the message that precedes the Checksum:
Example - 0xF0 + 0x00 + 0x67 + 0x7C + 0xF1 + 0x0F = 0x02D3

Step #2 - Count the number of bytes which precede the Checksum and convert that value from
DEC to HEX (byte count). Add the byte count in HEX to the previously calculated sum of
bytes:
Example - 0x02D3 + 6 (6 = Decimal value byte count) = 0x02D9

Step #3 - This value is then AND-ed with the HEX value 0x007F (7F is the highest BIN value
for 7 bits = 1111111). The Checksum itself and the End of Message Character are not
included in the calculation. Only the low 7 bits are used so overflow is discarded:
Example - 0x02D9 AND 0x007F = 0x59 = Checksum

Ich hoffe ihr könnt mir helfen, danke

Hallo,

ich koennte Dir helfen, aber so eine komplette Protokollumsetzung braucht einiges an Zeit und die habe ich fuer OSS leider nicht.

Hallo Overkill,

ich hab mich mal am ersten Beispiel versucht.

Mit dem Script wird der Status angefordert.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : ComPortAbfrage.ips.php
Trigger  : 
Interval : 
*/

$array = explode(" ", "F0 cc 00 7F 00 00 70 01 04 02 00 zz 07 00 00 cs F7");
$ID = 12345; //ComPort ID  in IPS
$array[1] = "02"; //controller number -1
$array[11] = "02"; //zone number -1

$cs = 0;
$ComString ="";

for ($i=0; $i<=count($array) - 3; $i++, $cs++ ){  //Step #2 - Count the number of bytes which precede the Checksum
  $array[$i] = hexdec($array[$i]);
  $cs += $array[$i];         //Step #1 - Add the HEX value of every byte in the message that precedes the Checksum:
  $ComString .= chr($array[$i]); //String zusammenfgen
}
$cs &= 0x7F;              //This value is then AND-ed with the HEX value 0x007F
$ComString.=chr($cs).chr(end($array));        //String zusammenfgen

ComPort_SendText($ID, $ComString);      //String ausgeben
?>

Mit dem Script wird die Antwort empfangen:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : ComPortEmpfang.ips.php
Trigger  : 
Interval : 
*/
//F0 00 00 70 cc 00 7F 00 00 04 02 00 zz 06 00 00 01 00 01 00 ## ## ## ## ## ## ## ## ## ## xx F7
$ComString = GetValueString("Com.Port"); //"Com.Port" ist z.b. die Register Variable in IPS
If ($ComString != ""){
  SetValueString("Com.Port","");      // Register Variable lschen
  SetValueInteger("Status",ord($ComString{19}));   // übergabe Status an IPS
  SetValueInteger("Volume",ord($ComString{21}));   // übergabe Lautstärke an IPS
  // u.s.w.
}
?>

Ich konnte es in Ermangelung der entsprechenden Hardware nicht testen. Du mußt nur noch die entprechenden Variablen in IPS anlegen.

Mfg
A

Edit: 28.03.08 Verbesserungen von HJH eingepflegt

Hallo Overkill0815 und Attain,

die Berechnung der Checksumme ist wesentlich einfacher, als die Beschreibung vermuten lässt.

// die zu übertragende Byte-Sequenz steht in der String-Variablen $Msg
$ChkSum = 0;                         // Checksumme initialisieren
for($i=0; $i<strlen($Msg); $i++)     // alle Bytes aufsummieren
  $ChkSum += ord($Msg[$i]);
$ChkSum += strlen($Msg);             // zusätzlich die Anzahl der Bytes aufaddieren
$ChkSum &= 0x7f;                     // nur die unteren 7 Bit verwenden
$Msg .= chr($ChkSum). "\xF7";        // Byte-Sequenz um Checksumme und Endezeichen ergänzen

Der String $Msg kann dann auf den ComPort ausgegeben werden.

Gruß
HJH

Module/Checksumme Exkurs:

http://www.ipsymcon.de/forum/showthread.php?p=39400#post39400

paresy

Hallo,
bin bei der PHP-Programmierung ganz am Anfang, habe nur aktuelle wenig Zeit mich genauer damit zu befassen! Müsste vor der genaueren Einarbeitung ein Pflichtprogramm erfüllen (Musik im Esszimmer und in der Küche!).

Zu Problem:
Habe den Programmvorschlag von Attain genommen.
Die Checksumme wird auch richtig berechnet, aber beim Zusammensetzen des
$ComString wird an der letzten Stelle ein 00 statt der F7 gesendet.

PHP-Code:


$array = explode(" ", "F0 cc 00 7F 00 zz 70 05 02 02 00 00 F1 23 00 00 00 00 00 01 cs F7");
$ID = 53006 /*[Serial Port]*/; //ComPort ID  in IPS
$array[1] = "00"; //controller number -1
$array[5] = "01"; //zone number -1

$cs = 0;
$ComString ="";

for ($i=0; $i<=count($array) - 3; $i++, $cs++ ){  //Step #2 - Count the number of bytes which precede the Checksum
  $array[$i] = hexdec($array[$i]);
  $cs += $array[$i];         //Step #1 - Add the HEX value of every byte in the message that precedes the Checksum:
  $ComString .= chr($array[$i]); //String zusammenfgen
}
$cs &= 0x7F;              //This value is then AND-ed with the HEX value 0x007F
$ComString .= chr($cs).chr(end($array));        //String zusammenfgen
ComPort_SendText($ID, $ComString);      //String ausgeben
?>

Das gesendete Telegramm sieht so aus:
F0 00 00 7F 00 01 70 05 02 02 00 00 F1 23 00 00 00 00 00 01 12 00
Anstelle der 00 am Ende sollte die F7 stehen.

Was bedeutet der Punkt vor dem = z. B. .= chr

Danke für eure Hilfe!

Gruß Franz

Hallo Franz,

probier mal das:

$ComString .= chr($cs).chr(hexdec(end($array)));        //String zusammenfgen