Ankündigung

Einklappen
Keine Ankündigung bisher.

Teac AG-980

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [WireGate-Plugin] Teac AG-980

    Hallo zusammen,

    im Anhang findet Ihr ein Plugin um einen "Teac AG-980" über die Serielle Schnittstelle steuern zu können.

    Das Plugin ist mit Sicherheit nicht perfekt, aber so bekommt man den Receiver mal eben schnell ans laufen und hat sich einiges an Schreibarbeit erspart.

    Wenn ich was mehr von der Sache verstehe, werde ich es weiter überarbeiten.
    Das mit dem sleep usw. ist mit Sicherheit nicht optimal......

    Gruß
    Florian
    Angehängte Dateien

    #2
    Hi Florian,

    danke für's Teilen.

    Ich habe mich gerade auch eingehend damit beschäftigt. Aber du bist schon ein ganzes Stück weiter.

    Ich habe den Code jetzt nur überflogen. Aber ein kurzes Feedback:
    (Detail Fehlt in Z. 835 nicht ein "my" ?)

    Da ist ja einiges an Copy&Paste Code. Geht das in Perl nicht hübscher mit Schleifen? Ich denke da nur an die Wartbarkeit, z.B. hier
    Code:
            $RM_Power_ON = sprintf("%.2x", hex(substr($request,26,2)));        		
    		if ($RM_Power_ON ne $RM_Power_ON_old){	       
    		    if (hex($operation{RM_Power_ON}) & hex($RM_Power_ON)){ 
    				knx_write($ga{RM_Power_ON} ,$on,1);
    				plugin_log($plugname, 'RM_Power_ON');
    			}else{
    				knx_write($ga{RM_Power_ON} ,$off,1);
    				plugin_log($plugname, 'RM_Power_OFF');
    			}
    		}
    		
    	my $RM_Room2_ON = sprintf("%.2x", hex(substr($request,26,2)));       		
    		if ($RM_Room2_ON ne $RM_Room2_ON_old){         		       
    		    if (hex($operation{RM_Room2_ON}) & hex($RM_Room2_ON)){
    		       	knx_write($ga{RM_Room2_ON} ,$on,1); 
    				plugin_log($plugname, 'RM_Room2_ON');
    			}else{
    				knx_write($ga{RM_Room2_ON} ,$off,1);
    				plugin_log($plugname, 'RM_Room2_OFF');
    			}
    		}
    
    ...
    Ansonsten: Der Teac hat ja leider im Protokoll 1:1 die Fernbedienungs-Funktionen auf RS232 gebracht. So kann man viele Funktionen nur toggeln, und nicht gezielt setzen.
    Also braucht man etwas Logik. Statt
    Code:
    		when($ga{Room2_mute_ON_OFF}){
    		    if ($msg{'data'} eq "01"){
    			$checksum = sprintf("%.2x",((hex($checksum_ID)) + hex($operation{Room2_mute_ON_OFF}))%256);
    			$command = pack("H*", $id . $operation{Room2_mute_ON_OFF} . $checksum);	
    			$seriel->write($command);		
    			plugin_log($plugname,'Room2_mute_ON_OFF');
    			#readStatus();
    			}
    		}
    dann
    Code:
    		when($ga{Room2_mute_ON_OFF}){
    		    if ($msg{'data'} ne $Status_Room2_mute_ON_OFF){
    			$checksum = sprintf("%.2x",((hex($checksum_ID)) + hex($operation{Room2_mute_ON_OFF}))%256);
    			$command = pack("H*", $id . $operation{Room2_mute_ON_OFF} . $checksum);	
    			$seriel->write($command);		
    			plugin_log($plugname,'Room2_mute_ON_OFF');
    			#readStatus();
    			}
    		}
    oder?

    Noch schlimmer bei Volume: Da muss man es so machen
    Code:
    while StatusVolume < VolumeGA
     increase Volume
    end
    
    while StatusVolume > VolumeGA
     decrease Volume
    end
    Vielleicht noch mit Sicherheitsabfragen ;-)
    Wenn das Wetter im Sommer schlecht ist, werde ich ggf. daran arbeiten. Ansonsten erst im (nächsten) Winter ;-)

    Gruß,
    Hendrik

    Kommentar


      #3
      Danke für deine Anmerkungen, aber ich kann leider kein Perl, darum:

      1. $RM_Power_ON wird in Zeile 39 deklariert, da ich es Global verwende.

      2. Immer wenn was geschaltet wird, Zeile 285 - 805, wird auch immer eine Statusabfrage (request) gesendet 813 - 824 und verarbeitet.

      3. Das mit dem Volume ist wirklich eine Sache die mich stört.

      Zu den for-Schleifen komme ich evt. noch aber ich musste erst mal überhaupt verstehen.....

      Freue mich um jedwede Hilfe.

      Gruß

      Kommentar


        #4
        Zitat von DasVantom Beitrag anzeigen
        Danke für deine Anmerkungen, aber ich kann leider kein Perl, darum:
        Na komm, hast du doch gerade geschrieben. Ich kann perl sicher weniger.

        2. Immer wenn was geschaltet wird, Zeile 285 - 805, wird auch immer eine Statusabfrage (request) gesendet 813 - 824 und verarbeitet.
        Macht Sinn. Aber andersrum (Reihenfolge) und eben mit prüfen, ob er jetzt toggeln sollte, oder nicht, oder?!

        3. Das mit dem Volume ist wirklich eine Sache die mich stört.
        Ist aber doch machbar!

        Zu den for-Schleifen komme ich evt. noch aber ich musste erst mal überhaupt verstehen.....

        Freue mich um jedwede Hilfe.
        Ich kann auch kein Perl.
        Aber andere hier. Vielleicht kann sich jemand den Block ansehen.

        Gruß,
        Hendrik

        Kommentar


          #5
          Ich habe das Plugin etwas engstirnig erstellt, was brauche ICH ;-).

          Der Receiver steht bei mir im Keller und wird nur über die RS232 Schnittstelle bedient.
          Sollte zusätzlich die Fernbedienung eingesetzt werden, müsste alle paar Minuten eine Statusabfrage ausgelöst werden, um die Visualisierung aktuell zu halten.
          Es könnte auch mit jedem Befehl über die Visu, als erstes, eine Statusabfrage erfolgen und dann wieder eine zur Kontrolle.


          Ich bediene den Receiver aktuell wie folgt:

          Geschaltet wird einfach der Kanal wo Musik gehört werden soll.
          Schalte ich einen Kanal ein und der Receiver ist aus, wird als erstes der Receiver eingeschaltet dann der Kanal.
          Ausschalten funktioniert auch über den Kanal, ist kein Kanal mehr an, wird der Receiver nach der cycle-Zeit ausgeschaltet. Vor dem ausschalten wird die Lautstärke noch auf Leise gesetzt.
          Ich schalte den Receiver nie direkt ein oder aus, somit wir nie ein Raum ungewollt eingeschaltet.

          Möchte ich in der zweiten Zone was andere hören, schalte ich diese nachträglich ein und wähle die Quelle. (Hier könnte man auch sagen, tippe ich in der 2 Zone auf eine andere Quelle, Zone 2 einschalten, ist aber nicht umgesetzt)

          Die Statusabfrage erfolgt immer nach dem Schalten, somit kann man sehen, ob der Receiver den Befehl erhalten hat.


          "Vereinfachung" durch Schleifen mache ich erst mal nicht, da ich so weiß was wo passiert und man es "einfach" erweitern kann.


          Womit ich auch noch nicht klar komme.
          Der Receiver braucht ca. 1 Sekunde um ein Signal über die RS232 Schnittstelle zu verarbeiten. Somit gibt es an ein paar Stellen ein sleep, was nicht toll ist. Evt. Gibt es auch die Möglichkeit die Schnittstelle anders zu konfigurieren und mit einem Sendepuffer zu arbeiten, welcher die Befehle nach und nach absetzt incl. Statusabfrage welche dann wieder das Plugin aufrufen müsste.


          Mit der Änderung der Lautstärke ist das auch so eine Sache.
          Wenn man die Lautstärke um 10 erhöhen möchte und 10 befehle gleichzeitig schickt, erhöht der Receiver die im Sekundentakt (bin mir da nicht mehr ganz sicher).
          Würde man das über eine Dimm-Funktion versuchen, ist man evt. zu lange im Plugin.

          Da man den Status der Lautstärke kennt, würde man das wohl über einen Slider oder Fixe Werte (+1 +5 +10) lösen müssen. Fix +10, es wird 10x Lautstärke erhöhen gesendet. Slider, es müssten die Anzahl der Befehle errechnet werden.


          Man kann bestimmt noch ein paar Sachen machen, aber der Funktionsumfang und die Ansteuermöglichkeiten halten sich in Grenzen. Was mir aber vollkommen ausreicht.
          Ich werde das Plugin die Tage mal überarbeite und versuchen es etwas Benutzerfreundlicher zu gestalten.

          Gruß
          Florian

          PS: Regentage sollte es ja in Deutschland genug geben ;-)

          Kommentar

          Lädt...
          X