Anbindung von Pioneer AVR

Begonnen von Erasor, 29 April 2013, 11:07:24

Vorheriges Thema - Nächstes Thema

jenscz

Es wäre auch sehr gut doch eine Modellabfrage einzubauen. Beim Pioneer-VSX-828 geht zB. keine direkte Volumewahl. Nur Up/Down :-( .
Input ist auch nicht 1:1 mit anderen Modellen.
Evtl. sollte dies in eine extra Übersetzungsdatei ausgelagert werden.

In der aktuellen Version kann ich zB SAT (06FN) nicht auswählen.

Konnte ich zwar schnell hinzufügen, ist aber genauso schnell wieder weg nach einem Update ;-)
CCU3 mit 6xHMW-IO-12-Sw7-DR,1x HMW-LC-Bl1-DR, Bewegungsmeldern .....
Gardena Smart IrrigationControl (ic24)

janlau

Habe mir gerade mal ein paar verschieden Modelle und die dazugehörigen RS232 Codes angeschaut.
Es sieht so aus, also gäbe es Inputs von 00-31. Diese Inputs sind bei allen Verstärkern die ich betrachtet habe gleich z.B. 01FN ist immer CD.
Ich denke wenn man die gesamte Liste von 00-31 integriert, dann sollte es keine Probleme geben.

Zu der Lautstärker:
Laut den zugehörigen Codes müsste das setzen der Lautstärker allerdings möglich sein.
Bei meinem Vsx-921 ist die Lautstärke in 0.5db Schritten regelbar.
Ist dies auch bei dem Vsx-828 so?

jenscz

Nein, leider nicht. Habe per Telnet alles ausprobiert, 2 stellig 3 stellig VL, VOL usw.

VU und VD gehen
CCU3 mit 6xHMW-IO-12-Sw7-DR,1x HMW-LC-Bl1-DR, Bewegungsmeldern .....
Gardena Smart IrrigationControl (ic24)

Sirphunk

Eine direkte Nachfrage bei Pioneer hat ergeben, dass die AVR's die "nur" über die Control App zu steuern sind, keine direktanwahl der Lautstärke über Telnet akzeptieren, weil diese Funktion nicht implementiert ist. Ebenso wenig funktioniert das Wechseln zwischen Lautsprecherpaar A & B.

Die Receiver die mit der iControlAV App kompatibel sind (meines Wissens nach alle ab 92x) unterstützen diese Funktionen.

Also muss die Modellabfrage zwingend mit rein um eine Kompatibilität zu allen Pioneer AVR herzustellen.
Alternativ bleibt die Angabe über das Kürzel 06FN z.B.

Erasor

Ich bin nicht mehr ganz im Thema - aber hatte ich die Modellabfrage nicht schon implementiert?

grywnn

Hiho!

Hab das Modul auch mal ausprobiert, funktioniert ja schon ganz gut.
Danke an dieser Stelle für die Arbeit!
Witzigerweise hab ich mich ziemlich zeitgleich mit dem Thema FHEM vs. Pioneer auseinander gesetzt, da ich aber kein Perl spreche habe ich mir mit ein paar Shell Scripten und einem Dummy beholfen. Ein Modul ist aber allemal besser!!

Beim Testen ist mir aufgefallen das sich mein FHEM für 6 Sekunden komplett schlafen legt wenn das Modul seinen StatusUpdate macht.
Grund dafür sind die diversen sleep(1); in PIONEER_AVR_GetStatus() und PIONEER_AVR_SendCommand().

Stimmt: Man muss nach Öffnen der Telnet Verbindung kurz warten bevor man einen Befehl reinschickt, sonst verschluckt sich der Receiver.
Aber zumindest bei meinem 921er tuts auch 1/10s
select(undef,undef,undef,0.1);
Habs bei mir lokal eingebaut, das beschleunigt die Verarbeitung glatt mal um den Faktor 10.  8)

Dann wäre da noch eine kosmetische Sache, ich hab in meinem Log immer wieder Folgendes gefunden:
substr outside of string at ./FHEM/70_PIONEER_AVR.pm line 431.
substr outside of string at ./FHEM/70_PIONEER_AVR.pm line 449.
Use of uninitialized value $power in concatenation (.) or string at ./FHEM/70_PIONEER_AVR.pm line 451.
Use of uninitialized value $power in numeric eq (==) at ./FHEM/70_PIONEER_AVR.pm line 453.
substr outside of string at ./FHEM/70_PIONEER_AVR.pm line 497.
Use of uninitialized value $mute in concatenation (.) or string at ./FHEM/70_PIONEER_AVR.pm line 499.
Use of uninitialized value $mute in numeric eq (==) at ./FHEM/70_PIONEER_AVR.pm line 501.

