Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Senderwechsel Sony Bravia numerisch

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Senderwechsel Sony Bravia numerisch

    This topic has been deleted. Only users with topic management privileges can see it.
    • B
      bommel_030 last edited by

      Ich habe einen Sony TV, der sich auch grundsätzlich mit dem Adapter gut bedienen lässt. Nun habe ich angefangen mir die Frenbedienung in VIS nachzubauen, habe dabei aber festgestellt, dass ich die Sender nicht als Zahl eingeben kann. Habe für die Zahlen 0...9 je einen Datenpunkt als Button im Adapter. Nun will ich im VIS z.B. auf ein Senderlogo drücken und der entsprechende Sender soll auf dem Bildschirm erscheinen. Für die ersten 9 Sender kein Problem, kann ja den Button mit dem Bild triggern. Sobald es aber zwei- oder gar dreistellig wird klappt das nicht (Zumindest ist mir nicht bekannt wie ich mit einem Button State aus VIS 3 Aktionen verzögert ausführe).
      Da ich blutiger Anfänger in Sachen Javascript bin hab ich mir erstmal pro Datenpunkt ein Script geschrieben.

      let Num1 = "AAAAAQAAAAEAAAAAAw==";
      let Num2 = "AAAAAQAAAAEAAAABAw==";
      let Num3 = "AAAAAQAAAAEAAAACAw==";
      let Num4 = "AAAAAQAAAAEAAAADAw==";
      let Num5 = "AAAAAQAAAAEAAAAEAw==";
      let Num6 = "AAAAAQAAAAEAAAAFAw==";
      let Num7 = "AAAAAQAAAAEAAAAGAw==";
      let Num8 = "AAAAAQAAAAEAAAAHAw==";
      let Num9 = "AAAAAQAAAAEAAAAIAw==";
      let Num0 = "AAAAAQAAAAEAAAAJAw==";
      let Path = "sony-bravia.0.channel.";
      
      on({id: '0_userdata.0.Fontane.TV.Channel.10', change: "ne"}, function (obj) {
       var value = obj.state.val;
       var oldValue = obj.oldState.val;
       if (true) {
         setState("sony-bravia.0.channel.AAAAAQAAAAEAAAAAAw=="/*Num1*/, true);
         setStateDelayed("sony-bravia.0.channel.AAAAAQAAAAEAAAAJAw=="/*Num0*/, true, 500, false);
         setStateDelayed("0_userdata.0.Fontane.TV.Channel.10"/*Channel.10*/, false, 1000, false);
         setStateDelayed("0_userdata.0.Fontane.TV.Sender"/*TV Sender*/, 10, 1000, false);
       }
      });
      on({id: '0_userdata.0.Fontane.TV.Channel.11', change: "ne"}, function (obj) {
       var value = obj.state.val;
       var oldValue = obj.oldState.val;
       if (true) {
         setState("sony-bravia.0.channel.AAAAAQAAAAEAAAAAAw=="/*Num1*/, true);
         setStateDelayed("sony-bravia.0.channel.AAAAAQAAAAEAAAAAAw=="/*Num1*/, true, 500, false);
         setStateDelayed("0_userdata.0.Fontane.TV.Channel.11"/*Channel.11*/, false, 1000, false);
         setStateDelayed("0_userdata.0.Fontane.TV.Sender"/*TV Sender*/, 11, 1000, false);
       }
      });
      on({id: '0_userdata.0.Fontane.TV.Channel.12', change: "ne"}, function (obj) {
       var value = obj.state.val;
       var oldValue = obj.oldState.val;
       if (true) {
         setState(Path + Num1, true);
         setStateDelayed(Path + Num2, true, 500, false);
         setStateDelayed("0_userdata.0.Fontane.TV.Channel.12"/*Channel.12*/, false, 1000, false);
         setStateDelayed("0_userdata.0.Fontane.TV.Sender"/*TV Sender*/, 12, 1000, false);
       }
      });
      


      Hat so weit auch geklappt, aber man will ja was lernen und das muss ja irgendwie auch einfacher gehen. Also dachte ich mir, ich versuche mich mal an Variablen. Daraus entstand dann der obere let-Block und der letzte Trigger-Block.
      Das hat soweit auch alles funktioniert, hätte aber immernoch 999 Datenpunkte für alle möglichen Sender gebraucht.

      Daraus entstand dann das.

      //Pfadangabe Adapter
      let Path = "sony-bravia.0.channel.";
      //Aufrufcodes Sendertasten
      let Num1 = "AAAAAQAAAAEAAAAAAw==";
      let Num2 = "AAAAAQAAAAEAAAABAw==";
      let Num3 = "AAAAAQAAAAEAAAACAw==";
      let Num4 = "AAAAAQAAAAEAAAADAw==";
      let Num5 = "AAAAAQAAAAEAAAAEAw==";
      let Num6 = "AAAAAQAAAAEAAAAFAw==";
      let Num7 = "AAAAAQAAAAEAAAAGAw==";
      let Num8 = "AAAAAQAAAAEAAAAHAw==";
      let Num9 = "AAAAAQAAAAEAAAAIAw==";
      let Num0 = "AAAAAQAAAAEAAAAJAw==";
      
      let Kanal_normiert = 0;
      let timeout;
      let timeout2;
      
      
      //Trigger Sender als Zahl eingegeben
      on({id: '0_userdata.0.Fontane.TV.Sender', change: "ne"}, function (obj) {
      
       //Sender auf 4stellig normiert
       Kanal_normiert = getState("0_userdata.0.Fontane.TV.Sender").val + 1000;
       setState("0_userdata.0.Fontane.TV.Sender_normiert"/*Sender_normiert*/, Kanal_normiert, true);
       setState("0_userdata.0.Fontane.TV.einer"/*einer*/, parseFloat((('' + Kanal_normiert).slice(-1).charAt(0))), true);
       setState("0_userdata.0.Fontane.TV.zehner"/*zehner*/, parseFloat((('' + Kanal_normiert).slice(-2).charAt(0))), true);
       setState("0_userdata.0.Fontane.TV.hunderter"/*hunderter*/, parseFloat((('' + Kanal_normiert).slice(-3).charAt(0))), true);
       //Normierte Ausgabe zur Kontrolle
       timeout = setTimeout(function () {
         setState("0_userdata.0.Fontane.TV.Sender_Ausgabe"/*Sender_Ausgabe*/, (getState("0_userdata.0.Fontane.TV.hunderter").val * 100 + getState("0_userdata.0.Fontane.TV.zehner").val * 10 + getState("0_userdata.0.Fontane.TV.einer").val), true);
       }, 3000);
      
      
      var channelhunderter = "Num" + getState("0_userdata.0.Fontane.TV.hunderter").val;
      var channelzehner = "Num" + getState("0_userdata.0.Fontane.TV.zehner").val;
      var channeleiner = "Num" + getState("0_userdata.0.Fontane.TV.einer").val;
      
      
         //Sendertaste Hunderter drücken
         setState(Path + channelhunderter, true);
         //Sendertaste Zehner drücken
         setStateDelayed(Path + channelzehner, true, 500, false);
         //Sendertaste Einer drücken
         setStateDelayed(Path + channeleiner, true, 1500, false);
       });
      


      Hier scheitere ich aber quasi ab Zeile 35 und ich verstehe nicht warum...
      Kurz zum Aufbau, ich lasse mir eine Zahl in einen Datenpunkt schreiben. Um mich nicht gleich zu überfordern wird alles auf eine 4-stellige Zahl gebracht und dann Einer, Zehner und Hunderter einzelnen extrahiert. Soweit läuft es. Dann wollte ich mir aus den 3 Zahlen die drei Variablen für die Tastendrücke zusammenbauen.
      Ich bekomme im Log aber die Meldung:

      (29284) State "sony-bravia.0.channel.Num7" not found
      

      Was ja auch richtig ist, weil er ja eigentlich nicht das zusammengebaute Num7, sondern den Wert der Variable Num7 verwenden soll.

      Vielleicht kann mir einer mal Licht ans Rad machen... Wenn es läuft will ich die Datenpunkte durch interne Variablen ersetzt. War für mich nur einfache nachzuvollziehen bis wohin er was macht.

      chralt 1 Reply Last reply Reply Quote 0
      • B
        bommel_030 last edited by

        Falls jemand die Lösung interessiert. Sicherlich nicht optimal, aber funktioniert.

        //Aufrufcodes Sendertasten Array
        var Num = ['AAAAAQAAAAEAAAAJAw==','AAAAAQAAAAEAAAAAAw==', 'AAAAAQAAAAEAAAABAw==', 'AAAAAQAAAAEAAAACAw==', 'AAAAAQAAAAEAAAADAw==','AAAAAQAAAAEAAAAEAw==','AAAAAQAAAAEAAAAFAw==','AAAAAQAAAAEAAAAGAw==','AAAAAQAAAAEAAAAHAw==','AAAAAQAAAAEAAAAIAw=='];
        //Pfadangabe Adapter
        const pfad = "sony-bravia.0.channel.";
        let Kanal_normiert = 0;
        
        //Trigger Sender als Zahl eingegeben
        on({id: '0_userdata.0.Fontane.TV.Sender', change: "ne"}, function (obj) {
        //Sender auf 4stellig normiert
         Kanal_normiert = getState("0_userdata.0.Fontane.TV.Sender").val + 1000;
        //Zerlegen
        var einer = parseFloat((('' + Kanal_normiert).slice(-1).charAt(0)));
        var zehner =  parseFloat((('' + Kanal_normiert).slice(-2).charAt(0)));
        var hunderter = parseFloat((('' + Kanal_normiert).slice(-3).charAt(0)));
        //Variable zusammenbauen
        var channelhunderter    = Num[hunderter];
        var channelzehner       = Num[zehner];
        var channeleiner        = Num[einer];
        /* //Testausgabe im Log
        console.log(pfad + channelhunderter);
        console.log(pfad + channelzehner);
        console.log(pfad + channeleiner);
        */
        
           //Sendertaste Hunderter drücken
           setState(pfad + channelhunderter, true);
           //Sendertaste Zehner drücken
           setStateDelayed(pfad + channelzehner, true, 500, false);
           //Sendertaste Einer drücken
           setStateDelayed(pfad + channeleiner, true, 1000, false);
        
         });
        

        1 Reply Last reply Reply Quote 0
        • chralt
          chralt @bommel_030 last edited by

          @bommel_030
          Hallo,

          genau vor dem Problem stehe ich auch, siehe: https://forum.iobroker.net/assets/uploads/files/1578933103436-tv.jpg

          Was ich bei Deiner Lösung nicht verstehe ist wie ich das Script an die beschiedenen Senderschaltflächen bekomme.
          Ist ein bestimmter Widget-Tpp erforderlich und wo gebe ich die 3 Ziffern ein (und warum normierst Du auf 4-stellig und nicht als 3-stellig?) Muß das Script unter "<> Skripte" im Admin-Menü oder in den Reiter "Sripte" der jeweiligen Schaltfläche?
          Wenn ich letzteres mache haben alle Widges das Skript. das kann also auch nicht der richtige Weg ein.

          Fragen über Fragen

          Gruß
          chralt

          1 Reply Last reply Reply Quote 0
          • B
            bommel_030 last edited by

            @chralt
            Falls es noch von Interesse ist, das Skript wird ganz normal unter Skripte angelegt.
            Es gibt einen Datenpunkt (hier 0_userdata.0.Fontane.TV.Sender ), den musst du dir an einem beliebigen Ort anlegen.
            Sobald der Datenpunkt geändert wurde reagiert das Skript darauf und wechselt den Sender.
            In der VIS kannst du ein beliebiges Widget nehmen welches einen Wert sendet. Bei mir aus Scrounger´s material design "Icon Button State". Dem kannst du nun ein beliebiges Logo zuweisen und als Wert deinen Senderplatz.
            Hier im Screenshot 1 für ARD.
            3b3a3480-d339-453b-b5c7-bca6d3ff5aa6-image.png
            Auf vierstellig, weil mein Fernseher nur dreistellig kann ^^ Das Skript zerlegt den Wert in Hunderter / Zehner / Einer. Geht sicherlich auch eleganter, weil er z.B. bei ARD anstatt die ausreichende "1" eine "001" an den Fernseher schickt. War mir zu kompliziert die Anzahl der Stellen vorher abzufangen

            chralt 1 Reply Last reply Reply Quote 0
            • chralt
              chralt @bommel_030 last edited by

              @bommel_030
              Vielen Dank!

              Es funktioniert leider nicht, ich habe allerdings den dringrenden Verdacht das mein Javaskript nicht macht was es soll, genau genommen nix (meine Blocklys laufen auch nicht.)

              Ich denke ich werde mich also erst einmal um Javaskript kümmern.

              Aber trotzdem noch mal vielen Dank!

              Gruß
              chralt

              1 Reply Last reply Reply Quote 0
              • chralt
                chralt last edited by

                Hallo, @bommel_030

                es funktioniert!!👍

                Das Problem war tatsächlich javasript/Blockly: ich hatte alle Skripte in den Unterordner "global" gestellt da mir nicht klar war was das für Auswirkungen hat. ich habe nun alle Blocklys und Skripte in einen neuen Ordner gelegt und siehe da - es funktioniert.
                Was trotzdem komisch war: direkt nach dem verschieben des Skriptes (am 28.4.) hat es nicht funktioniert. Heute habe ich es wieder getestet und siehe da: es geht - warum auch immer .

                Was dann noch ein Problem war: die Grafiken (Senderlogos) wurden teilweise nicht oder nur mit Verzögerung angezeigt. Die Lösung dafür ist folgendes.
                35a524e4-d3a0-4b1f-8204-a04d176c2a62-grafik.png

                Gruß
                chralt

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                456
                Online

                31.9k
                Users

                80.2k
                Topics

                1.3m
                Posts

                javascript multimedia
                2
                6
                671
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo