Autor Thema: IR Steuerung für einen (sehr alten) Audio-Verstärker  (Gelesen 703 mal)

Offline pjakobs

  • Hero Member
  • *****
  • Beiträge: 1028
IR Steuerung für einen (sehr alten) Audio-Verstärker
« am: 04 April 2021, 17:40:33 »
Ich weiß nicht, ob es jemandem hilft, aber ich werf's mal hier rein, als Beispiel dürfte es taugen.

Ich habe einen alten Sony TA-F519R, einen sehr ordentlichen Hi-Fi Verstärker aus der ersten Hälfte der 90er.
Der tut seinen Dienst im Großen und Ganzen sehr gut, allerdings war lange Zeit die Infrarotsteuerung wenig zuverlässig. Nachdem ich jetzt einen defekten Tantal-Kondensator (die Dinger sind die Pest!) und eine kalte Lötstelle repariert habe, wollte ich ihn dann doch in die Hausautomation einbinden.
Ich habe nicht alle Eingänge belegt, im wesentlichen hängen drei Komponenten dran:
  • CD-Player
  • TV
  • OSMC (Kodi)
Minimalanforderung war, zwischen den Eingängen umschalten zu können, idealerweise wollte ich noch eine Mute Funktion.
Die zugehörigen IR-Codes habe ich mit dem Oszilloskop und der original Fernbedienung ausgelesen, aber natürlich geht das auch auf zig anderen Wegen und aus den entsprechenden Quellen im Netz.
Als IR Sender dient ein ESP8266 mit ESP Easy, so dass ich die jeweilige Funktion über eine url à la
http://<esp-ip>/control?cmd=IRSEND,SONY,<code>,12,<n>

senden kann.
Laut Schaltplan hat der Verstärker zwar eine interne Mute Schaltung, aber ich habe keinen IR Code finden können, der tatsächlich die Ausgänge stumm geschaltet hätte. Vielleicht hacke ich das irgendwann nochmal, aber da ich sowieso keinen Plattenspieler mehr besitze, habe ich beschlossen, den Eingang "Phono" als "mute" zu betrachten.

Abgebildet habe ich das ganze über ein Dummy, ein notify und ein kleines Script in der 99_myUtils.pm

der Dummy hält den gesamten State des Objektes und gibt über die setList vor, welche Zustände der Verstärker annehmen kann.
Die userReadings "oldInput" und "muted" nutze ich, um nach dem Mute wieder zum vorherigen Input zurückzukehren und, um im Mute Zustand auch einen anderen Input einstellen zu können, ohne, dass Mute aufgehoben wird.

define Verstaerker dummy
attr Verstaerker userattr ip
attr Verstaerker ip 192.168.29.64
attr Verstaerker room 80-AV,03-Wohnzimmer
attr Verstaerker setList state:CD,OSMC,TV,TAPE1,TAPE2,mute,unmute,OFF
attr Verstaerker userReadings oldInput, muted
attr Verstaerker verbose 5
attr Verstaerker webCmd state
das Notify ruft wirklich nur die Funktion ampControl auf. Ich hätte den Input auch aus dem Event ziehen können, aber das ist oft so ein Gefrickel

Verstaerker:.* {
  my $input=ReadingsVal("Verstaerker","state","inval");
  print "Verstaerker Eingang".$input;
  ampControl($input);
}

In der 99_myUtils.pm schließlich ein bisschen Code:
Erst definiere ich den Hash mit den IR Codes für die jeweiligen Inputs, der Vorteil des Hash ist hier, dass ich keine if Kaskade brauche um alle Zustände abzufragen, sondern lediglich das Array (und die setList des Dummy) erweitern müsste, wenn ich mehr Funktionen brauche.
In meinem spezifischen Fall hängt der Verstärker über einen Sonoff mit Tasmota (SW_Amp) am Strom, d.h. die Funktion deckt auch das an und ausschalten des Sonoff noch mit ab.
Ich bin mir nicht sicher, ob "getHttpFile" der beste Weg ist, eine url aufzurufen, aber es funktioniert auf alle Fälle.

sub
 ampControl($){
     my $input=shift;
     my %codes=(
         'OSMC'      =>  "b81",
         'CD'        =>  "a41",
         'TV'        =>  "841",
         'TAPE1'     =>  "c41",
         'TAPE2'     =>  "241",
         'PHONO'     =>  "041"
     );
     $codes{'mute'} = $codes{"PHONO"};
     my $muted=ReadingsVal("Verstaerker","muted","false");

     Log3("Verstaerker AMP",3, "Verstaerker Eingang ".$input);
     my $ip=AttrVal("Verstaerker","ip","");

     if ($input eq "OFF") {
         fhem("set SW_Amp OFF");
     }
     else{
         my $power=ReadingsVal("SW_Amp","state","");
         if ($power eq "OFF"  || $power eq "hsv") {
             fhem("set SW_Amp ON");
             sleep(1);
         }
         Log3("Verstaerker AMP",3,"Verstaerker command: $input, Verstaerker Code $codes{$input}");
         if ($input eq "mute") {
             GetHttpFile($ip,"/control?cmd=IRSEND,SONY,$codes{$input},12,3");
             fhem("setreading Verstaerker muted true");
         } elsif ($input eq "unmute") {
             my $activeInput=ReadingsVal("Verstaerker","oldInput","inval");
             if ($activeInput ne "inval"){
                 fhem("set Verstaerker $activeInput");
                 GetHttpFile($ip,"/control?cmd=IRSEND,SONY,$codes{$activeInput},12,3");
             }
             fhem("setreading Verstaerker muted false");
         } elsif (defined($codes{$input}) ){
             fhem("setreading Verstaerker oldInput $input");
             if ($muted eq "false"){
                 GetHttpFile($ip,"/control?cmd=IRSEND,SONY,$codes{$input},12,3");
             }
         } else {
               print "Verstaerker: no valid input";
         }
     }
 }