...ging weg nachdem ich ein Mal explizit Mute und Power auf On und wieder auf Off gesetzt habe.
Da sind wohl beim allerersten Start die Werte nicht initialisiert.

Apropos, die internen Attribute volume, state und mute werden bei mir nicht korrekt gesetzt. schau ich mir gleich mal mit Debug Log an.
Und:
Macht es eventuell Sinn die Attribute direkt zu Updaten wenn man einen Befehl abschickt?
Also zB
    ####Mute
      elsif ( $a[1] eq "mute" ) {
        Log3 $name, 2, "PIONEER_AVR set $name " . $a[1];
        if ($a[2] eq "on") {
             PIONEER_AVR_SendCommand($hash, "MO");
             $hash->{MUTE} = "on";
             }
        elsif ($a[2] eq "off") {
             PIONEER_AVR_SendCommand($hash, "MF");
             $hash->{MUTE} = "off";
             }
    }

(Keine Ahnung ob das so geht, ich spreche zwar ein halbes Duzend Programmiersprachen, aber wie schon gesagt, Perl gehört nicht dazu...)
So wären die Readings nicht erst nach dem nächsten GetStatus() aktuell, sondern direkt nach Abschicken eines Befehls.

Soweit erst mal,
Heiner

grywnn

OK Ich hab rausgefunden warum das lesen des Status (bei mir?) nicht funktioniert.
Aus der Net::Telnet Doku:
ZitatThe output record separator for print() and cmd() is set to "\n" by default, so that you don't have to append all your commands with a newline. To avoid printing a trailing "\n" use put() or set the output_record_separator to "".
Sprich in Zeile 386 in PIONEER_AVR_SendCommand()
    $tel->print($command."\n");

muss das ."\n" weg:
    $tel->print($command);

...sonst wird eine zusätzliche Leerzeile abgeschickt die mein Pioneer mit einem "R" quittiert.

grywnn

Ich schon wieder  ;D

Das Entfernen des "\n" beim Telnet Befehl hat den unangenehmen Nebeneffekt das FHEM sich bei Befehlen ohne Rückgabewert aufhängt, da der $tel->getline() bis zum Timeout wartet.
Ich habe das bei mir so angepasst, das getline() in PIONEER_AVR_SendCommand() nur bei lesenden Befehlen ausgeführt wird:
    $tel->print($command);
    if ( substr($command,0,1) == "?" ) {
      $response=$tel->getline();
    }


Und - Kleinigkeit:
Da der Pioneer wenn er aus ist keinen Status für Volume, Mute und Eingang zurückgibt braucht man ihn auch nicht abfragen.
sub PIONEER_AVR_GetStatus($) {
...
  my $power;
...
  $power = PIONEER_AVR_GetPower($hash,5);
  if ( $power == "on" ) {
    select(undef,undef,undef,0.1);
    PIONEER_AVR_GetVolume($hash,5);
    select(undef,undef,undef,0.1);
    PIONEER_AVR_GetInput($hash,5);
    select(undef,undef,undef,0.1);
    PIONEER_AVR_GetMute($hash,5);
  }
  return(0);
}


So, das wars für Heute.
Argh ich lerne noch Perl auf meine alten Tage  ::)

Grüße,
Heiner

grywnn

So, da ich jetzt noch eine ganze Menge Kleinigkeiten modifiziert und korrigiert habe hab ich mal meine aktuelle Version angehängt als Ausgangsbasis für Weiters.

- Wartezeit zwischen Befehlen ist auf 0.1s reduziert (siehe auch Pioneer Doku, die empfehlen 100ms)
- PIONEER_AVR_SendCommand(): Rückgabe wird nur noch bei "?.." Befehlen gelesen
- PIONEER_AVR_SendCommand(): trim() auf den Rückgabewert, da war noch ein \n hinten dran, das hat in den get...() subs Probleme gemacht.
- Die Register CHANNEL, MUTE, STATE und VOLUME werden bei entsprechen Befehlen direkt gesetzt.
- VolumeUp und VolumeDown triggern zusätzlich ein getVolume()
- Das Register VOLUME beinhaltet jetzt den Wert in db.
- In das Register CHANNEL wird jetzt der Name geschrieben.
- In getInput() wurde ein ?FN abgeschickt, der Doku die mir vorliegt zufolge sollte das aber ein ?F sein...? Das hab ich angepasst.
- getStatus() liesst die diversen Stati nur wenn der PVR an ist.

Ich werd mal noch schauen ob ich die Listening Modes noch mit eingebaut bekomme, das wäre für mich noch von ziemlichem Interesse  ;)

P.A.Trick

Hey mit Slider....sieht cool aus! Ich teste mal das Modul und werde berichten!
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

grywnn

Ich hab noch etwas weiter gebastelt, Datei folgt Heute Abend:

Volume, Mute, Channel und Power (neu) sind jetzt Readings und keine Internals mehr. Das heißt sie lösen jetzt Events aus, und man kann sie Plotten oder für Notifies missbrauchen (ich weis zwar spontan kein Anwendungsszenario, aber schaden kanns ja nicht)

Ich hab entdeckt das man die Namen der Eingänge mit ?RGBxx auslesen kann. Insbesondere auch wenn man die Eingänge umbenannt hat (bei mir der Fall).
Ich hab daher eine Funktion getInputNames ergänzt, die die Kanalnummern von 0 bis 35 durchläuft und die Namen die sie zurückbekommt in einem Internal speichert. Im entsprechenden Dropdown werden diese dann ausgegeben.
getInputNames wird beim define automatisch ausgeführt, muss an sich nur ein Mal laufen, kann aber auch explizit aufgerufen werden (zB wenn man einen Eingang im Pioneer umbenannt hat).

Die getModel() Funktion war im Modul schon drin, wurde aber bei der Initialisierung nicht (mehr) aufgerufen. Das hab ich korrigiert. Im Internal "MODEL" steht jetzt wieder die Modellbezeichnung.

Im Status-Timer gab es ein Problem: Wenn man statusRequest aufgerufen hat wurde ein zusätzlicher Timer gestartet. Das habe ich beseitigt.

Raven

Moin moin,

würde ja gerne mitmischen...  ;D aber ich bekomme das Modul garnicht geladen.
Hab schon einiges versucht und evtl. hilft diese Fehlermeldung weiter:


Can't locate Net/Telnet.pm
in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl . ./FHEM) at ./FHEM/70_PIONEER_AVR.pm line 36. BEGIN failed--compilation aborted at ./FHEM/70_PIONEER_AVR.pm line 36.


Aktuell habe ich eine Standard-Installation auf einem BeagleBoneBlack.
mmmhhhh...schaue ich mir (kein Perl-Experte) den Header von 70_PIONEER_AVR.pm an:

use Data::Dumper;
use Net::Telnet;

...muß ich evtl. hier den Header anpassen, oder Perl-Module nachinstallieren?
Danke vorab.
Cubietruck-Prod: HM-LAN, Heizung, Rolläden, Schalter, Viessmann (optolink)
Cubietruck-DEV:
Fritzbox 7490

P.A.Trick

  sudo apt-get install libnet-telnet-perl

Versuche das mal!
Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn

Raven

yiiiieeepiiiehhhh! funktioniert. Dankeschön.

Zitat von: P.A.Trick am 05 April 2014, 10:35:38
  sudo apt-get install libnet-telnet-perl

Versuche das mal!
Cubietruck-Prod: HM-LAN, Heizung, Rolläden, Schalter, Viessmann (optolink)
Cubietruck-DEV:
Fritzbox 7490

P.A.Trick

Cubietruck,RPI,QNAP Ts-419p+, FS20, FRITZ!DECT200, 7 MAX! Thermostate, 3 MAX! Fensterkontakte, Kodi, CUL V3.3, EM1000S, LW12, LD382, HUE, HM-CFG-USB-2, 1x HM-LC-SW1-FM, 2x HM-LC-SW2-FM, 2x HM-LC-Sw1PBU-FM, 3xHM-LC-Bl1PBU-FM,HM-SEC-RHS, 2xHM-SEC-SD,HM-WDS30-T-O, 3x HM-LC-Dim1TPBU-FM, RPI+AddOn