Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. [Vorlage] Denon Skript

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    3.0k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

[Vorlage] Denon Skript

Scheduled Pinned Locked Moved Skripten / Logik
141 Posts 35 Posters 34.2k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Offline
    K Offline
    Kueppert
    wrote on last edited by
    #47

    Versucht doch Mal, eine Doku für euren Receiver zu finden wie ich oben eine für meinen angehangen habe. Evtl sind die Befehle für den 1100 anders?

    Gesendet von meinem HUAWEI RIO-L01 mit Tapatalk

    UDM Pro, Intel NUC - ioBroker in Proxmox-VM, PiHole+Grafana&Influx+TasmoAdmin in LXCs, Raspberry Pi3 (als CCU), Zigbee-Stick Sonoff, Synology DS918+

    1 Reply Last reply
    0
    • L Offline
      L Offline
      Lucky
      wrote on last edited by
      #48

      Moin Moin ;-)

      tragt bitte die IP Adresse NICHT im Skript ein, sondern in dem dafür gedachten State, das Skript überprüft diese auf richtige Schreibweise sobald sich der Wert ändert !

      Das ist auch der Grund für die Meldung "ungültige IP Adresse"

      Da ich natürlich nicht jedes Gerät testen kann, könnt ihr im State "Command to AVR" direkt die Befehle aus der passenden API zu eurem Gerät eintragen um diese zu testen.
      2611_unbenannt.png

      1 Reply Last reply
      0
      • lobomauL Offline
        lobomauL Offline
        lobomau
        wrote on last edited by
        #49

        @Lucky:

        Moin Moin ;-)

        tragt bitte die IP Adresse NICHT im Skript ein, sondern in dem dafür gedachten State, das Skript überprüft diese auf richtige Schreibweise sobald sich der Wert ändert !

        Das ist auch der Grund für die Meldung "ungültige IP Adresse"

        Da ich natürlich nicht jedes Gerät testen kann, könnt ihr im State "Command to AVR" direkt die Befehle aus der passenden API zu eurem Gerät eintragen um diese zu testen. `
        :lol: Sachen gibt´s, die gibt´s gar nicht :D

        Hab vorher alle states gelöscht, Script gestartet, gibt Fehler ungültige IP und paar Warnungen, dann in Objekte die IP eingetragen und es läuft!
        1146_unbenannt.jpg

        Host: NUC8i3 mit Proxmox:

        • ioBroker CT Debian 13, npm 10.9.4, nodejs 22.21.0
        • Slave: Pi4
        1 Reply Last reply
        0
        • L Offline
          L Offline
          Lucky
          wrote on last edited by
          #50

          alles wird gut :D

          wenn du States manuell löscht und dann das Skript neu Startest, ist es normal das erstmal Fehler auflaufen, da die State dann neu beschrieben werden ;-) beim nächsten Start sollte auch das weg sein.

          Hier nochmal eine überarbeitete Version mit folgenden Änderungen:

          1. Fehler bei System Power OFF behoben (Danke für den Hinweis von Kueppert)

          2. Fehler beim Manuellen umschalten der Tunerfrequenz behoben

          3. Nach dem letzten Firmware Update des AVR ist es bei mir so, das wenn als Quelle NET z.b. Spotify gewählt ist, der AVR nicht mehr seine OSD Informationen selbständig updatet, für diesen Fall habe ich einen Updateintervall eingeführt.

          4. mit dem State "Log" unter System kann der das Loggen des Regulären Datenstroms ausgeschaltet werden, was den Log sehr aufräumt ;-)

          <size size="150">hier die Aktuelle Version !!!</size>

          ! ```
          `//Kontakt: s-nolte@htp-tel.de
          //ioBroker Forum: Lucky
          var net = require('net');
          ! // System
          createState('javascript.0.Denon.System.UPDATE', false,{type: "boolean", role: "button"});
          createState('javascript.0.Denon.System.Power_System', false,{type: "boolean", role: "Power System"});
          createState('javascript.0.Denon.System.System_Ready', false,{type: "boolean", role: "System Ready",write:false});
          createState('javascript.0.Denon.System.IP_Adresse', '000.000.000.000',{type: "string", role: "AVR IP Adresse"});
          createState('javascript.0.Denon.System.Trigger_1', false,{type: "boolean", role: "Trigger 1"});
          createState('javascript.0.Denon.System.Trigger_2', false,{type: "boolean", role: "Trigger 2"});
          createState('javascript.0.Denon.System.Command', '',{type: "string", role: "Command to AVR"});
          createState('javascript.0.Denon.System.Display_Dimmer',0,{type: "number", role: "FL Display Dimmer",states: "0:BRI;1:DIM;2:DAR;3:OFF"});
          createState('javascript.0.Denon.System.Verbunden',false,{type: "boolean", role: "Verbindung hergestellt",write:false});
          createState('javascript.0.Denon.System.Name',{type: "string", role: "Netzwerk-Name",write:false});
          createState('javascript.0.Denon.System.Log', true,{type: "boolean", role: "Log für Tx/Rx Daten"});
          ! //OSD
          createState('javascript.0.Denon.OSD.OSD_Info_List0', 'init',{type: "string", role: "Onscreen Display Info List00",write:false});
          createState('javascript.0.Denon.OSD.OSD_Info_List1', 'init',{type: "string", role: "Onscreen Display Info List01",write:false});
          createState('javascript.0.Denon.OSD.OSD_Info_List2', 'init',{type: "string", role: "Onscreen Display Info List02",write:false});
          createState('javascript.0.Denon.OSD.OSD_Info_List3', 'init',{type: "string", role: "Onscreen Display Info List03",write:false});
          createState('javascript.0.Denon.OSD.OSD_Info_List4', 'init',{type: "string", role: "Onscreen Display Info List04",write:false});
          createState('javascript.0.Denon.OSD.OSD_Info_List5', 'init',{type: "string", role: "Onscreen Display Info List05",write:false});
          createState('javascript.0.Denon.OSD.OSD_Info_List6', 'init',{type: "string", role: "Onscreen Display Info List06",write:false});
          createState('javascript.0.Denon.OSD.OSD_Info_List7', 'init',{type: "string", role: "Onscreen Display Info List07",write:false});
          createState('javascript.0.Denon.OSD.OSD_Info_List8', 'init',{type: "string", role: "Onscreen Display Info List08",write:false});
          ! //Controls
          createState('javascript.0.Denon.Control.Play', false,{type:"boolean", role: "button"});
          createState('javascript.0.Denon.Control.Stop', false,{type: "boolean", role: "button"});
          createState('javascript.0.Denon.Control.Pause', false,{type: "boolean", role: "button"});
          createState('javascript.0.Denon.Control.Skip_Plus', false,{type: "boolean", role: "button"});
          createState('javascript.0.Denon.Control.Skip_Minus', false,{type: "boolean", role: "button"});
          createState('javascript.0.Denon.Control.Page_Next', false,{type: "boolean", role: "button"});
          createState('javascript.0.Denon.Control.Page_Previous', false,{type: "boolean", role: "button"});
          ! //Tuner Control
          createState('javascript.0.Denon.Tuner_Control.Frequency_UP', false,{type:"boolean", role: "button"});
          createState('javascript.0.Denon.Tuner_Control.Frequency_DOWN', false,{type:"boolean", role: "button"});
          createState('javascript.0.Denon.Tuner_Control.Preset_UP', false,{type:"boolean", role: "button"});
          createState('javascript.0.Denon.Tuner_Control.Preset_DOWN', false,{type:"boolean", role: "button"});
          createState('javascript.0.Denon.Tuner_Control.RDS_Station_Name', 'init',{type:"string", role: "RDS Station Name",write:false});
          createState('javascript.0.Denon.Tuner_Control.Preset_Number',0,{type:"number", role: "Preset No."});
          ! //Zone_Main
          createState('javascript.0.Denon.Zone_Main.Power', false,{type: "boolean", role: "Power Status Zone Main"});
          createState('javascript.0.Denon.Zone_Main.Mute', false,{type: "boolean", role: "Mute Status"});
          createState('javascript.0.Denon.Zone_Main.Master_Volume', 0,{type: "number", role: "Master Volume"});
          createState('javascript.0.Denon.Zone_Main.Master_Volume_UP', false,{type: "boolean", role: "button"});
          createState('javascript.0.Denon.Zone_Main.Master_Volume_DOWN', false,{type: "boolean", role: "button"});
          createState('javascript.0.Denon.Zone_Main.Master_Volume_Max', 0,{type: "number", role: "Master Volume Max",write:false});
          createState('javascript.0.Denon.Zone_Main.Video_Input', 1,{type: "number", role: "Selected Video Input",
          states:"0:DVD;1:BD;2:TV;3:SAT/CBL;4:MPLAY;5:GAME;6:AUX1;7:AUX2;8:AUX3;9:AUX4;10:AUX5;11:AUX6;12:AUX7;13:CD"});
          createState('javascript.0.Denon.Zone_Main.Video_State', false,{type: "boolean", role: "Video ON/OFF"});
          createState('javascript.0.Denon.Zone_Main.Input_Text',5,{type: "string", role: "Input Text",write:false});
          createState('javascript.0.Denon.Zone_Main.Select_Input',5,{type: "number", role: "Select Input",
          states: "0:PHONO;1:CD;2:TUNER;3:DVD;4:BD;5:TV;6:SAT/CBL;7:MPLAY;8:GAME;9:NET;10:SPATIFY;11:LASTFM;12:IRADIO;13:SERVER;14:FAVOTITES;15:AUX1;16:AUX2;17:AUX3;18:AUX4;19:AUX5;20:AUX6;21:AUX7"});
          createState('javascript.0.Denon.Zone_Main.Surround_Mode', 'init',{type: "string", role: "Surround Modus",write:false});
          createState('javascript.0.Denon.Zone_Main.Ratio_Mode', 'init',{type: "string", role: "Ratio Modus",write:false});
          createState('javascript.0.Denon.Zone_Main.Resolution', 'init',{type: "string", role: "Video Resolution",write:false});
          createState('javascript.0.Denon.Zone_Main.Sound_Parameter', 'init',{type: "string", role: "Sound_Parameter",write:false});
          createState('javascript.0.Denon.Zone_Main.HDMI_Monitor',0,{type: "number", role: "HDMI Monitor Out",states: "0:MONIAUTO;1:MONI1;2:MONI2"});
          ! //Zone 2
          createState('javascript.0.Denon.Zone_2.Power_Zone2', false,{type: "boolean", role: "Power Status Zone 2"});
          createState('javascript.0.Denon.Zone_2.Mute', false,{type: "boolean", role: "Mute Status Zone 2"});
          createState('javascript.0.Denon.Zone_2.Volume', 0,{type: "number", role: "Zone 2 Volume"});
          createState('javascript.0.Denon.Zone_2.Volume_UP', 0,{type: "boolean", role: "button"});
          createState('javascript.0.Denon.Zone_2.Volume_DOWN', 0,{type: "boolean", role: "button"});
          createState('javascript.0.Denon.Zone_2.Select_Input',5,{type: "number", role: "Select Input",
          states: "0:PHONO;1:CD;2:TUNER;3:DVD;4:BD;5:TV;6:SAT/CBL;7:MPLAY;8:GAME;9:NET;10:SPATIFY;11:LASTFM;12:IRADIO;13:SERVER;14:FAVOTITES;15:AUX1;16:AUX2;17:AUX3;18:AUX4;19:AUX5;20:AUX6;21:AUX7"});
          ! //Zone 3
          createState('javascript.0.Denon.Zone_3.Power_Zone3', false,{type: "boolean", role: "Power Status Zone 3"});
          createState('javascript.0.Denon.Zone_3.Mute', false,{type: "boolean", role: "Mute Status Zone 3"});
          createState('javascript.0.Denon.Zone_3.Volume', 0,{type: "number", role: "Zone 3 Volume"});
          createState('javascript.0.Denon.Zone_3.Volume_UP', 0,{type: "boolean", role: "button"});
          createState('javascript.0.Denon.Zone_3.Volume_DOWN', 0,{type: "boolean", role: "button"});
          createState('javascript.0.Denon.Zone_3.Select_Input',5,{type: "number", role: "Select Input",
          states: "0:PHONO;1:CD;2:TUNER;3:DVD;4:BD;5:TV;6:SAT/CBL;7:MPLAY;8:GAME;9:NET;10:SPATIFY;11:LASTFM;12:IRADIO;13:SERVER;14:FAVOTITES;15:AUX1;16:AUX2;17:AUX3;18:AUX4;19:AUX5;20:AUX6;21:AUX7"});
          ! // Variablen-------------------------------------------------------------------------
          var AVR_Command =['PW','MVMAX','MV','CV','MU','SI','ZM','SD','DC','SV','SLP','STBY','ECO','MS','VS','PS','PV','Z2','Z2MU','Z2CS','Z2CV','Z2HPF',
          'Z2PS','Z2HDS','Z2SLP','Z2STBY','Z3','Z3MU','Z3CS','Z3CV','Z3HPF','Z3PS','Z3SLP','Z3STBY','TFANNAME','TPANMEM','NSET1','NSE','TR','DIM','NSFRN']; // räume den mist später auf ;-)
          var t_request = 100; //beim ersten Start Funktion update aufrufen mit 100ms zwischen den Anfragen, maximal 50ms !
          var client;
          var PW_Request =0;
          ! setState('javascript.0.Denon.System.Verbunden',val=false,akt=false);
          checkIP(getState('javascript.0.Denon.System.IP_Adresse').val);
          ! function checkIP(IP){ //IP Adresse prüfen
          if(net.isIPv4(IP)){
          setTimeout(function () {
          client=Connect(IP);
          },2000);
          }
          else{console.error('ungültige IP Adresse')}
          }

          function Connect(IP){ // zu Server Verbinden

          ! var client = net.connect({host:IP, port:23});
          client.setKeepAlive(true,5000);

             console.log('Connectig...');
          
          client.on('error',function(error) {
              console.error(error);
              killClient(client);
          }); 
          
          client.on('connect', function () {          //Verbindung hergestellt
          console.log('Verbunden mit Denon AVR !');
           {setState('javascript.0.Denon.System.Verbunden',val=true,akt=true)}
            update(t_request); 
          });
          

          ! client.on('end', function () { //die Gegenseite hat die Verbindung geschlossen
          {setState('javascript.0.Denon.System.Verbunden',val=false,akt=true)}
          console.warn('Denon AVR hat die Verbindung geschlossen !');
          killClient(client);
          });

           client.on('data', function (data) {
          
                if (getState('javascript.0.Denon.System.Log').val===true){
                 console.log(data.toString());         //log für kommende Daten ################################################################################################
                }
               response(data);
          
           });
          

          return client;
          }//end of Function Connect

          ! function killClient(client){
          {setState('javascript.0.Denon.System.Verbunden',val=false,akt=true)}
          client.destroy();
          client.unref();
          console.log('Connection closed !');
          }
          ! // Funktion Nachricht Senden----------------------------------------------------------
          function sendMessage(message) {
          if(getState('javascript.0.Denon.System.Verbunden').val===true){

          client.write(message+'\r');
          if (message=='PWON'||'ZMON'||'Z2ON'||'Z3ON'){PW_Request=1}
          
              if (getState('javascript.0.Denon.System.Log').val===true){
              console.log('Anfrage: '+ message );   // log für gesendete Daten  ################################################################################################
              }
          }
          

          }
          //Daten anfordern--------------------------------------------------------------------
          function update(Time){
          console.log('Update Start');
          var i_Pollen=0;
          var Request =['NSET1 ?','NSFRN ?','ZM?','MU?','PW?','SI?','SV?','MS?','MV?','Z2?','Z2MU?','Z3?','Z3MU?','NSE','VSSC ?','VSASP ?','VSMONI ?','TR?','DIM ?'];
          Intervall = setInterval(function () {

              sendMessage(Request[i_Pollen]);
          
              i_Pollen++;
          
                  if (i_Pollen==Request.length){
                      i_Pollen=0;
                      clearInterval(Intervall);
                  }
          
          }, Time);
          

          return true;
          }

          ! function StateText_toArray (StateNames){
          var StateName = StateNames.split(';');
          var StateArr=[];
          for(var i = 0; i < StateName.length; i++) {
          var ele = StateName[i].split(':');
          StateArr[ele[0]] = ele[1];
          }

          return StateArr;
          }

          ! // Daten empfangen------------------------------------------------------------------
          ! function response (data) {

          ! var AVR_Response=data.toString().replace(/[\n\r]/g, ''); // Steuerzeichen "CR" entfernen
          ! for (i = 0; i < AVR_Command.length; i++) {

              var search_index=AVR_Response.search(AVR_Command[i]);
          
              if (search_index===0){
                  break;
              }
          
          }
          
          var id,val;
          
          switch(AVR_Command[i]){  
              case 'MU':
                  // to Request MU?
                  if (AVR_Response=='MUOFF'){setState("javascript.0.Denon.Zone_Main.Mute",false,akt=true)}
                  if (AVR_Response=='MUON'){setState("javascript.0.Denon.Zone_Main.Mute",true,akt=true)}
                 break;
          
              case 'PW':  
                  // to Request PW?
                 if (AVR_Response=='PWSTANDBY'){
                     setState('javascript.0.Denon.System.Power_System',false,akt=true);
                     setState('javascript.0.Denon.System.System_Ready',false,akt=true);
                     if ("undefined" !== typeof StaticPollen){clearInterval(StaticPollen)}
                 }
                 if (AVR_Response=='PWON'){
                     if(PW_Request==1){
                     setState('javascript.0.Denon.System.Power_System',true,akt=true);
                     PW_Request++;
                     }
                     else if(PW_Request==2){
                         setState('javascript.0.Denon.System.System_Ready',true,akt=true);
                         PW_Request=0;
                     }
          
                 }
          
                 break;
          
              case'Z2':
                 if (AVR_Response=='Z2OFF'){setState('javascript.0.Denon.Zone_2.Power_Zone2',false,akt=true)}
                 else if (AVR_Response=='Z2ON'){setState('javascript.0.Denon.Zone_2.Power_Zone2',true,akt=true)}
                 else if (AVR_Response=='Z2MUON'){setState('javascript.0.Denon.Zone_2.Mute',true,akt=true)}
                 else if (AVR_Response=='Z2MUOFF'){setState('javascript.0.Denon.Zone_2.Mute',true,akt=true)}
                  else if (true !==isNaN(parseInt(AVR_Response.slice(2,4)))){
          
                      setState("javascript.0.Denon.Zone_2.Volume",parseFloat(AVR_Response.slice(2,4)),akt=true)}
                   else {
          
                    AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                  id='javascript.0.Denon.Zone_2.Select_Input';
                  val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response);
                  if (val>=0){setState(id,val,akt=true);}
                   }
                  break;
          
              case'Z3':
                 if (AVR_Response=='Z3OFF'){setState('javascript.0.Denon.Zone_3.Power_Zone3',false,akt=true)}
                 else if (AVR_Response=='Z3ON'){setState('javascript.0.Denon.Zone_3.Power_Zone3',true,akt=true)}
                 else if (AVR_Response=='Z3MUON'){setState('javascript.0.Denon.Zone_3.Mute',true,akt=true)}
                 else if (AVR_Response=='Z3MUOFF'){setState('javascript.0.Denon.Zone_3.Mute',true,akt=true)}
                  else if (true !==isNaN(parseInt(AVR_Response.slice(2,4)))){
          
                      setState("javascript.0.Denon.Zone_3.Volume",parseFloat(AVR_Response.slice(2,4)),akt=true)}
                   else {
          
                    AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                  id='javascript.0.Denon.Zone_3.Select_Input';
                  val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response);
                  if (val>=0){setState(id,val,akt=true);}
                   }
                  break;    
          
              case 'MV':
                  // to Request MV?
                  AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                  if (AVR_Response.length<3){AVR_Response=AVR_Response+'0'}
                  AVR_Response=AVR_Response.slice(0, 2)+'.'+AVR_Response.slice(2, 3);
                 setState("javascript.0.Denon.Zone_Main.Master_Volume",parseFloat(AVR_Response),akt=true);
          
                 break;
          
               case 'MVMAX':
                  AVR_Response=AVR_Response.slice(6,AVR_Response.length);
                  AVR_Response=AVR_Response.slice(0, 2)+'.'+AVR_Response.slice(2, 3);
                 setState("javascript.0.Denon.Zone_Main.Master_Volume_Max",parseFloat(AVR_Response),akt=true);
                 break;  
          
              case 'SV': 
                  // to Request SV?
                  if (AVR_Response=='SVOFF'){setState("javascript.0.Denon.Zone_Main.Video_State",false,akt=true)}
                  else if (AVR_Response=='SVON'){setState("javascript.0.Denon.Zone_Main.Video_State",true,akt=true)}
                  else {
          
                  AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                  id = 'javascript.0.Denon.Zone_Main.Video_Input';
                  val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response); //suche in array nach element
          
                  setState(id,val,akt=true);
                  }
                 break;
          
              case 'SI':
                  // to Request SI?
                  AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                  id='javascript.0.Denon.Zone_Main.Select_Input';
                  val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response);
          
                  setState(id,val,akt=true);
                  setState('javascript.0.Denon.Zone_Main.Input_Text',AVR_Response,akt=true);
          
                 if (AVR_Response=='NET'){
                  StaticPollen=setInterval(sendMessage,2000,'NSE');  //wenn Quelle = NET ist (z.b. Spotify) OSD Informationen Pollen mit 2s
                  }
          
                 else {if ("undefined" !== typeof StaticPollen){clearInterval(StaticPollen)}
                 }
                 break;  
          
              case 'ZM':
                  // to Request ZM?
                  if (AVR_Response=='ZMOFF'){setState('javascript.0.Denon.Zone_Main.Power',false,akt=true)}
                  if (AVR_Response=='ZMON'){setState('javascript.0.Denon.Zone_Main.Power',true,akt=true)}
                 break;
          
              case 'MS':
                  // to Request MS? 
                  AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                  setState("javascript.0.Denon.Zone_Main.Surround_Mode",AVR_Response,akt=true);
                 break;
          
              case 'VS':
          
                  // to Request VSASP ?
                  id = "javascript.0.Denon.Zone_Main.Ratio_Mode";
                  if (AVR_Response=='VSASPFUL'){setState(id,'16:9',akt=true)}
                  else if (AVR_Response=='VSASPNRM'){setState(id,'4:3',akt=true)}
          
                  // to Request VSSC ?
                  id = "javascript.0.Denon.Zone_Main.Resolution";
                  if (AVR_Response=='VSSC48P'){setState(id,'480p/576p',akt=true)}
                  else if (AVR_Response=='VSSC10I'){setState(id,'1080i',akt=true)}
                  else if (AVR_Response=='VSSC72P'){setState(id,'720p',akt=true)}
                  else if (AVR_Response=='VSSC10P'){setState(id,'1080p',akt=true)}
                  else if (AVR_Response=='VSSC10P24'){setState(id,'1080p:24Hz',akt=true)}
                  else if (AVR_Response=='VSSC4K'){setState(id,'4K',akt=true)}
                  else if (AVR_Response=='VSSC4KF'){setState(id,'4K 60/50Hz',akt=true)}
                  else if (AVR_Response=='VSSCAUTO'){setState(id,'AUTO',akt=true)}
          
                  //to Request MONI ? 
                  id='javascript.0.Denon.Zone_Main.HDMI_Monitor';
                   if (AVR_Response=='VSMONIAUTO'){setState(id,0,akt=true)}
                   else if (AVR_Response=='VSMONI1'){setState(id,1,akt=true)}
                   else if (AVR_Response=='VSMONI2'){setState(id,2,akt=true)}
                 break; 
          
              case 'PS':
          
                  // to Request PSMODE: ?
                  setState("javascript.0.Denon.Zone_Main.Sound_Parameter",AVR_Response.slice(7,AVR_Response.length),akt=true);
                  break;
          
              case 'NSE':
          
                    // to Request NSE  // Achtung ohne ? 
                  id='javascript.0.Denon.OSD.OSD_Info_List'+AVR_Response.slice(3, 4);
          
                  if (getState(id)) {             //prüfen ob State vorhanden ist
                  setState (id,AVR_Response=AVR_Response.slice(4,AVR_Response.length),akt=true);
                  }
          
                  break;
          
              case 'TR':
          
                  if (AVR_Response=='TR1 OFF'){setState('javascript.0.Denon.System.Trigger_1',false,akt=true)}
                  else if (AVR_Response=='TR1 ON'){setState('javascript.0.Denon.System.Trigger_1',true,akt=true)}
                  else if (AVR_Response=='TR2 OFF'){setState('javascript.0.Denon.System.Trigger_2',false,akt=true)}
                  else if (AVR_Response=='TR2 ON'){setState('javascript.0.Denon.System.Trigger_2',true,akt=true)}
                  break;
          
              case 'DIM':
                   AVR_Response=AVR_Response.slice(4,AVR_Response.length);
                  id='javascript.0.Denon.System.Display_Dimmer';
                  val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response);
          
                  setState(id,val,akt=true);
          
                  break;
          
              case 'TFANNAME':
                   setState('javascript.0.Denon.Tuner_Control.RDS_Station_Name',val=AVR_Response.slice(8,AVR_Response.length),akt=true);    
                  break;
          
              case 'TPANMEM':
                  AVR_Response=AVR_Response.slice(7,AVR_Response.length);
                  if (AVR_Response.length==2){         //29.08.2017 angepasst
                  setState('javascript.0.Denon.Tuner_Control.Preset_Number',parseInt(AVR_Response),akt=true);
                  }
          
                  break;
          
              case 'NSET1':
                  if (AVR_Response.slice(5,8)=='IPA'){
                      var IPstring=AVR_Response.slice(9,AVR_Response.length);
                      if(IPstring[12]=='0'){
                      IPstring=IPstring.substr(0, 12) + '' + IPstring.substr(13,14);
                      }
          

          ! setState('javascript.0.Denon.System.IP_Adresse',val=IPstring,akt=true);

                  }
                  break;    
          
              case 'NSFRN': 
                  setState('javascript.0.Denon.System.Name',val=AVR_Response.slice(5,AVR_Response.length),akt=true);
                  break;
          
              default:
                  //console.log('häääää????');
          }
          

          }

          //--------------------------------------------------------------------------------------
          on('javascript.0.Denon.System.IP_Adresse', function (obj){
          if(getState('javascript.0.Denon.System.Verbunden').val===true){

          killClient(client);
             checkIP(obj.state.val);
          }
          else{checkIP(obj.state.val)}
          

          });

          ! on({id:'javascript.0.Denon.System.UPDATE',val:true}, function (obj){

             update(t_request);
          

          });

          ! on({id:"javascript.0.Denon.System.Command",change:"any"}, function (obj){sendMessage(obj.state.val+'')});
          ! on("javascript.0.Denon.System.Power_System", function (obj){
          if (!obj.state.ack) {
          if (obj.state.val){
          sendMessage('PWON');
          }
          else{sendMessage('PWSTANDBY')}
          }
          });
          ! on('javascript.0.Denon.Zone_Main.Power', function (obj){
          if (!obj.state.ack) {
          if (obj.state.val){
          sendMessage('ZMON');
          }
          else{sendMessage('ZMOFF')}
          }
          });
          ! on('javascript.0.Denon.Zone_2.Power_Zone2', function (obj){
          if (!obj.state.ack) {
          if (obj.state.val){sendMessage('Z2ON')}
          else{sendMessage('Z2OFF')}
          }
          });
          ! on('javascript.0.Denon.Zone_3.Power_Zone3', function (obj){
          if (!obj.state.ack) {
          if (obj.state.val){sendMessage('Z3ON')}
          else{sendMessage('Z3OFF')}
          }
          });
          ! on("javascript.0.Denon.Zone_Main.Mute", function (obj){
          if (!obj.state.ack) {
          if (obj.state.val){sendMessage('MUON')}
          else{sendMessage('MUOFF')}
          }
          });
          ! on("javascript.0.Denon.Zone_2.Mute", function (obj){
          if (!obj.state.ack) {
          if (obj.state.val){sendMessage('Z2MUON')}
          else{sendMessage('Z2MUOFF')}
          }
          });
          ! on("javascript.0.Denon.Zone_3.Mute", function (obj){
          if (!obj.state.ack) {
          if (obj.state.val){sendMessage('Z3MUON')}
          else{sendMessage('Z3MUOFF')}
          }
          });
          ! on("javascript.0.Denon.Zone_Main.Master_Volume", function (obj){
          if (!obj.state.ack) {
          sendMessage('MV'+obj.state.val+'');
          }
          });
          ! on({id:"javascript.0.Denon.Zone_Main.Master_Volume_UP",val:true}, function (obj){
          if (!obj.state.ack) {
          sendMessage('MVUP'+'');
          }
          });
          ! on({id:"javascript.0.Denon.Zone_Main.Master_Volume_DOWN",val:true}, function (obj){
          if (!obj.state.ack) {
          sendMessage('MVDOWN'+'');
          }
          });
          ! on("javascript.0.Denon.Zone_2.Volume", function (obj){
          if (!obj.state.ack) {
          sendMessage('Z2'+obj.state.val+'');
          }
          });
          ! on({id:"javascript.0.Denon.Zone_2.Volume_UP",val:true}, function (obj){
          if (!obj.state.ack) {
          sendMessage('Z2UP'+'');
          }
          });
          ! on({id:"javascript.0.Denon.Zone_2.Volume_DOWN",val:true}, function (obj){
          if (!obj.state.ack) {
          sendMessage('Z2DOWN'+'');
          }
          });
          ! on("javascript.0.Denon.Zone_3.Volume", function (obj){
          if (!obj.state.ack) {
          sendMessage('Z3'+obj.state.val+'');
          }
          });
          ! on({id:"javascript.0.Denon.Zone_3.Volume_UP",val:true}, function (obj){
          if (!obj.state.ack) {
          sendMessage('Z3UP'+'');
          }
          });
          ! on({id:"javascript.0.Denon.Zone_3.Volume_DOWN",val:true}, function (obj){
          if (!obj.state.ack) {
          sendMessage('Z3DOWN'+'');
          }
          });
          ! on({id:"javascript.0.Denon.Control.Play",vla:true}, function (obj){
          sendMessage('NS9A')
          });
          ! on({id:"javascript.0.Denon.Control.Stop",val:true}, function (obj){
          sendMessage('NS9C')
          });
          ! on({id:"javascript.0.Denon.Control.Pause",val:true}, function (obj){
          //if (obj.state.val===true){sendMessage('NS9B')}
          sendMessage('NS9B');
          });
          ! on({id:"javascript.0.Denon.Control.Skip_Plus",val:true}, function (obj){
          sendMessage('NS9D')
          });
          ! on({id:"javascript.0.Denon.Control.Skip_Minus",val:true}, function (obj){
          sendMessage('NS9E')
          });
          ! on({id:"javascript.0.Denon.Control.Page_Next",val:true}, function (obj){
          sendMessage('NS9X')
          });
          ! on({id:"javascript.0.Denon.Control.Page_Previous",val:true}, function (obj){
          sendMessage('NS9Y')
          });
          ! on('javascript.0.Denon.Zone_Main.Select_Input', function (obj){
          if (!obj.state.ack) {
          if(obj.state.val>=0){
          sendMessage('SI'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
          }
          }
          });
          ! on('javascript.0.Denon.Zone_2.Select_Input', function (obj){
          if (!obj.state.ack) {
          if(obj.state.val>=0){
          sendMessage('Z2'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
          }
          }
          });
          ! on('javascript.0.Denon.Zone_3.Select_Input', function (obj){
          if (!obj.state.ack) {
          if(obj.state.val>=0){
          sendMessage('Z3'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
          }
          }
          });
          ! on('javascript.0.Denon.Zone_Main.Video_Input', function (obj){
          if (!obj.state.ack) {
          if(obj.state.val>=0){
          sendMessage('SV'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
          }
          }
          });
          ! on('javascript.0.Denon.Zone_Main.Video_State', function (obj){
          if (!obj.state.ack) {
          if (obj.state.val===true){sendMessage('SVON')}
          else{sendMessage('SVOFF')}
          }
          });
          ! on('javascript.0.Denon.Zone_Main.HDMI_Monitor', function (obj){
          if (!obj.state.ack) {
          if(obj.state.val>=0){
          sendMessage('VS'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
          }
          }
          });
          ! on("javascript.0.Denon.System.Trigger_1", function (obj){
          if (!obj.state.ack) {
          if (obj.state.val===true){sendMessage('TR1 ON')}
          else{sendMessage('TR1 OFF')}
          }
          });
          ! on("javascript.0.Denon.System.Trigger_2", function (obj){
          if (!obj.state.ack) {
          if (obj.state.val===true){sendMessage('TR2 ON')}
          else{sendMessage('TR2 OFF')}
          }
          });
          ! on('javascript.0.Denon.System.Display_Dimmer', function (obj){
          if (!obj.state.ack) {
          if(obj.state.val>=0){
          sendMessage('DIM '+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
          }
          }
          });
          ! on({id:'javascript.0.Denon.Tuner_Control.Frequency_UP',val:true}, function (obj){sendMessage('TFANUP')});
          ! on({id:'javascript.0.Denon.Tuner_Control.Frequency_DOWN',val:true}, function (obj){sendMessage('TFANDOWN')});
          ! on({id:'javascript.0.Denon.Tuner_Control.Preset_UP',val:true}, function (obj){sendMessage('TPANUP')});
          ! on({id:'javascript.0.Denon.Tuner_Control.Preset_DOWN',val:true}, function (obj){sendMessage('TPANDOWN')});
          ! on('javascript.0.Denon.Tuner_Control.Preset_Number', function (obj){
          if (obj.state.val.toString().length<2){
          sendMessage('TPAN'+'0'+obj.state.val.toString())
          }
          else{sendMessage('TPAN'+obj.state.val.toString())}

          });

          ! //---------------------------------------------------------------------------------------
          ! // close connection if script stopped-------------------------------------------------
          onStop(function () {
          if(getState('javascript.0.Denon.System.Verbunden').val===true){killClient(client)};
          }, 2000 /ms/);` [/i][/i][/i]

          1 Reply Last reply
          0
          • D Offline
            D Offline
            djtale2003
            wrote on last edited by
            #51

            @Jey Cee:

            Wirklich? 3 Beiträge über deinem.

            Gesendet von Unterwegs `

            Ich habe mich an dem Datum orientiert. Sorry

            1 Reply Last reply
            0
            • D Offline
              D Offline
              djtale2003
              wrote on last edited by
              #52

              @lobomau:

              @Lucky:

              Moin Moin ;-)

              tragt bitte die IP Adresse NICHT im Skript ein, sondern in dem dafür gedachten State, das Skript überprüft diese auf richtige Schreibweise sobald sich der Wert ändert !

              Das ist auch der Grund für die Meldung "ungültige IP Adresse"

              Da ich natürlich nicht jedes Gerät testen kann, könnt ihr im State "Command to AVR" direkt die Befehle aus der passenden API zu eurem Gerät eintragen um diese zu testen. `
              :lol: Sachen gibt´s, die gibt´s gar nicht :D

              Hab vorher alle states gelöscht, Script gestartet, gibt Fehler ungültige IP und paar Warnungen, dann in Objekte die IP eingetragen und es läuft!

              Unbenannt.JPG `

              Wo kommen die Ordner her?

              Kann mir bitte jemand schritt für schritt erklären, was ich machen muß? Was muß alles installiert sein, damit das script funktioniert?

              Ausser der falschen IP-Meldung passiert gar nichts.

              1 Reply Last reply
              0
              • lobomauL Offline
                lobomauL Offline
                lobomau
                wrote on last edited by
                #53

                @djtale2003:

                @lobomau:

                @Lucky:

                Moin Moin ;-)

                tragt bitte die IP Adresse NICHT im Skript ein, sondern in dem dafür gedachten State, das Skript überprüft diese auf richtige Schreibweise sobald sich der Wert ändert !

                Das ist auch der Grund für die Meldung "ungültige IP Adresse"

                Da ich natürlich nicht jedes Gerät testen kann, könnt ihr im State "Command to AVR" direkt die Befehle aus der passenden API zu eurem Gerät eintragen um diese zu testen. `
                :lol: Sachen gibt´s, die gibt´s gar nicht :D

                Hab vorher alle states gelöscht, Script gestartet, gibt Fehler ungültige IP und paar Warnungen, dann in Objekte die IP eingetragen und es läuft!

                Unbenannt.JPG `

                Wo kommen die Ordner her?

                Kann mir bitte jemand schritt für schritt erklären, was ich machen muß? Was muß alles installiert sein, damit das script funktioniert?

                Ausser der falschen IP-Meldung passiert gar nichts. `
                Es ist wirklich ganz einfach. Es muss der javascript-Adapter installiert sein. Dort startest du das Script wie es ist ohne was daran zu ändern. Dadurch werden sofort die Ordner angelegt. Das muss bei jedem sofort funktionieren. Wenn das schon nicht geht, hast du anderes Problem.

                Die Fehler und Warnungen beim ersten Start erstmal nicht beachten. Danach trägst du unter Objekte die IP manuell ein wie in meinem screenshot zu erkennen. Danach Script nochmal starten (eventuell reicht auch etwas warten) und die Werte werden korrekt gefüllt.

                Host: NUC8i3 mit Proxmox:

                • ioBroker CT Debian 13, npm 10.9.4, nodejs 22.21.0
                • Slave: Pi4
                1 Reply Last reply
                0
                • D Offline
                  D Offline
                  djtale2003
                  wrote on last edited by
                  #54

                  @djtale2003:

                  Wo kommen die Ordner her?

                  Kann mir bitte jemand schritt für schritt erklären, was ich machen muß? Was muß alles installiert sein, damit das script funktioniert?

                  Ausser der falschen IP-Meldung passiert gar nichts. `

                  Keine Ahnung, was ich gemacht habe, aber jetzt geht es…

                  1 Reply Last reply
                  0
                  • L Offline
                    L Offline
                    Lucky
                    wrote on last edited by
                    #55

                    Das Skript muss nicht neu gestartet werden wenn die ip Adresse eingegeben wurde, die Verbindung zum Server wird automatisch getrennt und neu aufgebaut wenn die ip geändert wird.

                    1 Reply Last reply
                    0
                    • lobomauL Offline
                      lobomauL Offline
                      lobomau
                      wrote on last edited by
                      #56

                      @Lucky:

                      alles wird gut :D

                      wenn du States manuell löscht und dann das Skript neu Startest, ist es normal das erstmal Fehler auflaufen, da die State dann neu beschrieben werden ;-) beim nächsten Start sollte auch das weg sein.

                      Hier nochmal eine überarbeitete Version mit folgenden Änderungen:

                      1. Fehler bei System Power OFF behoben (Danke für den Hinweis von Kueppert)

                      2. Fehler beim Manuellen umschalten der Tunerfrequenz behoben

                      3. Nach dem letzten Firmware Update des AVR ist es bei mir so, das wenn als Quelle NET z.b. Spotify gewählt ist, der AVR nicht mehr seine OSD Informationen selbständig updatet, für diesen Fall habe ich einen Updateintervall eingeführt.

                      4. mit dem State "Log" unter System kann der das Loggen des Regulären Datenstroms ausgeschaltet werden, was den Log sehr aufräumt ;-)

                      <size size="150">hier die Aktuelle Version !!!</size>

                      ! ```
                      `//Kontakt: s-nolte@htp-tel.de
                      //ioBroker Forum: Lucky
                      var net = require('net');
                      ! // System
                      createState('javascript.0.Denon.System.UPDATE', false,{type: "boolean", role: "button"});
                      createState('javascript.0.Denon.System.Power_System', false,{type: "boolean", role: "Power System"});
                      createState('javascript.0.Denon.System.System_Ready', false,{type: "boolean", role: "System Ready",write:false});
                      createState('javascript.0.Denon.System.IP_Adresse', '000.000.000.000',{type: "string", role: "AVR IP Adresse"});
                      createState('javascript.0.Denon.System.Trigger_1', false,{type: "boolean", role: "Trigger 1"});
                      createState('javascript.0.Denon.System.Trigger_2', false,{type: "boolean", role: "Trigger 2"});
                      createState('javascript.0.Denon.System.Command', '',{type: "string", role: "Command to AVR"});
                      createState('javascript.0.Denon.System.Display_Dimmer',0,{type: "number", role: "FL Display Dimmer",states: "0:BRI;1:DIM;2:DAR;3:OFF"});
                      createState('javascript.0.Denon.System.Verbunden',false,{type: "boolean", role: "Verbindung hergestellt",write:false});
                      createState('javascript.0.Denon.System.Name',{type: "string", role: "Netzwerk-Name",write:false});
                      createState('javascript.0.Denon.System.Log', true,{type: "boolean", role: "Log für Tx/Rx Daten"});
                      ! //OSD
                      createState('javascript.0.Denon.OSD.OSD_Info_List0', 'init',{type: "string", role: "Onscreen Display Info List00",write:false});
                      createState('javascript.0.Denon.OSD.OSD_Info_List1', 'init',{type: "string", role: "Onscreen Display Info List01",write:false});
                      createState('javascript.0.Denon.OSD.OSD_Info_List2', 'init',{type: "string", role: "Onscreen Display Info List02",write:false});
                      createState('javascript.0.Denon.OSD.OSD_Info_List3', 'init',{type: "string", role: "Onscreen Display Info List03",write:false});
                      createState('javascript.0.Denon.OSD.OSD_Info_List4', 'init',{type: "string", role: "Onscreen Display Info List04",write:false});
                      createState('javascript.0.Denon.OSD.OSD_Info_List5', 'init',{type: "string", role: "Onscreen Display Info List05",write:false});
                      createState('javascript.0.Denon.OSD.OSD_Info_List6', 'init',{type: "string", role: "Onscreen Display Info List06",write:false});
                      createState('javascript.0.Denon.OSD.OSD_Info_List7', 'init',{type: "string", role: "Onscreen Display Info List07",write:false});
                      createState('javascript.0.Denon.OSD.OSD_Info_List8', 'init',{type: "string", role: "Onscreen Display Info List08",write:false});
                      ! //Controls
                      createState('javascript.0.Denon.Control.Play', false,{type:"boolean", role: "button"});
                      createState('javascript.0.Denon.Control.Stop', false,{type: "boolean", role: "button"});
                      createState('javascript.0.Denon.Control.Pause', false,{type: "boolean", role: "button"});
                      createState('javascript.0.Denon.Control.Skip_Plus', false,{type: "boolean", role: "button"});
                      createState('javascript.0.Denon.Control.Skip_Minus', false,{type: "boolean", role: "button"});
                      createState('javascript.0.Denon.Control.Page_Next', false,{type: "boolean", role: "button"});
                      createState('javascript.0.Denon.Control.Page_Previous', false,{type: "boolean", role: "button"});
                      ! //Tuner Control
                      createState('javascript.0.Denon.Tuner_Control.Frequency_UP', false,{type:"boolean", role: "button"});
                      createState('javascript.0.Denon.Tuner_Control.Frequency_DOWN', false,{type:"boolean", role: "button"});
                      createState('javascript.0.Denon.Tuner_Control.Preset_UP', false,{type:"boolean", role: "button"});
                      createState('javascript.0.Denon.Tuner_Control.Preset_DOWN', false,{type:"boolean", role: "button"});
                      createState('javascript.0.Denon.Tuner_Control.RDS_Station_Name', 'init',{type:"string", role: "RDS Station Name",write:false});
                      createState('javascript.0.Denon.Tuner_Control.Preset_Number',0,{type:"number", role: "Preset No."});
                      ! //Zone_Main
                      createState('javascript.0.Denon.Zone_Main.Power', false,{type: "boolean", role: "Power Status Zone Main"});
                      createState('javascript.0.Denon.Zone_Main.Mute', false,{type: "boolean", role: "Mute Status"});
                      createState('javascript.0.Denon.Zone_Main.Master_Volume', 0,{type: "number", role: "Master Volume"});
                      createState('javascript.0.Denon.Zone_Main.Master_Volume_UP', false,{type: "boolean", role: "button"});
                      createState('javascript.0.Denon.Zone_Main.Master_Volume_DOWN', false,{type: "boolean", role: "button"});
                      createState('javascript.0.Denon.Zone_Main.Master_Volume_Max', 0,{type: "number", role: "Master Volume Max",write:false});
                      createState('javascript.0.Denon.Zone_Main.Video_Input', 1,{type: "number", role: "Selected Video Input",
                      states:"0:DVD;1:BD;2:TV;3:SAT/CBL;4:MPLAY;5:GAME;6:AUX1;7:AUX2;8:AUX3;9:AUX4;10:AUX5;11:AUX6;12:AUX7;13:CD"});
                      createState('javascript.0.Denon.Zone_Main.Video_State', false,{type: "boolean", role: "Video ON/OFF"});
                      createState('javascript.0.Denon.Zone_Main.Input_Text',5,{type: "string", role: "Input Text",write:false});
                      createState('javascript.0.Denon.Zone_Main.Select_Input',5,{type: "number", role: "Select Input",
                      states: "0:PHONO;1:CD;2:TUNER;3:DVD;4:BD;5:TV;6:SAT/CBL;7:MPLAY;8:GAME;9:NET;10:SPATIFY;11:LASTFM;12:IRADIO;13:SERVER;14:FAVOTITES;15:AUX1;16:AUX2;17:AUX3;18:AUX4;19:AUX5;20:AUX6;21:AUX7"});
                      createState('javascript.0.Denon.Zone_Main.Surround_Mode', 'init',{type: "string", role: "Surround Modus",write:false});
                      createState('javascript.0.Denon.Zone_Main.Ratio_Mode', 'init',{type: "string", role: "Ratio Modus",write:false});
                      createState('javascript.0.Denon.Zone_Main.Resolution', 'init',{type: "string", role: "Video Resolution",write:false});
                      createState('javascript.0.Denon.Zone_Main.Sound_Parameter', 'init',{type: "string", role: "Sound_Parameter",write:false});
                      createState('javascript.0.Denon.Zone_Main.HDMI_Monitor',0,{type: "number", role: "HDMI Monitor Out",states: "0:MONIAUTO;1:MONI1;2:MONI2"});
                      ! //Zone 2
                      createState('javascript.0.Denon.Zone_2.Power_Zone2', false,{type: "boolean", role: "Power Status Zone 2"});
                      createState('javascript.0.Denon.Zone_2.Mute', false,{type: "boolean", role: "Mute Status Zone 2"});
                      createState('javascript.0.Denon.Zone_2.Volume', 0,{type: "number", role: "Zone 2 Volume"});
                      createState('javascript.0.Denon.Zone_2.Volume_UP', 0,{type: "boolean", role: "button"});
                      createState('javascript.0.Denon.Zone_2.Volume_DOWN', 0,{type: "boolean", role: "button"});
                      createState('javascript.0.Denon.Zone_2.Select_Input',5,{type: "number", role: "Select Input",
                      states: "0:PHONO;1:CD;2:TUNER;3:DVD;4:BD;5:TV;6:SAT/CBL;7:MPLAY;8:GAME;9:NET;10:SPATIFY;11:LASTFM;12:IRADIO;13:SERVER;14:FAVOTITES;15:AUX1;16:AUX2;17:AUX3;18:AUX4;19:AUX5;20:AUX6;21:AUX7"});
                      ! //Zone 3
                      createState('javascript.0.Denon.Zone_3.Power_Zone3', false,{type: "boolean", role: "Power Status Zone 3"});
                      createState('javascript.0.Denon.Zone_3.Mute', false,{type: "boolean", role: "Mute Status Zone 3"});
                      createState('javascript.0.Denon.Zone_3.Volume', 0,{type: "number", role: "Zone 3 Volume"});
                      createState('javascript.0.Denon.Zone_3.Volume_UP', 0,{type: "boolean", role: "button"});
                      createState('javascript.0.Denon.Zone_3.Volume_DOWN', 0,{type: "boolean", role: "button"});
                      createState('javascript.0.Denon.Zone_3.Select_Input',5,{type: "number", role: "Select Input",
                      states: "0:PHONO;1:CD;2:TUNER;3:DVD;4:BD;5:TV;6:SAT/CBL;7:MPLAY;8:GAME;9:NET;10:SPATIFY;11:LASTFM;12:IRADIO;13:SERVER;14:FAVOTITES;15:AUX1;16:AUX2;17:AUX3;18:AUX4;19:AUX5;20:AUX6;21:AUX7"});
                      ! // Variablen-------------------------------------------------------------------------
                      var AVR_Command =['PW','MVMAX','MV','CV','MU','SI','ZM','SD','DC','SV','SLP','STBY','ECO','MS','VS','PS','PV','Z2','Z2MU','Z2CS','Z2CV','Z2HPF',
                      'Z2PS','Z2HDS','Z2SLP','Z2STBY','Z3','Z3MU','Z3CS','Z3CV','Z3HPF','Z3PS','Z3SLP','Z3STBY','TFANNAME','TPANMEM','NSET1','NSE','TR','DIM','NSFRN']; // räume den mist später auf ;-)
                      var t_request = 100; //beim ersten Start Funktion update aufrufen mit 100ms zwischen den Anfragen, maximal 50ms !
                      var client;
                      var PW_Request =0;
                      ! setState('javascript.0.Denon.System.Verbunden',val=false,akt=false);
                      checkIP(getState('javascript.0.Denon.System.IP_Adresse').val);
                      ! function checkIP(IP){ //IP Adresse prüfen
                      if(net.isIPv4(IP)){
                      setTimeout(function () {
                      client=Connect(IP);
                      },2000);
                      }
                      else{console.error('ungültige IP Adresse')}
                      }

                      function Connect(IP){ // zu Server Verbinden

                      ! var client = net.connect({host:IP, port:23});
                      client.setKeepAlive(true,5000);

                         console.log('Connectig...');
                         
                      client.on('error',function(error) {
                          console.error(error);
                          killClient(client);
                      }); 
                      
                      client.on('connect', function () {          //Verbindung hergestellt
                      console.log('Verbunden mit Denon AVR !');
                       {setState('javascript.0.Denon.System.Verbunden',val=true,akt=true)}
                        update(t_request); 
                      });
                      

                      ! client.on('end', function () { //die Gegenseite hat die Verbindung geschlossen
                      {setState('javascript.0.Denon.System.Verbunden',val=false,akt=true)}
                      console.warn('Denon AVR hat die Verbindung geschlossen !');
                      killClient(client);
                      });

                       client.on('data', function (data) {
                           
                            if (getState('javascript.0.Denon.System.Log').val===true){
                             console.log(data.toString());         //log für kommende Daten ################################################################################################
                            }
                           response(data);
                           
                       });
                      

                      return client;
                      }//end of Function Connect

                      ! function killClient(client){
                      {setState('javascript.0.Denon.System.Verbunden',val=false,akt=true)}
                      client.destroy();
                      client.unref();
                      console.log('Connection closed !');
                      }
                      ! // Funktion Nachricht Senden----------------------------------------------------------
                      function sendMessage(message) {
                      if(getState('javascript.0.Denon.System.Verbunden').val===true){

                      client.write(message+'\r');
                      if (message=='PWON'||'ZMON'||'Z2ON'||'Z3ON'){PW_Request=1}
                      
                          if (getState('javascript.0.Denon.System.Log').val===true){
                          console.log('Anfrage: '+ message );   // log für gesendete Daten  ################################################################################################
                          }
                      }
                      

                      }
                      //Daten anfordern--------------------------------------------------------------------
                      function update(Time){
                      console.log('Update Start');
                      var i_Pollen=0;
                      var Request =['NSET1 ?','NSFRN ?','ZM?','MU?','PW?','SI?','SV?','MS?','MV?','Z2?','Z2MU?','Z3?','Z3MU?','NSE','VSSC ?','VSASP ?','VSMONI ?','TR?','DIM ?'];
                      Intervall = setInterval(function () {

                          sendMessage(Request[i_Pollen]);
                          
                          i_Pollen++;
                              
                              if (i_Pollen==Request.length){
                                  i_Pollen=0;
                                  clearInterval(Intervall);
                              }
                          
                      }, Time);
                      

                      return true;
                      }

                      ! function StateText_toArray (StateNames){
                      var StateName = StateNames.split(';');
                      var StateArr=[];
                      for(var i = 0; i < StateName.length; i++) {
                      var ele = StateName[i].split(':');
                      StateArr[ele[0]] = ele[1];
                      }

                      return StateArr;
                      }

                      ! // Daten empfangen------------------------------------------------------------------
                      ! function response (data) {

                      ! var AVR_Response=data.toString().replace(/[\n\r]/g, ''); // Steuerzeichen "CR" entfernen
                      ! for (i = 0; i < AVR_Command.length; i++) {

                          var search_index=AVR_Response.search(AVR_Command[i]);
                          
                          if (search_index===0){
                              break;
                          }
                          
                      }
                      
                      var id,val;
                      
                      switch(AVR_Command[i]){  
                          case 'MU':
                              // to Request MU?
                              if (AVR_Response=='MUOFF'){setState("javascript.0.Denon.Zone_Main.Mute",false,akt=true)}
                              if (AVR_Response=='MUON'){setState("javascript.0.Denon.Zone_Main.Mute",true,akt=true)}
                             break;
                             
                          case 'PW':  
                              // to Request PW?
                             if (AVR_Response=='PWSTANDBY'){
                                 setState('javascript.0.Denon.System.Power_System',false,akt=true);
                                 setState('javascript.0.Denon.System.System_Ready',false,akt=true);
                                 if ("undefined" !== typeof StaticPollen){clearInterval(StaticPollen)}
                             }
                             if (AVR_Response=='PWON'){
                                 if(PW_Request==1){
                                 setState('javascript.0.Denon.System.Power_System',true,akt=true);
                                 PW_Request++;
                                 }
                                 else if(PW_Request==2){
                                     setState('javascript.0.Denon.System.System_Ready',true,akt=true);
                                     PW_Request=0;
                                 }
                                 
                             }
                            
                             break;
                             
                             
                          case'Z2':
                             if (AVR_Response=='Z2OFF'){setState('javascript.0.Denon.Zone_2.Power_Zone2',false,akt=true)}
                             else if (AVR_Response=='Z2ON'){setState('javascript.0.Denon.Zone_2.Power_Zone2',true,akt=true)}
                             else if (AVR_Response=='Z2MUON'){setState('javascript.0.Denon.Zone_2.Mute',true,akt=true)}
                             else if (AVR_Response=='Z2MUOFF'){setState('javascript.0.Denon.Zone_2.Mute',true,akt=true)}
                              else if (true !==isNaN(parseInt(AVR_Response.slice(2,4)))){
                                  
                                  setState("javascript.0.Denon.Zone_2.Volume",parseFloat(AVR_Response.slice(2,4)),akt=true)}
                               else {
                              
                                AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                              id='javascript.0.Denon.Zone_2.Select_Input';
                              val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response);
                              if (val>=0){setState(id,val,akt=true);}
                               }
                              break;
                              
                          case'Z3':
                             if (AVR_Response=='Z3OFF'){setState('javascript.0.Denon.Zone_3.Power_Zone3',false,akt=true)}
                             else if (AVR_Response=='Z3ON'){setState('javascript.0.Denon.Zone_3.Power_Zone3',true,akt=true)}
                             else if (AVR_Response=='Z3MUON'){setState('javascript.0.Denon.Zone_3.Mute',true,akt=true)}
                             else if (AVR_Response=='Z3MUOFF'){setState('javascript.0.Denon.Zone_3.Mute',true,akt=true)}
                              else if (true !==isNaN(parseInt(AVR_Response.slice(2,4)))){
                                 
                                  setState("javascript.0.Denon.Zone_3.Volume",parseFloat(AVR_Response.slice(2,4)),akt=true)}
                               else {
                              
                                AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                              id='javascript.0.Denon.Zone_3.Select_Input';
                              val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response);
                              if (val>=0){setState(id,val,akt=true);}
                               }
                              break;    
                          
                          case 'MV':
                              // to Request MV?
                              AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                              if (AVR_Response.length<3){AVR_Response=AVR_Response+'0'}
                              AVR_Response=AVR_Response.slice(0, 2)+'.'+AVR_Response.slice(2, 3);
                             setState("javascript.0.Denon.Zone_Main.Master_Volume",parseFloat(AVR_Response),akt=true);
                              
                             break;
                             
                           case 'MVMAX':
                              AVR_Response=AVR_Response.slice(6,AVR_Response.length);
                              AVR_Response=AVR_Response.slice(0, 2)+'.'+AVR_Response.slice(2, 3);
                             setState("javascript.0.Denon.Zone_Main.Master_Volume_Max",parseFloat(AVR_Response),akt=true);
                             break;  
                             
                          case 'SV': 
                              // to Request SV?
                              if (AVR_Response=='SVOFF'){setState("javascript.0.Denon.Zone_Main.Video_State",false,akt=true)}
                              else if (AVR_Response=='SVON'){setState("javascript.0.Denon.Zone_Main.Video_State",true,akt=true)}
                              else {
                              
                              AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                              id = 'javascript.0.Denon.Zone_Main.Video_Input';
                              val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response); //suche in array nach element
                              
                              setState(id,val,akt=true);
                              }
                             break;
                             
                          case 'SI':
                              // to Request SI?
                              AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                              id='javascript.0.Denon.Zone_Main.Select_Input';
                              val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response);
                              
                              setState(id,val,akt=true);
                              setState('javascript.0.Denon.Zone_Main.Input_Text',AVR_Response,akt=true);
                              
                             if (AVR_Response=='NET'){
                              StaticPollen=setInterval(sendMessage,2000,'NSE');  //wenn Quelle = NET ist (z.b. Spotify) OSD Informationen Pollen mit 2s
                              }
                             
                             else {if ("undefined" !== typeof StaticPollen){clearInterval(StaticPollen)}
                             }
                             break;  
                             
                          case 'ZM':
                              // to Request ZM?
                              if (AVR_Response=='ZMOFF'){setState('javascript.0.Denon.Zone_Main.Power',false,akt=true)}
                              if (AVR_Response=='ZMON'){setState('javascript.0.Denon.Zone_Main.Power',true,akt=true)}
                             break;
                             
                          case 'MS':
                              // to Request MS? 
                              AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                              setState("javascript.0.Denon.Zone_Main.Surround_Mode",AVR_Response,akt=true);
                             break;
                             
                          case 'VS':
                              
                              // to Request VSASP ?
                              id = "javascript.0.Denon.Zone_Main.Ratio_Mode";
                              if (AVR_Response=='VSASPFUL'){setState(id,'16:9',akt=true)}
                              else if (AVR_Response=='VSASPNRM'){setState(id,'4:3',akt=true)}
                              
                              // to Request VSSC ?
                              id = "javascript.0.Denon.Zone_Main.Resolution";
                              if (AVR_Response=='VSSC48P'){setState(id,'480p/576p',akt=true)}
                              else if (AVR_Response=='VSSC10I'){setState(id,'1080i',akt=true)}
                              else if (AVR_Response=='VSSC72P'){setState(id,'720p',akt=true)}
                              else if (AVR_Response=='VSSC10P'){setState(id,'1080p',akt=true)}
                              else if (AVR_Response=='VSSC10P24'){setState(id,'1080p:24Hz',akt=true)}
                              else if (AVR_Response=='VSSC4K'){setState(id,'4K',akt=true)}
                              else if (AVR_Response=='VSSC4KF'){setState(id,'4K 60/50Hz',akt=true)}
                              else if (AVR_Response=='VSSCAUTO'){setState(id,'AUTO',akt=true)}
                              
                              //to Request MONI ? 
                              id='javascript.0.Denon.Zone_Main.HDMI_Monitor';
                               if (AVR_Response=='VSMONIAUTO'){setState(id,0,akt=true)}
                               else if (AVR_Response=='VSMONI1'){setState(id,1,akt=true)}
                               else if (AVR_Response=='VSMONI2'){setState(id,2,akt=true)}
                             break; 
                       
                          case 'PS':
                              
                              // to Request PSMODE: ?
                              setState("javascript.0.Denon.Zone_Main.Sound_Parameter",AVR_Response.slice(7,AVR_Response.length),akt=true);
                              break;
                              
                          
                          case 'NSE':
                              
                                // to Request NSE  // Achtung ohne ? 
                              id='javascript.0.Denon.OSD.OSD_Info_List'+AVR_Response.slice(3, 4);
                              
                              if (getState(id)) {             //prüfen ob State vorhanden ist
                              setState (id,AVR_Response=AVR_Response.slice(4,AVR_Response.length),akt=true);
                              }
                            
                              break;
                              
                          case 'TR':
                              
                              if (AVR_Response=='TR1 OFF'){setState('javascript.0.Denon.System.Trigger_1',false,akt=true)}
                              else if (AVR_Response=='TR1 ON'){setState('javascript.0.Denon.System.Trigger_1',true,akt=true)}
                              else if (AVR_Response=='TR2 OFF'){setState('javascript.0.Denon.System.Trigger_2',false,akt=true)}
                              else if (AVR_Response=='TR2 ON'){setState('javascript.0.Denon.System.Trigger_2',true,akt=true)}
                              break;
                              
                          case 'DIM':
                               AVR_Response=AVR_Response.slice(4,AVR_Response.length);
                              id='javascript.0.Denon.System.Display_Dimmer';
                              val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response);
                              
                              setState(id,val,akt=true);
                              
                              break;
                          
                          case 'TFANNAME':
                               setState('javascript.0.Denon.Tuner_Control.RDS_Station_Name',val=AVR_Response.slice(8,AVR_Response.length),akt=true);    
                              break;
                              
                          case 'TPANMEM':
                              AVR_Response=AVR_Response.slice(7,AVR_Response.length);
                              if (AVR_Response.length==2){         //29.08.2017 angepasst
                              setState('javascript.0.Denon.Tuner_Control.Preset_Number',parseInt(AVR_Response),akt=true);
                              }
                              
                              break;
                              
                          case 'NSET1':
                              if (AVR_Response.slice(5,8)=='IPA'){
                                  var IPstring=AVR_Response.slice(9,AVR_Response.length);
                                  if(IPstring[12]=='0'){
                                  IPstring=IPstring.substr(0, 12) + '' + IPstring.substr(13,14);
                                  }
                      

                      ! setState('javascript.0.Denon.System.IP_Adresse',val=IPstring,akt=true);

                              }
                              break;    
                          
                          case 'NSFRN': 
                              setState('javascript.0.Denon.System.Name',val=AVR_Response.slice(5,AVR_Response.length),akt=true);
                              break;
                              
                          default:
                              //console.log('häääää????');
                      }
                      

                      }

                      //--------------------------------------------------------------------------------------
                      on('javascript.0.Denon.System.IP_Adresse', function (obj){
                      if(getState('javascript.0.Denon.System.Verbunden').val===true){

                      killClient(client);
                         checkIP(obj.state.val);
                      }
                      else{checkIP(obj.state.val)}
                      

                      });

                      ! on({id:'javascript.0.Denon.System.UPDATE',val:true}, function (obj){

                         update(t_request);
                      

                      });

                      ! on({id:"javascript.0.Denon.System.Command",change:"any"}, function (obj){sendMessage(obj.state.val+'')});
                      ! on("javascript.0.Denon.System.Power_System", function (obj){
                      if (!obj.state.ack) {
                      if (obj.state.val){
                      sendMessage('PWON');
                      }
                      else{sendMessage('PWSTANDBY')}
                      }
                      });
                      ! on('javascript.0.Denon.Zone_Main.Power', function (obj){
                      if (!obj.state.ack) {
                      if (obj.state.val){
                      sendMessage('ZMON');
                      }
                      else{sendMessage('ZMOFF')}
                      }
                      });
                      ! on('javascript.0.Denon.Zone_2.Power_Zone2', function (obj){
                      if (!obj.state.ack) {
                      if (obj.state.val){sendMessage('Z2ON')}
                      else{sendMessage('Z2OFF')}
                      }
                      });
                      ! on('javascript.0.Denon.Zone_3.Power_Zone3', function (obj){
                      if (!obj.state.ack) {
                      if (obj.state.val){sendMessage('Z3ON')}
                      else{sendMessage('Z3OFF')}
                      }
                      });
                      ! on("javascript.0.Denon.Zone_Main.Mute", function (obj){
                      if (!obj.state.ack) {
                      if (obj.state.val){sendMessage('MUON')}
                      else{sendMessage('MUOFF')}
                      }
                      });
                      ! on("javascript.0.Denon.Zone_2.Mute", function (obj){
                      if (!obj.state.ack) {
                      if (obj.state.val){sendMessage('Z2MUON')}
                      else{sendMessage('Z2MUOFF')}
                      }
                      });
                      ! on("javascript.0.Denon.Zone_3.Mute", function (obj){
                      if (!obj.state.ack) {
                      if (obj.state.val){sendMessage('Z3MUON')}
                      else{sendMessage('Z3MUOFF')}
                      }
                      });
                      ! on("javascript.0.Denon.Zone_Main.Master_Volume", function (obj){
                      if (!obj.state.ack) {
                      sendMessage('MV'+obj.state.val+'');
                      }
                      });
                      ! on({id:"javascript.0.Denon.Zone_Main.Master_Volume_UP",val:true}, function (obj){
                      if (!obj.state.ack) {
                      sendMessage('MVUP'+'');
                      }
                      });
                      ! on({id:"javascript.0.Denon.Zone_Main.Master_Volume_DOWN",val:true}, function (obj){
                      if (!obj.state.ack) {
                      sendMessage('MVDOWN'+'');
                      }
                      });
                      ! on("javascript.0.Denon.Zone_2.Volume", function (obj){
                      if (!obj.state.ack) {
                      sendMessage('Z2'+obj.state.val+'');
                      }
                      });
                      ! on({id:"javascript.0.Denon.Zone_2.Volume_UP",val:true}, function (obj){
                      if (!obj.state.ack) {
                      sendMessage('Z2UP'+'');
                      }
                      });
                      ! on({id:"javascript.0.Denon.Zone_2.Volume_DOWN",val:true}, function (obj){
                      if (!obj.state.ack) {
                      sendMessage('Z2DOWN'+'');
                      }
                      });
                      ! on("javascript.0.Denon.Zone_3.Volume", function (obj){
                      if (!obj.state.ack) {
                      sendMessage('Z3'+obj.state.val+'');
                      }
                      });
                      ! on({id:"javascript.0.Denon.Zone_3.Volume_UP",val:true}, function (obj){
                      if (!obj.state.ack) {
                      sendMessage('Z3UP'+'');
                      }
                      });
                      ! on({id:"javascript.0.Denon.Zone_3.Volume_DOWN",val:true}, function (obj){
                      if (!obj.state.ack) {
                      sendMessage('Z3DOWN'+'');
                      }
                      });
                      ! on({id:"javascript.0.Denon.Control.Play",vla:true}, function (obj){
                      sendMessage('NS9A')
                      });
                      ! on({id:"javascript.0.Denon.Control.Stop",val:true}, function (obj){
                      sendMessage('NS9C')
                      });
                      ! on({id:"javascript.0.Denon.Control.Pause",val:true}, function (obj){
                      //if (obj.state.val===true){sendMessage('NS9B')}
                      sendMessage('NS9B');
                      });
                      ! on({id:"javascript.0.Denon.Control.Skip_Plus",val:true}, function (obj){
                      sendMessage('NS9D')
                      });
                      ! on({id:"javascript.0.Denon.Control.Skip_Minus",val:true}, function (obj){
                      sendMessage('NS9E')
                      });
                      ! on({id:"javascript.0.Denon.Control.Page_Next",val:true}, function (obj){
                      sendMessage('NS9X')
                      });
                      ! on({id:"javascript.0.Denon.Control.Page_Previous",val:true}, function (obj){
                      sendMessage('NS9Y')
                      });
                      ! on('javascript.0.Denon.Zone_Main.Select_Input', function (obj){
                      if (!obj.state.ack) {
                      if(obj.state.val>=0){
                      sendMessage('SI'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
                      }
                      }
                      });
                      ! on('javascript.0.Denon.Zone_2.Select_Input', function (obj){
                      if (!obj.state.ack) {
                      if(obj.state.val>=0){
                      sendMessage('Z2'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
                      }
                      }
                      });
                      ! on('javascript.0.Denon.Zone_3.Select_Input', function (obj){
                      if (!obj.state.ack) {
                      if(obj.state.val>=0){
                      sendMessage('Z3'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
                      }
                      }
                      });
                      ! on('javascript.0.Denon.Zone_Main.Video_Input', function (obj){
                      if (!obj.state.ack) {
                      if(obj.state.val>=0){
                      sendMessage('SV'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
                      }
                      }
                      });
                      ! on('javascript.0.Denon.Zone_Main.Video_State', function (obj){
                      if (!obj.state.ack) {
                      if (obj.state.val===true){sendMessage('SVON')}
                      else{sendMessage('SVOFF')}
                      }
                      });
                      ! on('javascript.0.Denon.Zone_Main.HDMI_Monitor', function (obj){
                      if (!obj.state.ack) {
                      if(obj.state.val>=0){
                      sendMessage('VS'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
                      }
                      }
                      });
                      ! on("javascript.0.Denon.System.Trigger_1", function (obj){
                      if (!obj.state.ack) {
                      if (obj.state.val===true){sendMessage('TR1 ON')}
                      else{sendMessage('TR1 OFF')}
                      }
                      });
                      ! on("javascript.0.Denon.System.Trigger_2", function (obj){
                      if (!obj.state.ack) {
                      if (obj.state.val===true){sendMessage('TR2 ON')}
                      else{sendMessage('TR2 OFF')}
                      }
                      });
                      ! on('javascript.0.Denon.System.Display_Dimmer', function (obj){
                      if (!obj.state.ack) {
                      if(obj.state.val>=0){
                      sendMessage('DIM '+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
                      }
                      }
                      });
                      ! on({id:'javascript.0.Denon.Tuner_Control.Frequency_UP',val:true}, function (obj){sendMessage('TFANUP')});
                      ! on({id:'javascript.0.Denon.Tuner_Control.Frequency_DOWN',val:true}, function (obj){sendMessage('TFANDOWN')});
                      ! on({id:'javascript.0.Denon.Tuner_Control.Preset_UP',val:true}, function (obj){sendMessage('TPANUP')});
                      ! on({id:'javascript.0.Denon.Tuner_Control.Preset_DOWN',val:true}, function (obj){sendMessage('TPANDOWN')});
                      ! on('javascript.0.Denon.Tuner_Control.Preset_Number', function (obj){
                      if (obj.state.val.toString().length<2){
                      sendMessage('TPAN'+'0'+obj.state.val.toString())
                      }
                      else{sendMessage('TPAN'+obj.state.val.toString())}

                      });

                      ! //---------------------------------------------------------------------------------------
                      ! // close connection if script stopped-------------------------------------------------
                      onStop(function () {
                      if(getState('javascript.0.Denon.System.Verbunden').val===true){killClient(client)};
                      }, 2000 /ms/); Gut läuft das Script solange Spannung am Denon anliegt. Ich habe jedoch auch eine schaltbare Steckdose. Wenn ich dann anschalte, funktioniert es erst wenn ich das Script neustarte. ! Oder wenn das SCript läuft und ich aus und anschalte, geht das SCript erst nach neustarten.[/i][/i][/i] ```

                      Host: NUC8i3 mit Proxmox:

                      • ioBroker CT Debian 13, npm 10.9.4, nodejs 22.21.0
                      • Slave: Pi4
                      1 Reply Last reply
                      0
                      • lobomauL Offline
                        lobomauL Offline
                        lobomau
                        wrote on last edited by
                        #57

                        @lobomau:

                        @Lucky:

                        alles wird gut :D

                        wenn du States manuell löscht und dann das Skript neu Startest, ist es normal das erstmal Fehler auflaufen, da die State dann neu beschrieben werden ;-) beim nächsten Start sollte auch das weg sein.

                        Hier nochmal eine überarbeitete Version mit folgenden Änderungen:

                        1. Fehler bei System Power OFF behoben (Danke für den Hinweis von Kueppert)

                        2. Fehler beim Manuellen umschalten der Tunerfrequenz behoben

                        3. Nach dem letzten Firmware Update des AVR ist es bei mir so, das wenn als Quelle NET z.b. Spotify gewählt ist, der AVR nicht mehr seine OSD Informationen selbständig updatet, für diesen Fall habe ich einen Updateintervall eingeführt.

                        4. mit dem State "Log" unter System kann der das Loggen des Regulären Datenstroms ausgeschaltet werden, was den Log sehr aufräumt ;-)

                        <size size="150">hier die Aktuelle Version !!!</size>

                        ! ```
                        `//Kontakt: s-nolte@htp-tel.de
                        //ioBroker Forum: Lucky
                        var net = require('net');
                        ! // System
                        createState('javascript.0.Denon.System.UPDATE', false,{type: "boolean", role: "button"});
                        createState('javascript.0.Denon.System.Power_System', false,{type: "boolean", role: "Power System"});
                        createState('javascript.0.Denon.System.System_Ready', false,{type: "boolean", role: "System Ready",write:false});
                        createState('javascript.0.Denon.System.IP_Adresse', '000.000.000.000',{type: "string", role: "AVR IP Adresse"});
                        createState('javascript.0.Denon.System.Trigger_1', false,{type: "boolean", role: "Trigger 1"});
                        createState('javascript.0.Denon.System.Trigger_2', false,{type: "boolean", role: "Trigger 2"});
                        createState('javascript.0.Denon.System.Command', '',{type: "string", role: "Command to AVR"});
                        createState('javascript.0.Denon.System.Display_Dimmer',0,{type: "number", role: "FL Display Dimmer",states: "0:BRI;1:DIM;2:DAR;3:OFF"});
                        createState('javascript.0.Denon.System.Verbunden',false,{type: "boolean", role: "Verbindung hergestellt",write:false});
                        createState('javascript.0.Denon.System.Name',{type: "string", role: "Netzwerk-Name",write:false});
                        createState('javascript.0.Denon.System.Log', true,{type: "boolean", role: "Log für Tx/Rx Daten"});
                        ! //OSD
                        createState('javascript.0.Denon.OSD.OSD_Info_List0', 'init',{type: "string", role: "Onscreen Display Info List00",write:false});
                        createState('javascript.0.Denon.OSD.OSD_Info_List1', 'init',{type: "string", role: "Onscreen Display Info List01",write:false});
                        createState('javascript.0.Denon.OSD.OSD_Info_List2', 'init',{type: "string", role: "Onscreen Display Info List02",write:false});
                        createState('javascript.0.Denon.OSD.OSD_Info_List3', 'init',{type: "string", role: "Onscreen Display Info List03",write:false});
                        createState('javascript.0.Denon.OSD.OSD_Info_List4', 'init',{type: "string", role: "Onscreen Display Info List04",write:false});
                        createState('javascript.0.Denon.OSD.OSD_Info_List5', 'init',{type: "string", role: "Onscreen Display Info List05",write:false});
                        createState('javascript.0.Denon.OSD.OSD_Info_List6', 'init',{type: "string", role: "Onscreen Display Info List06",write:false});
                        createState('javascript.0.Denon.OSD.OSD_Info_List7', 'init',{type: "string", role: "Onscreen Display Info List07",write:false});
                        createState('javascript.0.Denon.OSD.OSD_Info_List8', 'init',{type: "string", role: "Onscreen Display Info List08",write:false});
                        ! //Controls
                        createState('javascript.0.Denon.Control.Play', false,{type:"boolean", role: "button"});
                        createState('javascript.0.Denon.Control.Stop', false,{type: "boolean", role: "button"});
                        createState('javascript.0.Denon.Control.Pause', false,{type: "boolean", role: "button"});
                        createState('javascript.0.Denon.Control.Skip_Plus', false,{type: "boolean", role: "button"});
                        createState('javascript.0.Denon.Control.Skip_Minus', false,{type: "boolean", role: "button"});
                        createState('javascript.0.Denon.Control.Page_Next', false,{type: "boolean", role: "button"});
                        createState('javascript.0.Denon.Control.Page_Previous', false,{type: "boolean", role: "button"});
                        ! //Tuner Control
                        createState('javascript.0.Denon.Tuner_Control.Frequency_UP', false,{type:"boolean", role: "button"});
                        createState('javascript.0.Denon.Tuner_Control.Frequency_DOWN', false,{type:"boolean", role: "button"});
                        createState('javascript.0.Denon.Tuner_Control.Preset_UP', false,{type:"boolean", role: "button"});
                        createState('javascript.0.Denon.Tuner_Control.Preset_DOWN', false,{type:"boolean", role: "button"});
                        createState('javascript.0.Denon.Tuner_Control.RDS_Station_Name', 'init',{type:"string", role: "RDS Station Name",write:false});
                        createState('javascript.0.Denon.Tuner_Control.Preset_Number',0,{type:"number", role: "Preset No."});
                        ! //Zone_Main
                        createState('javascript.0.Denon.Zone_Main.Power', false,{type: "boolean", role: "Power Status Zone Main"});
                        createState('javascript.0.Denon.Zone_Main.Mute', false,{type: "boolean", role: "Mute Status"});
                        createState('javascript.0.Denon.Zone_Main.Master_Volume', 0,{type: "number", role: "Master Volume"});
                        createState('javascript.0.Denon.Zone_Main.Master_Volume_UP', false,{type: "boolean", role: "button"});
                        createState('javascript.0.Denon.Zone_Main.Master_Volume_DOWN', false,{type: "boolean", role: "button"});
                        createState('javascript.0.Denon.Zone_Main.Master_Volume_Max', 0,{type: "number", role: "Master Volume Max",write:false});
                        createState('javascript.0.Denon.Zone_Main.Video_Input', 1,{type: "number", role: "Selected Video Input",
                        states:"0:DVD;1:BD;2:TV;3:SAT/CBL;4:MPLAY;5:GAME;6:AUX1;7:AUX2;8:AUX3;9:AUX4;10:AUX5;11:AUX6;12:AUX7;13:CD"});
                        createState('javascript.0.Denon.Zone_Main.Video_State', false,{type: "boolean", role: "Video ON/OFF"});
                        createState('javascript.0.Denon.Zone_Main.Input_Text',5,{type: "string", role: "Input Text",write:false});
                        createState('javascript.0.Denon.Zone_Main.Select_Input',5,{type: "number", role: "Select Input",
                        states: "0:PHONO;1:CD;2:TUNER;3:DVD;4:BD;5:TV;6:SAT/CBL;7:MPLAY;8:GAME;9:NET;10:SPATIFY;11:LASTFM;12:IRADIO;13:SERVER;14:FAVOTITES;15:AUX1;16:AUX2;17:AUX3;18:AUX4;19:AUX5;20:AUX6;21:AUX7"});
                        createState('javascript.0.Denon.Zone_Main.Surround_Mode', 'init',{type: "string", role: "Surround Modus",write:false});
                        createState('javascript.0.Denon.Zone_Main.Ratio_Mode', 'init',{type: "string", role: "Ratio Modus",write:false});
                        createState('javascript.0.Denon.Zone_Main.Resolution', 'init',{type: "string", role: "Video Resolution",write:false});
                        createState('javascript.0.Denon.Zone_Main.Sound_Parameter', 'init',{type: "string", role: "Sound_Parameter",write:false});
                        createState('javascript.0.Denon.Zone_Main.HDMI_Monitor',0,{type: "number", role: "HDMI Monitor Out",states: "0:MONIAUTO;1:MONI1;2:MONI2"});
                        ! //Zone 2
                        createState('javascript.0.Denon.Zone_2.Power_Zone2', false,{type: "boolean", role: "Power Status Zone 2"});
                        createState('javascript.0.Denon.Zone_2.Mute', false,{type: "boolean", role: "Mute Status Zone 2"});
                        createState('javascript.0.Denon.Zone_2.Volume', 0,{type: "number", role: "Zone 2 Volume"});
                        createState('javascript.0.Denon.Zone_2.Volume_UP', 0,{type: "boolean", role: "button"});
                        createState('javascript.0.Denon.Zone_2.Volume_DOWN', 0,{type: "boolean", role: "button"});
                        createState('javascript.0.Denon.Zone_2.Select_Input',5,{type: "number", role: "Select Input",
                        states: "0:PHONO;1:CD;2:TUNER;3:DVD;4:BD;5:TV;6:SAT/CBL;7:MPLAY;8:GAME;9:NET;10:SPATIFY;11:LASTFM;12:IRADIO;13:SERVER;14:FAVOTITES;15:AUX1;16:AUX2;17:AUX3;18:AUX4;19:AUX5;20:AUX6;21:AUX7"});
                        ! //Zone 3
                        createState('javascript.0.Denon.Zone_3.Power_Zone3', false,{type: "boolean", role: "Power Status Zone 3"});
                        createState('javascript.0.Denon.Zone_3.Mute', false,{type: "boolean", role: "Mute Status Zone 3"});
                        createState('javascript.0.Denon.Zone_3.Volume', 0,{type: "number", role: "Zone 3 Volume"});
                        createState('javascript.0.Denon.Zone_3.Volume_UP', 0,{type: "boolean", role: "button"});
                        createState('javascript.0.Denon.Zone_3.Volume_DOWN', 0,{type: "boolean", role: "button"});
                        createState('javascript.0.Denon.Zone_3.Select_Input',5,{type: "number", role: "Select Input",
                        states: "0:PHONO;1:CD;2:TUNER;3:DVD;4:BD;5:TV;6:SAT/CBL;7:MPLAY;8:GAME;9:NET;10:SPATIFY;11:LASTFM;12:IRADIO;13:SERVER;14:FAVOTITES;15:AUX1;16:AUX2;17:AUX3;18:AUX4;19:AUX5;20:AUX6;21:AUX7"});
                        ! // Variablen-------------------------------------------------------------------------
                        var AVR_Command =['PW','MVMAX','MV','CV','MU','SI','ZM','SD','DC','SV','SLP','STBY','ECO','MS','VS','PS','PV','Z2','Z2MU','Z2CS','Z2CV','Z2HPF',
                        'Z2PS','Z2HDS','Z2SLP','Z2STBY','Z3','Z3MU','Z3CS','Z3CV','Z3HPF','Z3PS','Z3SLP','Z3STBY','TFANNAME','TPANMEM','NSET1','NSE','TR','DIM','NSFRN']; // räume den mist später auf ;-)
                        var t_request = 100; //beim ersten Start Funktion update aufrufen mit 100ms zwischen den Anfragen, maximal 50ms !
                        var client;
                        var PW_Request =0;
                        ! setState('javascript.0.Denon.System.Verbunden',val=false,akt=false);
                        checkIP(getState('javascript.0.Denon.System.IP_Adresse').val);
                        ! function checkIP(IP){ //IP Adresse prüfen
                        if(net.isIPv4(IP)){
                        setTimeout(function () {
                        client=Connect(IP);
                        },2000);
                        }
                        else{console.error('ungültige IP Adresse')}
                        }

                        function Connect(IP){ // zu Server Verbinden

                        ! var client = net.connect({host:IP, port:23});
                        client.setKeepAlive(true,5000);

                           console.log('Connectig...');
                           
                        client.on('error',function(error) {
                            console.error(error);
                            killClient(client);
                        }); 
                        
                        client.on('connect', function () {          //Verbindung hergestellt
                        console.log('Verbunden mit Denon AVR !');
                         {setState('javascript.0.Denon.System.Verbunden',val=true,akt=true)}
                          update(t_request); 
                        });
                        

                        ! client.on('end', function () { //die Gegenseite hat die Verbindung geschlossen
                        {setState('javascript.0.Denon.System.Verbunden',val=false,akt=true)}
                        console.warn('Denon AVR hat die Verbindung geschlossen !');
                        killClient(client);
                        });

                         client.on('data', function (data) {
                             
                              if (getState('javascript.0.Denon.System.Log').val===true){
                               console.log(data.toString());         //log für kommende Daten ################################################################################################
                              }
                             response(data);
                             
                         });
                        

                        return client;
                        }//end of Function Connect

                        ! function killClient(client){
                        {setState('javascript.0.Denon.System.Verbunden',val=false,akt=true)}
                        client.destroy();
                        client.unref();
                        console.log('Connection closed !');
                        }
                        ! // Funktion Nachricht Senden----------------------------------------------------------
                        function sendMessage(message) {
                        if(getState('javascript.0.Denon.System.Verbunden').val===true){

                        client.write(message+'\r');
                        if (message=='PWON'||'ZMON'||'Z2ON'||'Z3ON'){PW_Request=1}
                        
                            if (getState('javascript.0.Denon.System.Log').val===true){
                            console.log('Anfrage: '+ message );   // log für gesendete Daten  ################################################################################################
                            }
                        }
                        

                        }
                        //Daten anfordern--------------------------------------------------------------------
                        function update(Time){
                        console.log('Update Start');
                        var i_Pollen=0;
                        var Request =['NSET1 ?','NSFRN ?','ZM?','MU?','PW?','SI?','SV?','MS?','MV?','Z2?','Z2MU?','Z3?','Z3MU?','NSE','VSSC ?','VSASP ?','VSMONI ?','TR?','DIM ?'];
                        Intervall = setInterval(function () {

                            sendMessage(Request[i_Pollen]);
                            
                            i_Pollen++;
                                
                                if (i_Pollen==Request.length){
                                    i_Pollen=0;
                                    clearInterval(Intervall);
                                }
                            
                        }, Time);
                        

                        return true;
                        }

                        ! function StateText_toArray (StateNames){
                        var StateName = StateNames.split(';');
                        var StateArr=[];
                        for(var i = 0; i < StateName.length; i++) {
                        var ele = StateName[i].split(':');
                        StateArr[ele[0]] = ele[1];
                        }

                        return StateArr;
                        }

                        ! // Daten empfangen------------------------------------------------------------------
                        ! function response (data) {

                        ! var AVR_Response=data.toString().replace(/[\n\r]/g, ''); // Steuerzeichen "CR" entfernen
                        ! for (i = 0; i < AVR_Command.length; i++) {

                            var search_index=AVR_Response.search(AVR_Command[i]);
                            
                            if (search_index===0){
                                break;
                            }
                            
                        }
                        
                        var id,val;
                        
                        switch(AVR_Command[i]){  
                            case 'MU':
                                // to Request MU?
                                if (AVR_Response=='MUOFF'){setState("javascript.0.Denon.Zone_Main.Mute",false,akt=true)}
                                if (AVR_Response=='MUON'){setState("javascript.0.Denon.Zone_Main.Mute",true,akt=true)}
                               break;
                               
                            case 'PW':  
                                // to Request PW?
                               if (AVR_Response=='PWSTANDBY'){
                                   setState('javascript.0.Denon.System.Power_System',false,akt=true);
                                   setState('javascript.0.Denon.System.System_Ready',false,akt=true);
                                   if ("undefined" !== typeof StaticPollen){clearInterval(StaticPollen)}
                               }
                               if (AVR_Response=='PWON'){
                                   if(PW_Request==1){
                                   setState('javascript.0.Denon.System.Power_System',true,akt=true);
                                   PW_Request++;
                                   }
                                   else if(PW_Request==2){
                                       setState('javascript.0.Denon.System.System_Ready',true,akt=true);
                                       PW_Request=0;
                                   }
                                   
                               }
                              
                               break;
                               
                               
                            case'Z2':
                               if (AVR_Response=='Z2OFF'){setState('javascript.0.Denon.Zone_2.Power_Zone2',false,akt=true)}
                               else if (AVR_Response=='Z2ON'){setState('javascript.0.Denon.Zone_2.Power_Zone2',true,akt=true)}
                               else if (AVR_Response=='Z2MUON'){setState('javascript.0.Denon.Zone_2.Mute',true,akt=true)}
                               else if (AVR_Response=='Z2MUOFF'){setState('javascript.0.Denon.Zone_2.Mute',true,akt=true)}
                                else if (true !==isNaN(parseInt(AVR_Response.slice(2,4)))){
                                    
                                    setState("javascript.0.Denon.Zone_2.Volume",parseFloat(AVR_Response.slice(2,4)),akt=true)}
                                 else {
                                
                                  AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                                id='javascript.0.Denon.Zone_2.Select_Input';
                                val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response);
                                if (val>=0){setState(id,val,akt=true);}
                                 }
                                break;
                                
                            case'Z3':
                               if (AVR_Response=='Z3OFF'){setState('javascript.0.Denon.Zone_3.Power_Zone3',false,akt=true)}
                               else if (AVR_Response=='Z3ON'){setState('javascript.0.Denon.Zone_3.Power_Zone3',true,akt=true)}
                               else if (AVR_Response=='Z3MUON'){setState('javascript.0.Denon.Zone_3.Mute',true,akt=true)}
                               else if (AVR_Response=='Z3MUOFF'){setState('javascript.0.Denon.Zone_3.Mute',true,akt=true)}
                                else if (true !==isNaN(parseInt(AVR_Response.slice(2,4)))){
                                   
                                    setState("javascript.0.Denon.Zone_3.Volume",parseFloat(AVR_Response.slice(2,4)),akt=true)}
                                 else {
                                
                                  AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                                id='javascript.0.Denon.Zone_3.Select_Input';
                                val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response);
                                if (val>=0){setState(id,val,akt=true);}
                                 }
                                break;    
                            
                            case 'MV':
                                // to Request MV?
                                AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                                if (AVR_Response.length<3){AVR_Response=AVR_Response+'0'}
                                AVR_Response=AVR_Response.slice(0, 2)+'.'+AVR_Response.slice(2, 3);
                               setState("javascript.0.Denon.Zone_Main.Master_Volume",parseFloat(AVR_Response),akt=true);
                                
                               break;
                               
                             case 'MVMAX':
                                AVR_Response=AVR_Response.slice(6,AVR_Response.length);
                                AVR_Response=AVR_Response.slice(0, 2)+'.'+AVR_Response.slice(2, 3);
                               setState("javascript.0.Denon.Zone_Main.Master_Volume_Max",parseFloat(AVR_Response),akt=true);
                               break;  
                               
                            case 'SV': 
                                // to Request SV?
                                if (AVR_Response=='SVOFF'){setState("javascript.0.Denon.Zone_Main.Video_State",false,akt=true)}
                                else if (AVR_Response=='SVON'){setState("javascript.0.Denon.Zone_Main.Video_State",true,akt=true)}
                                else {
                                
                                AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                                id = 'javascript.0.Denon.Zone_Main.Video_Input';
                                val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response); //suche in array nach element
                                
                                setState(id,val,akt=true);
                                }
                               break;
                               
                            case 'SI':
                                // to Request SI?
                                AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                                id='javascript.0.Denon.Zone_Main.Select_Input';
                                val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response);
                                
                                setState(id,val,akt=true);
                                setState('javascript.0.Denon.Zone_Main.Input_Text',AVR_Response,akt=true);
                                
                               if (AVR_Response=='NET'){
                                StaticPollen=setInterval(sendMessage,2000,'NSE');  //wenn Quelle = NET ist (z.b. Spotify) OSD Informationen Pollen mit 2s
                                }
                               
                               else {if ("undefined" !== typeof StaticPollen){clearInterval(StaticPollen)}
                               }
                               break;  
                               
                            case 'ZM':
                                // to Request ZM?
                                if (AVR_Response=='ZMOFF'){setState('javascript.0.Denon.Zone_Main.Power',false,akt=true)}
                                if (AVR_Response=='ZMON'){setState('javascript.0.Denon.Zone_Main.Power',true,akt=true)}
                               break;
                               
                            case 'MS':
                                // to Request MS? 
                                AVR_Response=AVR_Response.slice(2,AVR_Response.length);
                                setState("javascript.0.Denon.Zone_Main.Surround_Mode",AVR_Response,akt=true);
                               break;
                               
                            case 'VS':
                                
                                // to Request VSASP ?
                                id = "javascript.0.Denon.Zone_Main.Ratio_Mode";
                                if (AVR_Response=='VSASPFUL'){setState(id,'16:9',akt=true)}
                                else if (AVR_Response=='VSASPNRM'){setState(id,'4:3',akt=true)}
                                
                                // to Request VSSC ?
                                id = "javascript.0.Denon.Zone_Main.Resolution";
                                if (AVR_Response=='VSSC48P'){setState(id,'480p/576p',akt=true)}
                                else if (AVR_Response=='VSSC10I'){setState(id,'1080i',akt=true)}
                                else if (AVR_Response=='VSSC72P'){setState(id,'720p',akt=true)}
                                else if (AVR_Response=='VSSC10P'){setState(id,'1080p',akt=true)}
                                else if (AVR_Response=='VSSC10P24'){setState(id,'1080p:24Hz',akt=true)}
                                else if (AVR_Response=='VSSC4K'){setState(id,'4K',akt=true)}
                                else if (AVR_Response=='VSSC4KF'){setState(id,'4K 60/50Hz',akt=true)}
                                else if (AVR_Response=='VSSCAUTO'){setState(id,'AUTO',akt=true)}
                                
                                //to Request MONI ? 
                                id='javascript.0.Denon.Zone_Main.HDMI_Monitor';
                                 if (AVR_Response=='VSMONIAUTO'){setState(id,0,akt=true)}
                                 else if (AVR_Response=='VSMONI1'){setState(id,1,akt=true)}
                                 else if (AVR_Response=='VSMONI2'){setState(id,2,akt=true)}
                               break; 
                         
                            case 'PS':
                                
                                // to Request PSMODE: ?
                                setState("javascript.0.Denon.Zone_Main.Sound_Parameter",AVR_Response.slice(7,AVR_Response.length),akt=true);
                                break;
                                
                            
                            case 'NSE':
                                
                                  // to Request NSE  // Achtung ohne ? 
                                id='javascript.0.Denon.OSD.OSD_Info_List'+AVR_Response.slice(3, 4);
                                
                                if (getState(id)) {             //prüfen ob State vorhanden ist
                                setState (id,AVR_Response=AVR_Response.slice(4,AVR_Response.length),akt=true);
                                }
                              
                                break;
                                
                            case 'TR':
                                
                                if (AVR_Response=='TR1 OFF'){setState('javascript.0.Denon.System.Trigger_1',false,akt=true)}
                                else if (AVR_Response=='TR1 ON'){setState('javascript.0.Denon.System.Trigger_1',true,akt=true)}
                                else if (AVR_Response=='TR2 OFF'){setState('javascript.0.Denon.System.Trigger_2',false,akt=true)}
                                else if (AVR_Response=='TR2 ON'){setState('javascript.0.Denon.System.Trigger_2',true,akt=true)}
                                break;
                                
                            case 'DIM':
                                 AVR_Response=AVR_Response.slice(4,AVR_Response.length);
                                id='javascript.0.Denon.System.Display_Dimmer';
                                val=StateText_toArray(getObject(id).common.states).indexOf(AVR_Response);
                                
                                setState(id,val,akt=true);
                                
                                break;
                            
                            case 'TFANNAME':
                                 setState('javascript.0.Denon.Tuner_Control.RDS_Station_Name',val=AVR_Response.slice(8,AVR_Response.length),akt=true);    
                                break;
                                
                            case 'TPANMEM':
                                AVR_Response=AVR_Response.slice(7,AVR_Response.length);
                                if (AVR_Response.length==2){         //29.08.2017 angepasst
                                setState('javascript.0.Denon.Tuner_Control.Preset_Number',parseInt(AVR_Response),akt=true);
                                }
                                
                                break;
                                
                            case 'NSET1':
                                if (AVR_Response.slice(5,8)=='IPA'){
                                    var IPstring=AVR_Response.slice(9,AVR_Response.length);
                                    if(IPstring[12]=='0'){
                                    IPstring=IPstring.substr(0, 12) + '' + IPstring.substr(13,14);
                                    }
                        

                        ! setState('javascript.0.Denon.System.IP_Adresse',val=IPstring,akt=true);

                                }
                                break;    
                            
                            case 'NSFRN': 
                                setState('javascript.0.Denon.System.Name',val=AVR_Response.slice(5,AVR_Response.length),akt=true);
                                break;
                                
                            default:
                                //console.log('häääää????');
                        }
                        

                        }

                        //--------------------------------------------------------------------------------------
                        on('javascript.0.Denon.System.IP_Adresse', function (obj){
                        if(getState('javascript.0.Denon.System.Verbunden').val===true){

                        killClient(client);
                           checkIP(obj.state.val);
                        }
                        else{checkIP(obj.state.val)}
                        

                        });

                        ! on({id:'javascript.0.Denon.System.UPDATE',val:true}, function (obj){

                           update(t_request);
                        

                        });

                        ! on({id:"javascript.0.Denon.System.Command",change:"any"}, function (obj){sendMessage(obj.state.val+'')});
                        ! on("javascript.0.Denon.System.Power_System", function (obj){
                        if (!obj.state.ack) {
                        if (obj.state.val){
                        sendMessage('PWON');
                        }
                        else{sendMessage('PWSTANDBY')}
                        }
                        });
                        ! on('javascript.0.Denon.Zone_Main.Power', function (obj){
                        if (!obj.state.ack) {
                        if (obj.state.val){
                        sendMessage('ZMON');
                        }
                        else{sendMessage('ZMOFF')}
                        }
                        });
                        ! on('javascript.0.Denon.Zone_2.Power_Zone2', function (obj){
                        if (!obj.state.ack) {
                        if (obj.state.val){sendMessage('Z2ON')}
                        else{sendMessage('Z2OFF')}
                        }
                        });
                        ! on('javascript.0.Denon.Zone_3.Power_Zone3', function (obj){
                        if (!obj.state.ack) {
                        if (obj.state.val){sendMessage('Z3ON')}
                        else{sendMessage('Z3OFF')}
                        }
                        });
                        ! on("javascript.0.Denon.Zone_Main.Mute", function (obj){
                        if (!obj.state.ack) {
                        if (obj.state.val){sendMessage('MUON')}
                        else{sendMessage('MUOFF')}
                        }
                        });
                        ! on("javascript.0.Denon.Zone_2.Mute", function (obj){
                        if (!obj.state.ack) {
                        if (obj.state.val){sendMessage('Z2MUON')}
                        else{sendMessage('Z2MUOFF')}
                        }
                        });
                        ! on("javascript.0.Denon.Zone_3.Mute", function (obj){
                        if (!obj.state.ack) {
                        if (obj.state.val){sendMessage('Z3MUON')}
                        else{sendMessage('Z3MUOFF')}
                        }
                        });
                        ! on("javascript.0.Denon.Zone_Main.Master_Volume", function (obj){
                        if (!obj.state.ack) {
                        sendMessage('MV'+obj.state.val+'');
                        }
                        });
                        ! on({id:"javascript.0.Denon.Zone_Main.Master_Volume_UP",val:true}, function (obj){
                        if (!obj.state.ack) {
                        sendMessage('MVUP'+'');
                        }
                        });
                        ! on({id:"javascript.0.Denon.Zone_Main.Master_Volume_DOWN",val:true}, function (obj){
                        if (!obj.state.ack) {
                        sendMessage('MVDOWN'+'');
                        }
                        });
                        ! on("javascript.0.Denon.Zone_2.Volume", function (obj){
                        if (!obj.state.ack) {
                        sendMessage('Z2'+obj.state.val+'');
                        }
                        });
                        ! on({id:"javascript.0.Denon.Zone_2.Volume_UP",val:true}, function (obj){
                        if (!obj.state.ack) {
                        sendMessage('Z2UP'+'');
                        }
                        });
                        ! on({id:"javascript.0.Denon.Zone_2.Volume_DOWN",val:true}, function (obj){
                        if (!obj.state.ack) {
                        sendMessage('Z2DOWN'+'');
                        }
                        });
                        ! on("javascript.0.Denon.Zone_3.Volume", function (obj){
                        if (!obj.state.ack) {
                        sendMessage('Z3'+obj.state.val+'');
                        }
                        });
                        ! on({id:"javascript.0.Denon.Zone_3.Volume_UP",val:true}, function (obj){
                        if (!obj.state.ack) {
                        sendMessage('Z3UP'+'');
                        }
                        });
                        ! on({id:"javascript.0.Denon.Zone_3.Volume_DOWN",val:true}, function (obj){
                        if (!obj.state.ack) {
                        sendMessage('Z3DOWN'+'');
                        }
                        });
                        ! on({id:"javascript.0.Denon.Control.Play",vla:true}, function (obj){
                        sendMessage('NS9A')
                        });
                        ! on({id:"javascript.0.Denon.Control.Stop",val:true}, function (obj){
                        sendMessage('NS9C')
                        });
                        ! on({id:"javascript.0.Denon.Control.Pause",val:true}, function (obj){
                        //if (obj.state.val===true){sendMessage('NS9B')}
                        sendMessage('NS9B');
                        });
                        ! on({id:"javascript.0.Denon.Control.Skip_Plus",val:true}, function (obj){
                        sendMessage('NS9D')
                        });
                        ! on({id:"javascript.0.Denon.Control.Skip_Minus",val:true}, function (obj){
                        sendMessage('NS9E')
                        });
                        ! on({id:"javascript.0.Denon.Control.Page_Next",val:true}, function (obj){
                        sendMessage('NS9X')
                        });
                        ! on({id:"javascript.0.Denon.Control.Page_Previous",val:true}, function (obj){
                        sendMessage('NS9Y')
                        });
                        ! on('javascript.0.Denon.Zone_Main.Select_Input', function (obj){
                        if (!obj.state.ack) {
                        if(obj.state.val>=0){
                        sendMessage('SI'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
                        }
                        }
                        });
                        ! on('javascript.0.Denon.Zone_2.Select_Input', function (obj){
                        if (!obj.state.ack) {
                        if(obj.state.val>=0){
                        sendMessage('Z2'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
                        }
                        }
                        });
                        ! on('javascript.0.Denon.Zone_3.Select_Input', function (obj){
                        if (!obj.state.ack) {
                        if(obj.state.val>=0){
                        sendMessage('Z3'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
                        }
                        }
                        });
                        ! on('javascript.0.Denon.Zone_Main.Video_Input', function (obj){
                        if (!obj.state.ack) {
                        if(obj.state.val>=0){
                        sendMessage('SV'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
                        }
                        }
                        });
                        ! on('javascript.0.Denon.Zone_Main.Video_State', function (obj){
                        if (!obj.state.ack) {
                        if (obj.state.val===true){sendMessage('SVON')}
                        else{sendMessage('SVOFF')}
                        }
                        });
                        ! on('javascript.0.Denon.Zone_Main.HDMI_Monitor', function (obj){
                        if (!obj.state.ack) {
                        if(obj.state.val>=0){
                        sendMessage('VS'+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
                        }
                        }
                        });
                        ! on("javascript.0.Denon.System.Trigger_1", function (obj){
                        if (!obj.state.ack) {
                        if (obj.state.val===true){sendMessage('TR1 ON')}
                        else{sendMessage('TR1 OFF')}
                        }
                        });
                        ! on("javascript.0.Denon.System.Trigger_2", function (obj){
                        if (!obj.state.ack) {
                        if (obj.state.val===true){sendMessage('TR2 ON')}
                        else{sendMessage('TR2 OFF')}
                        }
                        });
                        ! on('javascript.0.Denon.System.Display_Dimmer', function (obj){
                        if (!obj.state.ack) {
                        if(obj.state.val>=0){
                        sendMessage('DIM '+ StateText_toArray(obj.common.states)[obj.state.val].toUpperCase() );
                        }
                        }
                        });
                        ! on({id:'javascript.0.Denon.Tuner_Control.Frequency_UP',val:true}, function (obj){sendMessage('TFANUP')});
                        ! on({id:'javascript.0.Denon.Tuner_Control.Frequency_DOWN',val:true}, function (obj){sendMessage('TFANDOWN')});
                        ! on({id:'javascript.0.Denon.Tuner_Control.Preset_UP',val:true}, function (obj){sendMessage('TPANUP')});
                        ! on({id:'javascript.0.Denon.Tuner_Control.Preset_DOWN',val:true}, function (obj){sendMessage('TPANDOWN')});
                        ! on('javascript.0.Denon.Tuner_Control.Preset_Number', function (obj){
                        if (obj.state.val.toString().length<2){
                        sendMessage('TPAN'+'0'+obj.state.val.toString())
                        }
                        else{sendMessage('TPAN'+obj.state.val.toString())}

                        });

                        ! //---------------------------------------------------------------------------------------
                        ! // close connection if script stopped-------------------------------------------------
                        onStop(function () {
                        if(getState('javascript.0.Denon.System.Verbunden').val===true){killClient(client)};
                        }, 2000 /ms/); Gut läuft das Script solange Spannung am Denon anliegt. Ich habe jedoch auch eine schaltbare Steckdose. Wenn ich dann anschalte, funktioniert es erst wenn ich das Script neustarte. ! Oder wenn das SCript läuft und ich aus und anschalte, geht das SCript erst nach neustarten. Ich pinge den Denon mit dem Radar-Adapter. Das geht ganz gut. Steckdose AN und nach einiger Zeit ist IP erreichbar, nach Ausschalten entsprechend IP nicht erreichbar. ! Da das Script nicht mit dem An und Ausschalten klar kommt, funktioniert da auch nicht unter System/Verbunden true/false nicht. Vielleicht kann man das Pingen da irgendwie in den Adapter einbauen? Für mich wird der workaround so werden: wenn IP erreichbar starte Script, wenn nicht, schalte Script aus.[/i][/i][/i] ``` `

                        Host: NUC8i3 mit Proxmox:

                        • ioBroker CT Debian 13, npm 10.9.4, nodejs 22.21.0
                        • Slave: Pi4
                        1 Reply Last reply
                        0
                        • L Offline
                          L Offline
                          Lucky
                          wrote on last edited by
                          #58

                          Hab ich so nie ausprobiert, meiner ist immer am Netz. Bekommst du im log ein Timeout oder host unreach?

                          1 Reply Last reply
                          0
                          • lobomauL Offline
                            lobomauL Offline
                            lobomau
                            wrote on last edited by
                            #59

                            @Lucky:

                            Hab ich so nie ausprobiert, meiner ist immer am Netz. Bekommst du im log ein Timeout oder host unreach? Steckdose aus und Script Start: > javascript.0 2017-08-30 13:50:11.753 info script.js.common.Denon: Connection closed !

                            javascript.0 2017-08-30 13:50:11.753 error script.js.common.Denon: Error: connect EHOSTUNREACH 192.168.178.54:23

                            javascript.0 2017-08-30 13:50:08.746 info script.js.common.Denon: Connectig… `

                            Denon im Standby, dann Steckdose AUS, passiert nichts, Scriptwerte quasi eingefroren, zeigt noch "verbunden" an (zwischen 'PWSTANDBY' und 'Anfrage: ZMON' ausgeschaltet):
                            ` > javascript.0 2017-08-30 13:55:04.936 info script.js.common.Denon: Anfrage: ZMON

                            javascript.0 2017-08-30 13:53:32.882 info script.js.common.Denon: PWSTANDBY

                            javascript.0 2017-08-30 13:53:32.837 info script.js.common.Denon: ZMOFF

                            javascript.0 2017-08-30 13:53:32.826 info script.js.common.Denon: Anfrage: ZMOFF

                            javascript.0 2017-08-30 13:53:19.242 info script.js.common.Denon: Anfrage: MV6.5

                            javascript.0 2017-08-30 13:53:14.292 info script.js.common.Denon: Anfrage: MV5 `

                            Ich komme mit meinem workaround gut klar. Solltest du mal Testen mit Stromlos machen, ob alles wie gewünscht läuft. Strom kann ja mal ausfallen.

                            Host: NUC8i3 mit Proxmox:

                            • ioBroker CT Debian 13, npm 10.9.4, nodejs 22.21.0
                            • Slave: Pi4
                            1 Reply Last reply
                            0
                            • K Offline
                              K Offline
                              Kueppert
                              wrote on last edited by
                              #60

                              @lobomau: wie sieht denn dein Script dann aus? Hab den Denon auch an einer Fibaro Dose hängen…

                              Danke dir und Grüße, Thorsten

                              Gesendet von meinem HUAWEI RIO-L01 mit Tapatalk

                              UDM Pro, Intel NUC - ioBroker in Proxmox-VM, PiHole+Grafana&Influx+TasmoAdmin in LXCs, Raspberry Pi3 (als CCU), Zigbee-Stick Sonoff, Synology DS918+

                              1 Reply Last reply
                              0
                              • L Offline
                                L Offline
                                Lucky
                                wrote on last edited by
                                #61

                                das Problem bei der Sache ist, das wenn der AVR vom Strom genommen wird, er die Verbindung nicht richtig beendet, wie auch ! Der Client bekommt dies nach einer gewissen Zeit mit, und auch erst wenn vorher etwas gesendet wurde tritt ECONNRESET ein und die Verbindung wird vom Client geschlossen . Mann müsste in diesem Fall ständig versuchen die Verbindung neu herzustellen.

                                Da die Kommunikation beidseitig Event getriggert ist, kann man auch nicht mir einem Timeout arbeiten…

                                Mir würde jetzt neben dem ständigen Pingen nur einfallen das man immer einen Status pollt und wenn nach einem Timeout keine Antwort kommt, versucht die Verbindung neu herzustellen

                                1 Reply Last reply
                                0
                                • lobomauL Offline
                                  lobomauL Offline
                                  lobomau
                                  wrote on last edited by
                                  #62

                                  @Kueppert:

                                  @lobomau: wie sieht denn dein Script dann aus? Hab den Denon auch an einer Fibaro Dose hängen…

                                  Danke dir und Grüße, Thorsten

                                  Gesendet von meinem HUAWEI RIO-L01 mit Tapatalk `
                                  Es ist das simpelste Script, dass es gibt. Ein blockly triggert auf Radar IP des Denon. Wenn da start Denon Script, sonst Stop Denon Script.

                                  Kann ich gerne danach mal zeigen.

                                  Host: NUC8i3 mit Proxmox:

                                  • ioBroker CT Debian 13, npm 10.9.4, nodejs 22.21.0
                                  • Slave: Pi4
                                  1 Reply Last reply
                                  0
                                  • uweklattU Offline
                                    uweklattU Offline
                                    uweklatt
                                    wrote on last edited by
                                    #63

                                    Hallo Lucky,

                                    vielen Dank für Dein Script!

                                    Mir sind einige Dinge beim Testen mit einem Denon X4000 aufgefallen:

                                    1. Es gibt einen Schreibfehler bei den Kommandos. "FAVOTITES" sollte vermutlich "FAVORITES" heissen ;-)

                                    2. Eine Reaktion auf NSET1 ändert "Denon.System.IP_Adresse" und ist eigentlich nicht notwendig, wenn die IP dort manuell eingetragen wird.

                                    3. Die Displaydaten "NSE0 … NSE8" werden nicht regelmäßig aktualisiert.

                                    4. Teilweise werden mehrere "NESx" in einem empfangenen Datenpaket übertragen. Dann stimmt die Textanzeige nicht mehr. Mitunter werden sogar Antwortkennung "NSE1" und die zugehörigen Daten durch einen Zeilentrenner "zertrennt".

                                    Ich habe das in der beiliegenden Version wie folgt geändert:

                                    1. Alle "FAVOTITES" durch "VAVORITES" ersetzt

                                    2. Reaktion auf "NSET1" deaktiviert (auskommentiert)

                                    3. Eine zusätzliche update2() hinzugefügt, die nur die NESx abruft und über schedule() alle 15 Sekunden aufgerufen wird.

                                    4. Die Empfangenen Datenpakete werden vor der Übergabe an response() in die einzelne Antworten zerlegt und bei Bedarf auch zusammengefügt.

                                    Tschau

                                    Uwe
                                    3419_denon-adapter.txt

                                    Proxmox/LXC/Docker

                                    1 Reply Last reply
                                    0
                                    • uweklattU Offline
                                      uweklattU Offline
                                      uweklatt
                                      wrote on last edited by
                                      #64

                                      Hallo nochmal,

                                      ich habe eine von mir aktuell genutzte Testview beigelegt.

                                      Damit kann man einige Funktionen direkt "bedienen".

                                      Bei allen Buttons muss noch die IP-Adresse des Denon angepasst werden!
                                      3419_bild2.png

                                      Tschau

                                      Uwe

                                      Proxmox/LXC/Docker

                                      1 Reply Last reply
                                      0
                                      • K Offline
                                        K Offline
                                        Kueppert
                                        wrote on last edited by
                                        #65

                                        Hi Uweklatt, kannst du noch einen Screen von deinem View beilegen?

                                        Danke und Grüße, Thorsten

                                        Gesendet von meinem HUAWEI RIO-L01 mit Tapatalk

                                        UDM Pro, Intel NUC - ioBroker in Proxmox-VM, PiHole+Grafana&Influx+TasmoAdmin in LXCs, Raspberry Pi3 (als CCU), Zigbee-Stick Sonoff, Synology DS918+

                                        1 Reply Last reply
                                        0
                                        • HomoranH Do not disturb
                                          HomoranH Do not disturb
                                          Homoran
                                          Global Moderator Administrators
                                          wrote on last edited by
                                          #66

                                          Hallo Uwe und Willkommen im Forum!

                                          @uweklatt:

                                          1. Alle "FAVOTITES" durch "VAVORITES" ersetzt `
                                            nicht wirklich, oder? :lol:

                                          Viel Spaß im Forum

                                          Gruß

                                          Rainer

                                          kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

                                          Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

                                          der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          716

                                          Online

                                          32.6k

                                          Users

                                          82.3k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Home
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe