Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Script ein/aus erweitern - aber wie ?

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Script ein/aus erweitern - aber wie ?

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

      Hi knx-shop,

      ich verstehe nicht genau was du machen willst… also:

      on({id: 'knx.0.Multimedia.WHZ_Samsung.Aus-Schalten'}, function (obj) {
      	console.log("Switch off Samsung TV");
      	setState ('samsung2016.0.tvOn', false);
      	setState ('knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_LineIn_mit_1', 0);
      });
      
      

      So, würdest du beim Ausschalten des Fernsehrs dein Sonos mit ausschalten.

      @my-knx-shop:

      Der TV ist angeschaltet und der Sonos hat am LineIn ein 1 anliegen, da ja Sonos an ist wenn der TV läuft.

      Jetzt will ich aber Musik hören und dass soll so laufen, dass ich sage: Sonos Wohnzimmer einschalten.

      Damit wird aktuell die Playtaste des Sonos aktiviert, nun muss aber der TV noch ausgeschaltet werden und der LineIn auf aus wie oben, aber nur wenn der TV auch an ist `
      Es gibt verschieden Möglichkeiten zu prüfen, ob dein TV an ist. Wenn dein Samsung am Netz ist, kannst du es z.B. anpingen.

      @my-knx-shop:

      Wie müsste also ein Script aussehen, dass erst abfragt ob der TV an ist ( der Wert wird mit hier mit true or false gemeldet: knx.0.Multimedia.WHZ_Samsung.Aus-Schalten ) um dann bei Sonos Wohnzimmer einschalten ( knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause ) zu entscheiden ob jetzt nur das Play ( knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause ) notwendig ist und dieses sendet oder erst TV aus ( mit LineIn auf aus 0 wie oben benötigt ) und dann play beim Sonos einschaltet ? `
      Hmm… verstehe ich nicht ganz was du machen willst. Also: Wenn du dein TV ausschaltest, dann soll Sonos auch ausgeschaltet werden, dann würde auch vielleicht Sinn machen, dass wenn dein TV eingeschaltet wird, dein Sonos aus an geht... und wenn du dein Sonos einschaltest, aber kein TV an ist, dann soll er Musik abspielen? Dürfte kein Problem sein... Ist es da was du willst?

      Grüße,

      ldittmar

      1 Reply Last reply Reply Quote 0
      • M
        my-knx-shop last edited by

        Sorry dass ich mich so missverständlich ausgedrück habe.

        Der Sonos ist ja eigentlich immer an. Es geht um den LineIn eingang.

        Dieser wird über die optische Schnittstelle vom TV aktiviert wenn der TV eingeschaltet wird. Und der LineIN ist setzt den Sonos auf TV.

        Jetzt will ich aber plötzlich musik hören. Dazu soll der TV einfach ausschalten und den LineIn wieder auf 0 setzen.

        Das sollte ja dein Script jetzt machen.

        Wenn nun wieder der TV eingeschaltet wird, schaltet der Sonos automatisch über das optische Kabel den Sonos auf LineIn ein.

        Bis hierher ist alles wenn dein Script läuft, in Ordnung.

        Wenn aber mal der TV schon ausgeschaltet ist, braucht aber kein Signal gesendet werden, dass der LineIn auf aus gehen soll, somit soll dann auch nur Play aktiviert werden.

        Ist der TV aber bereits eingeschaltet und ich möchte Musik hören, dann soll das obige Script ausgeführt werden und play am Sonos aktiviert werden.

        Um es mal mit den Codes zu machen: knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause - EIN soll schauen ob knx.0.Multimedia.WHZ_Samsung.Aus-Schalten true or false

        IF - knx.0.Multimedia.WHZ_Samsung.Aus-Schalten is true

        dann soll obiges Script ausgeührt werden und knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause auf EIN

        IF - knx.0.Multimedia.WHZ_Samsung.Aus-Schalten is false, dann nur knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause auf EIN

        Ich hoffe das es ich mich verständlich ausdrücken konnte 😉

        1 Reply Last reply Reply Quote 0
        • ldittmar
          ldittmar Developer last edited by

          @my-knx-shop:

          Um es mal mit den Codes zu machen: knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause - EIN soll schauen ob knx.0.Multimedia.WHZ_Samsung.Aus-Schalten true or false

          IF - knx.0.Multimedia.WHZ_Samsung.Aus-Schalten is true

          dann soll obiges Script ausgeührt werden und knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause auf EIN

          IF - knx.0.Multimedia.WHZ_Samsung.Aus-Schalten is false, dann nur knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause auf EIN `
          Hi,

          dann versuche ich mal.. hmm… aber du hast doch schon den Code fast geschrieben! Was brauchst du noch ein Hilfe? 😉 Hast du schon mal Blocky probiert? Ist voll einfach die einzelnen Teile zusammen zu schieben. Es mach auch Spaß und ich benutze es gerne um Schnell ein Konstrukt zu haben, bevor ich weiter programmiere... nun denn... ich denke es sollte so gehen:

          on({id: 'knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause'}, function (obj) {
          	if(knx.0.Multimedia.WHZ_Samsung.Aus-Schalten){
          		console.log("Switch off Samsung TV");
            		setState ('samsung2016.0.tvOn', false);
             		setState ('knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_LineIn_mit_1', 0);
             	}	
          	setState ('knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause', true);	 
          });
          
          

          hmm… das ist das was du beschrieben hast... habe ich es richtig verstanden?

          1 Reply Last reply Reply Quote 0
          • M
            my-knx-shop last edited by

            Klingt so genau nach dem was ich meinte.

            1000 Dank dafür. Ich probiere es heute oder morgen mal aus …

            Und zum Thema Blocky muss ich mal googlen was das ist und vielleicht kann ich es damit künftig selbst 😉

            1 Reply Last reply Reply Quote 0
            • Homoran
              Homoran Global Moderator Administrators last edited by

              @my-knx-shop:

              zum Thema Blocky muss ich mal googlen was das ist `
              Google sagt:http://www.iobroker.net/?page_id=5319&lang=de

              Gruß

              Rainer

              1 Reply Last reply Reply Quote 0
              • M
                my-knx-shop last edited by

                Ich muss noch etwas anpassen da sonst ein Fehler im Code gewesen wär. die striche vor und nach dem "knx.0.Multimedia.WHZ_Samsung.Aus-Schalten"

                Habe dazu aber mal eine Frage:

                on({id: 'knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause'}, function (obj) {

                if('knx.0.Multimedia.WHZ_Samsung.Aus-Schalten'){

                console.log("Switch off Samsung TV");

                setState ('samsung2016.0.tvOn', false);

                setState ('knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_LineIn_mit_1', false);

                }

                setState ('knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause', true);

                });

                Es wird soch abgefragt ob "knx.0.Multimedia.WHZ_Samsung.Aus-Schalten" eingeschaltet ist ode rnicht … aber wo ist hier der Wert, der sagt, wenn "knx.0.Multimedia.WHZ_Samsung.Aus-Schalten" ist true, dann soll ............... und falls "knx.0.Multimedia.WHZ_Samsung.Aus-Schalten" ist false, dann setState ('knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause', true);

                Kannst du mir das erläutern ?

                1 Reply Last reply Reply Quote 0
                • ldittmar
                  ldittmar Developer last edited by

                  Du hast doch geschrieben, dass wenn dein tv an ist sollen die Sachen gemacht werden und dann Sonos play

                  Sonst nur sonos play.

                  Also wird sonos play immer gemacht egal ob tv an ist oder nicht. Also braucht man kein Else Zweig und können so den Befehl ganz unten schreiben. 🙂

                  1 Reply Last reply Reply Quote 0
                  • M
                    my-knx-shop last edited by

                    Ja ja…. aber wo fragt das Script ob TV auf true oder False ist ?

                    1 Reply Last reply Reply Quote 0
                    • ldittmar
                      ldittmar Developer last edited by

                      Ohh… mein Fehler. Das kommt wenn man.am Handy programmieren will :lol: Sorry!

                      if(getState('knx.0.Multimedia.WHZ_Samsung.Aus-Schalten').val){...
                      
                      

                      So sieht es schon besser aus

                      1 Reply Last reply Reply Quote 0
                      • M
                        my-knx-shop last edited by

                        Danke, dass ".val" ist dann der Punkt der entscheidet ob TV ( 'samsung2016.0.tvOn' ) true or false bereits ist und dann den Rest des Scripts ausführt ?

                        1 Reply Last reply Reply Quote 0
                        • P
                          pix last edited by

                          Hallo,

                          Ja .val ist wichtig. 'samsung2016.0.tvOn' ist ein Objekt. Vereinfacht gesagt, da sind zB noch .val (aktueller Wert), .ts (Timestamp), .lc (lastchange) … drin.

                          Pix

                          1 Reply Last reply Reply Quote 0
                          • M
                            my-knx-shop last edited by

                            Verdammt … warum kapiere ich das nicht 😉

                            on({id: 'knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause'}, function (obj) {
                            if(getState('knx.0.Multimedia.WHZ_Samsung.Aus-Schalten').val){
                            console.log("Switch off Samsung TV");
                            setState ('samsung2016.0.tvOn', false);
                            setState ('knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_LineIn_mit_1', false);
                            }
                            setState ('knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause', true);
                            });
                            

                            Der Datenpunkt: knx.0.Multimedia.WHZ_Samsung.Aus-Schalten hat doch nur true oder false

                            und wenn nun dieser Datenpunkt ein true hat, soll der Datenpunkt samsung2016.0.tvOn das false bekommen.

                            Was macht denn ein .val bei dem Datenpunkt "knx.0.Multimedia.WHZ_Samsung.Aus-Schalten" ?

                            1 Reply Last reply Reply Quote 0
                            • Homoran
                              Homoran Global Moderator Administrators last edited by

                              @my-knx-shop:

                              Was macht denn ein .val bei dem Datenpunkt `
                              dass der Wert und nicht der name des Datenpunkts geändert wird.

                              Gruß

                              Rainer

                              1 Reply Last reply Reply Quote 0
                              • M
                                my-knx-shop last edited by

                                Hallo Rainer, ich komme da nicht mit !

                                Muss nicht erst einmal eine Abfrage stattfinden welcher Wert aktuell auf dem Datenpunkt liegt, bevor ein anderer Datenpunkt geändert wird ? Das getstate fragt also ab ! Jetzt muss aber doch entschieden werden was passieren soll wenn der Status aktuell bei true ist bzw. auf false ist.

                                Wo wird dieses entschieden und damit dann das weitere ausgeführt ?

                                1 Reply Last reply Reply Quote 0
                                • M
                                  my-knx-shop last edited by

                                  Also mit dem o.g. Script kommt es zu zuvielen Daten die geendet werden und zu Problemen und auch Fehlern. Bei Sonos ein geht der TV nicht aus.

                                  Ich vermute noch immer das die Abfrage nicht richtig ist.

                                  1 Reply Last reply Reply Quote 0
                                  • ldittmar
                                    ldittmar Developer last edited by

                                    Hi KNX-Shop,

                                    das Programm sollte genau das tun was du gesagt hast.

                                    on({id: 'knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause'}, function (obj) {
                                    	if(getState('knx.0.Multimedia.WHZ_Samsung.Aus-Schalten').val){
                                    		console.log("Switch off Samsung TV");
                                    		setState ('samsung2016.0.tvOn', false);
                                    		setState ('knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_LineIn_mit_1', false);
                                    	}
                                    	setState ('knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause', true);
                                    });
                                    
                                    

                                    Übersetzt steht im Code das hier:

                                    Wenn sich Sonos PlayPause ändert, dann führe folgendes aus:

                                    • Wenn mein Samsung.Aus-Schalter wahr ist, dann logge mal "Switch off Samsung TV", setze den Status tvOn auf unwahr, setze Sonos LineIn auf unwahr und stelle Sonos PlayPause auf wahr (was dazu führen könnte, dass das Skript nochmal ausgeführt wird)

                                    • Sonst setze nur Sonos PlayPause auf wahr (was dazu führen könnte, dass das Skript nochmal ausgeführt wird)

                                    Ok… irgendwas läuft da falsch, denn du hast hier eine Dauerschleife. Also nochmal: Was ist dein Trigger? Wenn dein Trigger stimmt, warum willst du PlayPause nochmal auf true setzen? Wenn das unbedingt notwendig sein sollte, musst du vorher eine Variable erstellen, der verhindert das es zu eine Dauerschleife kommt, denn sobald du PlayPause auf true stellst, wird dein Skript wieder ausgeführt. So ungefähr...

                                    var schondurchgelaufen = false;
                                    on({id: 'knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause'}, function (obj) {
                                    	if(!schondurchgelaufen){
                                    		if(getState('knx.0.Multimedia.WHZ_Samsung.Aus-Schalten').val){
                                    			console.log("Switch off Samsung TV");
                                    			setState ('samsung2016.0.tvOn', false);
                                    			setState ('knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_LineIn_mit_1', false);
                                    		}
                                    		setState ('knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause', true);
                                    		schondurchgelaufen = true;
                                    	}else{
                                    		schondurchgelaufen = false;
                                    	}
                                    });
                                    
                                    

                                    Hier wird vorher geschaut, ob es schon durchgelaufen ist. Wenn ja, dann führe das ganze nicht nochmal aus. Ich gehe hier davon aus, dass dein Skript immer zwei mal getriggert wird. Bedenke: Ich kann nur theoretisch für dich testen, denn ich habe die Komponenten ja nicht.

                                    Versuche mal mit Logs zu arbeiten. Geb einfach nach jede Zeile eine Meldung und ggf. auch den Wert zurück. So kannst du genau verfolgen was passiert.

                                    Grüße,

                                    ldittmar

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

                                      Da fehlt die Entscheidung ob man auf Kommando (IoB => KNX/Sonos) oder auf Status (KNX/Sonos => IoB ) triggern will.

                                      Das hängt davon ab, ob KNX/Sonos => IoB überhaupt möglich ist.

                                      Falls ja, dann sollte den Code so aussehen:

                                      on({id: 'knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_PlayPause', ack: true}, function (obj) { ...
                                      

                                      Aber trotzdem ist mir nicht klar was du erreichen willst.

                                      1 Reply Last reply Reply Quote 0
                                      • M
                                        my-knx-shop last edited by

                                        Ich will erreichen, dass der Sonos wenn ich auf Play gehe auch gleich läuft. Denn wenn ich vorher den TV an hatte, steht der nicht mehr auf Radio sondern auf TV und spielt dann nichts ab.

                                        Also soll es wenn der TV aus ist per Play direkt Radio Abspielen und wenn TV an ist, erst TV aus und umschalten auf Radio, damit abgespielt werden kann ! Oder ist der LineIn dazu das falsche ?

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

                                          Ich habe keine Ahnung, was dein Datenpunkt 'knx.0.Sonos_PlugIn.Sonos_ZP0.ZP0_LineIn_mit_1' macht und ich kenne auch knx nicht. Aber wenn du versuchst, damit den "current_type" deiner Sonos zu setzen, wird das nicht klappen, da dieser Status "read-only" ist.

                                          Zum Umschalten der Sonos von TV auf Radio nutze ich den "favorite_set":

                                          setState("sonos.0.root.192_168_xx_yy.favorites_set", "Bayern 3");
                                          

                                          Dafür musst du in der Sonos-App natürlich einen entsprechenden Favoriten angelegt haben.

                                          Übrigens, da du oben mehrfach nachgehakt hast: Mit "if (statement)" wird das statement auf true abgefragt, also z.B. ob a größer b (a>b) oder c gleich d (c==d). Wenn das statement für sich bereits eine Variable vom Typ boolean ist, steht der Wert ja bereits auf true oder false, d.h. die Abfrage auf true kannst du weglassen. "if (a == true)" ist das gleiche wie "if(a)".

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

                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          809
                                          Online

                                          31.7k
                                          Users

                                          79.8k
                                          Topics

                                          1.3m
                                          Posts

                                          6
                                          20
                                          2342
                                          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