Anbindung von Pioneer AVR

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

Vorheriges Thema - Nächstes Thema

Erasor

Hallo zusammen,

ich besitze einen Pioneer AVR-1122. Über den Telnet-Port der Netzwerkschnittstelle kann man verschiedene Befehle an den AVR absetzen. Manuell bekomme ich das auch problemlos hin, nur leider fehlt mir das technische Verständnis um das in FHEM einzubauen.
Hier:
http://www.pioneerelectronics.com/PUSA/Support/Home-Entertainment-Custom-Install/RS-232+&+IP+Codes/A+V+Receivers
gibt es die entsprechenden Befehlsreferenzen.

Vielleicht findet sich ja jemand, der auf diese Info nur gewartet hat!? ich würde mich jedenfalls freuen, den AVR über FHEM steuern zu können...


Chris8888

Hallo zusammen,

ich fände das super! Leider geht es mir Erasor...bin da deutlich zu unbedarft.
Habe einen SC-LX86 (amerikanisches Modell Elite SC68) hier stehen und teste gerne!

Gruß
Christian
FHEM 6.0 auf einem PI4 mit div. Homematic-Komponenten, Alexa, Tablet-UI und Homebridge...und läuft einfach. Erweitert mit CCU3 und Homematic-IP...und läuft immer noch.

Erasor

der Vollständigkeit halber: Link

Edith:
Trotzdem wäre eine Integration der Schnittstelle wie in 71_Yamaha_AVR.pm ein Eintrag auf meiner Wunschliste....
Die Logik und die Schalter sind ja nahezu identisch...

Erasor

Hallo zusammen,

ich habe mich nun selbst mal an der Modulerstellung probiert, bin aber noch weit von einer Veröffentlichung entfernt.
Ich schaue dabei natürlich so gut wie möglich von den anderen Modulen ab, aber das ist für einen Neuling wie mich nicht ganz einfach. Gibt es eigentlich einen Beispielaufbau eines neuen Moduls inkl. Beschreibung der einzelnen Definitionen? Wenn nicht, wäre das definitiv ein weiterer Punkt auf meiner Wunschliste. Falls es so etwas schon geben sollte, würde ich über den Link sehr freuen!

LG

Alex

betateilchen

Die Frage gab es vor ein paar Tagen schonmal - und auch eine Antwort dazu: Link

Ich hoffe, das hilft Dir schonmal weiter.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Chris8888

dann drücke ich dir die Daumen...ich habe es ebenfalls versucht, bin aber an meinem Kenntnisstand zu Pearl gescheitert.

Wenn du etwas zum testen brauchst...sehr gerne!

Gruß
Christian
FHEM 6.0 auf einem PI4 mit div. Homematic-Komponenten, Alexa, Tablet-UI und Homebridge...und läuft einfach. Erweitert mit CCU3 und Homematic-IP...und läuft immer noch.

somebuddy

Hat sich hier noch was getan ? :) Hatte den gleichen Gedanken und will ungern das Rad neu erfinden.

Erasor

Hi,

ich bin noch nicht sehr weit und komme im Moment auch nicht dazu, weiterzumachen... Hier ist mein aktuelles Coding:

################################################################
#
#  Copyright notice
#
#  (c) 2013 Alexander Senkbeil (alex@senki.de)
#
#  This script is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  The GNU General Public License can be found at
#  http://www.gnu.org/copyleft/gpl.html.
#  A copy is found in the textfile GPL.txt and important notices to the license
#  from the author is found in LICENSE.txt distributed with these scripts.
#
#  This script is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  This copyright notice MUST APPEAR in all copies of the script!
#
################################################################

package main;

use strict;
use warnings;
use Data::Dumper;
use Net::Telnet;

sub PIONEER_AVR_Define($$);
sub PIONEER_AVR_GetStatus($);
sub PIONEER_AVR_SendCommand($$;$);
sub PIONEER_AVR_GetModel($$);
sub PIONEER_AVR_GetPower($$);
sub PIONEER_AVR_Undefine($$);
#####################################

sub PIONEER_AVR_Initialize($) {
  my ($hash) = @_;

  $hash->{DefFn}   = "PIONEER_AVR_Define";
  $hash->{UndefFn} = "PIONEER_AVR_Undefine";
  $hash->{AttrList}= "loglevel:0,1,2,3,4,5,6".$readingFnAttributes;
}


sub PIONEER_AVR_Define($$) {
  my ($hash, $def) = @_;
  my @a = split("[ \t][ \t]*", $def);
  my $name=$hash->{NAME};

  if (! @a >= 4) {
    print "Debug:".@a."\n";
    my $msg = "wrong syntax: define <name> PIONEER_AVR <ip-or-hostname> [<port>] [<statusinterval>] @a";
    Log 2, $msg;
    return $msg;
  }  

  #Hostname ist immer definiert:
  $hash->{Host} = $a[2];
 
  #Abfrage auf 3. Parameter (Port)
  if(defined($a[3])) {
    $hash->{Port} = $a[3];
  } else {
    $hash->{Port} = 23;
  }
 
  #Abfrage auf 4. Parameter (Statusinterval)
  if(defined($a[4]) and $a[4] > 0) {
    $hash->{INTERVAL} = $a[4];
  } else {
    $hash->{INTERVAL} = 60;
  }
   
#  $attr{$name}{delay}=$delay;
#  Log 5, "Pioneer Define: $a[0] $a[1] $a[2] $a[3]";  
   
  # $hash->{Host} = $host;
  # $hash->{Port} = $port;
  # $hash->{INTERVAL} = $delay;
  # $hash->{STATE} = "Initialized";

  InternalTimer(gettimeofday()+2, "PIONEER_AVR_GetStatus", $hash, 0);
 
  return undef;
}


sub PIONEER_AVR_GetStatus($) {
  my ($hash) = @_;
 
  my $buf;

  Log 5, "PIONEER_AVR_GetStatus";
  my $name = $hash->{NAME};
  my $host = $hash->{Host};
  my $port = $hash->{Port};
  my $text='';
  my $err_log='';
  my $answer;
  my $sensor;
  my $dumplog;
 
  my $delay=$attr{$name}{delay}||300;
 
  InternalTimer(gettimeofday()+$delay, "PIONEER_AVR_GetStatus", $hash, 0);

  PIONEER_AVR_GetModel($hash,5);
  PIONEER_AVR_GetPower($hash,5);
 
  return(0);
}

sub PIONEER_AVR_SendCommand($$;$) {
  my ($hash, $command, $loglevel) = @_;
  my $name = $hash->{NAME};
  my $host = $hash->{Host};
  my $port = $hash->{Port};
  my $response;
   
  $loglevel = GetLogLevel($name, 3) unless(defined($loglevel));
   
  Log GetLogLevel($name, 5), "PIONEER_AVR: execute on $name: $command";
   
  my $tel=new Net::Telnet(Host => $host, Port => $port, Timeout => 10);
   
  if(!defined($tel)) {
    Log 4,"$name: Error connecting to $host:$port";
  } else {
#   print "Telnet geöffnet"."\n";
    $tel->put("");
    sleep(1);
    $tel->print($command."\n");
    $response=$tel->getline();
#   print $response;
    $tel->close();  
  }
   
  Log GetLogLevel($name, 5), "PIONEER_AVR: got response for $name: $response" if(defined($response));

  return $response;
}

sub PIONEER_AVR_GetModel($$) {
  my ($hash, $loglevel) = @_;
  my $name = $hash->{NAME};
  my $model;
  my $response;
   
  $loglevel = GetLogLevel($name, 3) unless(defined($loglevel));
     
  $response = PIONEER_AVR_SendCommand($hash, "?RGD");
  $model = substr($response,9,index($response,"/")-9);
   
  Log GetLogLevel($name, 5), "PIONEER_AVR: $name model search got string $response, found $model" if(defined($response));
   
  $hash->{MODEL} = $model;
   
  return $model;
}

sub PIONEER_AVR_GetPower($$) {
  my ($hash, $loglevel) = @_;
  my $name = $hash->{NAME};
  my $power;
  my $response;
   
  $loglevel = GetLogLevel($name, 3) unless(defined($loglevel));
     
  $response = PIONEER_AVR_SendCommand($hash, "?P");
  $power = substr($response,3,1);
   
  Log GetLogLevel($name, 5), "PIONEER_AVR: $name GetPower $response, found $power" if(defined($response));
   
  if ($power == "0") {
    $hash->{STATE} = "on";
  } else {
    $hash->{STATE} = "off";
  }
       
  return $power;
}


sub PIONEER_AVR_Undefine($$) {
  my($hash, $name) = @_;
 
  # Stop the internal GetStatus-Loop and exist
  RemoveInternalTimer($hash);
  return undef;
}

1;


Vielleicht kannst du damit ja etwas anfangen...

spacy

Hallo Erasor,

hast du meine pm gelesen?
Können wir beide vielleicht was zusammen machen in dem Modul.
Bin leider auch Anfänger.

spacy

djsunshine84

Hallo FHEM Gemeinde,
Ich möchte dieses Thema mal aus eigenem Interesse wieder aufwecken.

Ich habe selbst einen Pioneer VSX 1020.
Ich habe den Code-Schnipsel als 70_PIONEER_AVR.pm unter fhem/FHEM angelegt, nach ersten Tests musste ich feststellen das mein fhem das ganze mit "Cannot load Module PIONEER_AVR" verweigert.
Nach der Suche in den Logfiles kamen dann so Meldungen Can`t locate JSON zum Vorschein.

Ok keine Thema, da ich fhem auf einen RPi laufen habe schnell per ssh "cpan install JSON" und nach ein paar Minuten nächster Test. Wieder "Cannot load Module PIONEER_AVR"  :'(

Logfile sagt Can´t locate NET/Telnet.pm

Nach einiger Suche und meinem Freund Google per ssh "cpan install NET::Telnet" und warten.
So Module wird geladen ABER mein FHEM lief zwar aber http://ip:8083 war tot :'(

Ich bin nun soweit gekommen das der VSX 1020 über Telnet mit Port ip:8102 mit mir spricht und folgende Befehle versteht und ausführt.

Volume:
•   VD = VOLUME DOWN
•   MZ = MUTE ON/OFF
•   VU = VOLUME UP
•   ?V = QUERY VOLUME
Power control:
•   PF = POWER OFF
•   PO = POWER ON
•   ?P = QUERY POWER STATUS
Input selection
•   05FN = TV/SAT
•   01FN = CD
•   03FN = CD-R/TAPE
•   04FN = DVD
•   19FN = HDMI1
•   05FN = TV/SAT
•   00FN = PHONO
•   03FN = CD-R/TAPE
•   26FN = HOME MEDIA GALLERY(Internet Radio)
•   15FN = DVR/BDR
•   05FN = TV/SAT
•   10FN = VIDEO 1(VIDEO)
•   14FN = VIDEO 2
•   19FN = HDMI1
•   20FN = HDMI2
•   21FN = HDMI3
•   22FN = HDMI4
•   23FN = HDMI5
•   24FN = HDMI6
•   25FN = BD
•   17FN = iPod/USB
•   FU = INPUT CHANGE (cyclic)
•   ?F = QUERY INPUT

Vielleicht kann mir jemand dasbei helfen das Modul soweit zu bringen das im speziellen so Dinge wie Volume-Regelung analog zu (HM-CC-RT-DN - Temperatur-Regelung) möglich sind.
Sowie die Auswahl der Eingänge.

Ziel für mich wäre die Steuerung über fhemoblie des wegen auch das "analog zu (HM-CC-RT-DN - Temperatur-Regelung)" die optische Umsetzung mit dem Drehregler find ich bestens gelöst.

Bei Anregungen oder Test steh ich gern zur Verfügung.

Grüße

Sirphunk

#10
Hallo.
Mein VSX 828 kommt nächste Woche.
Ich werde mir dann die Basis von Erasor mal näher anschauen.

Macht es sinn sämtliche Befehle die die Pioneer Geräte über Telnet unterstützen auch in FHEM zu nutzen?
Oder reichen solche Dinge wie Eingangswahl, Zonen/Ausgangswahl, Lautstärke, Power on/off?
Laut dem Servicemanual von Pioneer unterstützen die Geräte nämlich jede Menge... :)
http://www.pioneerelectronics.com/StaticFiles/PUSA/Files/Home%20Custom%20Install/VSX-1120-K-RS232.PDF

Ich dachte mir als Szenario das z.B. bei meiner Esszimmerlichtszene automatisch die Lautsprecher im Esszimmer angesteuert werden, auf Internetradio geswitcht wird und die Lautstärke auf einen bestimmten Wert gesetzt wird. Beim beenden der Lichtszene soll dann auf die vorherigen Werte zurückgewechselt werden.

Edit:
Habe heute den AVR bekommen.
Der VSX828 scheint zwar einen Telnet Zugang zu haben und sendet auch fleißig jede Änderung die über die Fernbedienung getätigt wird, (Vol up, Vol down) nimmt aber keines der Befehle aus dem Commandref von Pioneer entgegen.

Hat jemand noch weiterführende Ideen?

Sirphunk

Das die Telnet Kommandos nicht funktionierten lag wohl an der Android App die ich benutzt habe. :)

Mit folgendem Coding in der myUtils kann ich den Receiver steuern und Befehle senden.
Allerdings kann ich keinen Status auslesen um z.B. zu sehen ob der AVR ein oder ausgeschaltet ist.
Der Aufruf erfolgt dann jeweils mit "{PioneerOn()}", "{PioneerOff()}" usw.

package main;
use strict;
use warnings;
use POSIX;
use Net::Telnet;

my $name = "PioneerRemote";
my $PioneerIP = "192.168.0.4";
my $PioneerPort = "8102";
my $current= $_[0];
my $PowerStatus;
my $power;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}

sub PioneerOn()
{
my $telnet = new Net::Telnet ( Timeout=>10, Errmode=>'die', Port=>$PioneerPort );
$telnet->open($PioneerIP);
$telnet->print('PO');
$telnet->close();
}

sub PioneerOff()
{
my $telnet = new Net::Telnet ( Timeout=>10, Errmode=>'die', Port=>$PioneerPort );
$telnet->open($PioneerIP);
$telnet->print('PF');
$telnet->close();
}

sub PioneerNetradio()
{
my $telnet = new Net::Telnet ( Timeout=>10, Errmode=>'die', Port=>$PioneerPort );
$telnet->open($PioneerIP);
$telnet->print('38FN');
$telnet->close();
}

sub PioneerSat()
{
my $telnet = new Net::Telnet ( Timeout=>10, Errmode=>'die', Port=>$PioneerPort );
$telnet->open($PioneerIP);
$telnet->print('06FN');
$telnet->close();
}

sub PioneerPowerStatus()
{
my $telnet = new Net::Telnet ( Timeout=>25, Errmode=>'die', Port=>$PioneerPort, Prompt => '\n');
$telnet->open($PioneerIP);
$PowerStatus = $telnet->print('?P');
$power = substr($PowerStatus,3,1);
return $power;
$telnet->close();
}
1;


Die Codebasis von Erasor läuft bei mir übrigens ebenfalls nicht.

P.A.Trick


?P
PWR0
PF
PWR1
FL0020205A4F4E452032204F4E202020
PWR1
FN05
?P
PWR1


Also mein VSX-928 (oder welchen habe ich jetzt :-) sitze gerade im Keller :-)) zeigt doch ?P den Powerstatus ordentlich an.
Ich glaube ich muss mich auch mal an so ein Modul wagen, obwohl ich mag doch gar kein Perl :-)
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

Sirphunk

Da hab ich aber wirklich blöd ausgedrückt.
Na klar, der Antwortet fleißig. Auch "?V" funktioniert.

Allerdings liegt es an meinen mangelnden Perl Kenntnissen die Antworten auszulesen.
Da das Telnet des VSX keinen Prompt zurückliefert, also nen Zeilenstart, hat meinen keinen Ansatzpunkt den bei cmd() nutzen könnte.
Ich spiele hier gerade mit getline() aus dem NET::Telnet rum um die Antwort abzugreifen.
Das klappt schon noch! :)

P.A.Trick

#14
Ah ok aber warum nimmst du nicht das Modul von oben? Das ist doch schon einmal ein guter Anfang und die Technik zum auslesen der Zeile ist auch drin!

Hier:



$response=$tel->getline();

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