Ankündigung

Einklappen
Keine Ankündigung bisher.

Logik warten lassen, bis Russound an

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

    Logik warten lassen, bis Russound an

    Hallo zusammen,

    ich möchte mit einem Tastsensor einen Russound MCA-C5 aufwecken. Dafür muss die Steckdose, an der der Russound hängt eingeschaltet werden und die Logik solange warten, bis der Russound ansprechbar ist. Ich habe dazu den Python-Befehl "time.sleep()" gefunden. Leider funktioniert das nicht recht. Offenbar wartet die Logik nach dem Befehl zum Einschalten der Steckdose "sh.K4.STECK.SWIT2(True)" nicht die 60 Sekunden ab. Habe ich die Syntax falsch? Danke!

    Code:
    if sh.RUS.ZONE1.BOOLTOV() == True and sh.K4.STECK.SWIT2() == True:
        sh.RUS.ZONE1.TURNONVOL(5)
        sh.RUS.ZONE1.SOURCE(1)
    elif sh.RUS.ZONE1.BOOLTOV() == True and sh.K4.STECK.SWIT2() == False:
        sh.K4.STECK.SWIT2(True)
        time.sleep(60)
        sh.RUS.ZONE1.TURNONVOL(5)
        sh.RUS.ZONE1.SOURCE(1)    
    else:
        sh.RUS.ZONE1.POWER(False)
    Cheers
    Art Mooney

    #2
    Ist das time-Modul verfügbar (import time)?

    Kommentar


      #3
      Gute Frage, wie teste ich das?
      Cheers
      Art Mooney

      Kommentar


        #4
        In der Logik ganz oben

        import time

        reinschreiben?

        Kommentar


          #5
          Braucht man bei aktuelleren SmartHomeNG Versionen nicht.
          Wenn time nicht zur Verfügung stände müsste es übrigens einen Eintrag im Log geben.
          Viele Grüße
          Martin

          There is no cloud. It's only someone else's computer.

          Kommentar


            #6
            Wie/wann triggerst Du die Logik denn?

            Ich vermute, Du landest nicht im elif Zweig, weil zum Zeitpunkt des triggerns die Steckdose bereits eingeschaltet ist und dann gleich der if Zweig ausgeführt wird.
            Viele Grüße
            Martin

            There is no cloud. It's only someone else's computer.

            Kommentar


              #7
              Ich triggere die Logik mit einem Tastsensor. Der sendet eine KNX-GA, verknüpft mit Item "sh.RUS.ZONE1.BOOLTOV() == True". Ich habe es mit dem untenstehenden Code versucht und die Zeit auf 90 Sekunden erhöht, um sicherzugehen, dass der Russound genug Zeit hat, sich zu melden.

              Im Busmonitor sehe ich, dass sh.RUS.ZONE1.BOOLTOV() == True vom Tastsensor kommt. Wenn die Steckdose aus ist, geht die Logik auch den elif-Pfad und die Steckdose wird eingeschaltet. Auch time.sleep funktioniert. Nach 90 Sekunden kommen sh.RUS.ZONE1.TURNONVOL(7) und sh.RUS.ZONE1.SOURCE(1) wie gewünscht auf den Bus. Allerdings geht der Kanal auf dem Russound nicht an.

              Komischerweise geht der Kanal sofort an, wenn ich direkt nach Ablauf der 90 Sekunden und erfoglosem Versuch des Einschaltens, am Tastsensor aus und direkt wieder einschalte.

              Ideen?


              Code:
              import time
              if sh.RUS.ZONE1.BOOLTOV() == True and sh.K4.STECK.SWIT2() == True:
                  sh.RUS.ZONE1.TURNONVOL(7)
                  sh.RUS.ZONE1.SOURCE(1)
              elif sh.RUS.ZONE1.BOOLTOV() == True and sh.K4.STECK.SWIT2() == False:
                  sh.K4.STECK.SWIT2(True)
                  time.sleep(90)
                  sh.RUS.ZONE1.TURNONVOL(7)
                  sh.RUS.ZONE1.SOURCE(1)    
              else:
                  sh.RUS.ZONE1.POWER(False)
              Cheers
              Art Mooney

              Kommentar


                #8
                Ja, siehe oben: wie triggerst Du die Logik?

                füge doch in die 3 Zweige jeweils ein logic.logger.warning(...) ein.

                uns wie gesagt: Das import time ist überflüssig
                Viele Grüße
                Martin

                There is no cloud. It's only someone else's computer.

                Kommentar


                  #9
                  Die Logik lauscht auf RUS.ZONE1.BOOLTOV().

                  Ich bin mir nicht ganz sicher, wie der Logger funktioniert. In die Klammer muss irgendein Text, der dann im Log erscheint, wenn der Zweig der Logik ausgeführt wird, richtig?

                  Habe es so probiert:

                  Code:
                  if sh.RUS.ZONE1.BOOLTOV() == True and sh.K4.STECK.SWIT2() == True:
                      sh.RUS.ZONE1.TURNONVOL(7)
                      sh.RUS.ZONE1.SOURCE(1)
                      logic.logger.warning("E3_if")
                  elif sh.RUS.ZONE1.BOOLTOV() == True and sh.K4.STECK.SWIT2() == False:
                      sh.K4.STECK.SWIT2(True)
                      time.sleep(90)
                      sh.RUS.ZONE1.TURNONVOL(7)
                      sh.RUS.ZONE1.SOURCE(1)
                      logic.logger.warning("E3_elif")
                  else:
                      sh.RUS.ZONE1.POWER(False)
                      logic.logger.warning("E3_else")
                  Cheers
                  Art Mooney

                  Kommentar


                    #10
                    Genau. Dann solltest Du im Log sehen in welchen Zweig des If Statements Du läufst.
                    Viele Grüße
                    Martin

                    There is no cloud. It's only someone else's computer.

                    Kommentar


                      #11
                      So, nun habe ich folgendes gemacht:

                      1. Stromzufuhr Russound aus.
                      2. Über Tastsensor eingeschaltet. (Kanal ging nicht an)
                      3. Über Tastsensor ausgeschaltet.
                      4. Direkt wieder angeschaltet (Kanal ging an).

                      Die Logik funktioniert offenbar, nur der Kanal geht einfach beim elif-Zweig nicht an, beim if-Zweig aber schon.

                      Woran kann denn das liegen? Doch am Russound?

                      Code:
                      2021-01-22  23:39:04 WARNING  logics.E3RUSPOWER   E3_elif
                      2021-01-22  23:42:37 WARNING  logics.E3RUSPOWER   E3_else
                      2021-01-22  23:42:39 WARNING  logics.E3RUSPOWER   E3_if
                      Cheers
                      Art Mooney

                      Kommentar


                        #12
                        Auch wenn ich nicht sicher bin, ob es hilft - du kannst im elif-Zweig noch zusätzliche Logmeldungen zwischen und nach die einzelnen Kommandos schreiben. Falls ein Fehler auftritt, wird der Rest nicht ausgeführt.

                        Steht sonst noch was im Log?

                        Kommentar


                          #13
                          Nochmal die Frage: Wie triggerst Du die Logik?
                          Außerdem müsstest Du mal die Item Definitionen posten. Das "nicht-Schalten" riecht nach einem fehlenden enforce_updates.
                          Viele Grüße
                          Martin

                          There is no cloud. It's only someone else's computer.

                          Kommentar


                            #14
                            Hi Msinn ,

                            heute kam ich endlich wieder dazu, mir das Thema anzusehen.

                            Ich triggere die Logik per Watch-Item über das Item RUS.ZONE1.BOOLTOV(). Es wird von KNX eine GA empfangen, die das Item auf True setzt. Dann läuft die Logik ab. Das funktioniert ja auch.

                            Hier die relevanten Item-Definitionen:

                            HTML-Code:
                            RUS:      
                                ZONE1:  #Arbeitszimmer
                                    POWER:
                                        type: bool
                                        rus_path: 1.1.status
                                        knx_dpt: 1
                                        knx_send: 0/7/110
                                        knx_listen: 0/7/110
                                        database@mysqldb: init
                                        enforce_updates: true
                                    ONTIMER:
                                        type: bool
                                        autotimer: 60 = 0
                                        database@mysqldb: init        
                                        visu_acl: rw   
                                        enforce_updates: true
                                    BOOLTOV:
                                        type: bool
                                        knx_dpt: 1
                                        knx_listen: 0/7/118
                                        enforce_updates: true            
                                    TURNONVOL:
                                        type: num
                                        rus_path: 1.1.turnonvolume
                                        knx_dpt: 5
                                        knx_send: 0/7/115
                                        knx_listen: 0/7/115
                                        enforce_updates: true
                                    SOURCE:
                                        type: num
                                        rus_path: 1.1.currentsource
                                        knx_dpt: 5
                                        knx_send: 0/7/116
                                        knx_listen: 0/7/116
                                        enforce_updates: true
                            HTML-Code:
                            K4:
                                    SWIT2:  #Netzwerkschrank 2 (Audio)
                                        type: bool
                                        knx_dpt: 1
                                        knx_send: 9/1/17
                                        knx_listen: 9/2/17
                                        database@mysqldb: init
                                        visu_acl: rw  
                            Übrigens, wenn ich die Zeitkomponente über einen Autotimer (siehe oben Item ONTIMER) mit 60 Sekunden umsetze, funktioniert es. Was ich meine, ist folgende geänderte Logik:

                            HTML-Code:
                            #!/usr/bin/env python3
                            # e3ruspower.py
                            if sh.RUS.ZONE1.BOOLTOV() == True and sh.K4.STECK.SWIT2() == True:
                                sh.RUS.ZONE1.TURNONVOL(7)
                                sh.RUS.ZONE1.SOURCE(1)
                            elif sh.RUS.ZONE1.BOOLTOV() == True and sh.K4.STECK.SWIT2() == False:
                                sh.K4.STECK.SWIT2(True)
                                sh.RUS.ZONE1.ONTIMER(True)
                            else:
                                sh.RUS.ZONE1.POWER(False)
                            Und eine zweite Logik, die per Watch-Item auf RUS.ZONE1.ONTIMER achtet:

                            HTML-Code:
                            #!/usr/bin/env python3
                            # e3rusontimer.py
                            if sh.RUS.ZONE1.ONTIMER() == False:
                                sh.RUS.ZONE1.TURNONVOL(7)
                                sh.RUS.ZONE1.SOURCE(1)
                            Das ist zwar alles andere als elegangt, funktioniert aber erstmal so.
                            Cheers
                            Art Mooney

                            Kommentar


                              #15
                              Hallo zusammen,

                              leider muss ich mich hierzu noch einmal melden. Die Lösung mit dem autotimer war keine. Zwar funktionierte es anfangs einmal, danach aber wieder nicht bzw. nicht zuverlässig. Die Lösung mit dem autotimer finde ich auch unübersichtlich und ich würde lieber bei der ursprünglichen Logik mit dem time.sleep bleiben.

                              Hier nochmal mein Problem mit ein paar weiteren Informationen:

                              Die Logik sieht im Wesentlichen aus wie zuvor, nur habe ich jetzt ein paar zusätzliche Log-Meldungen eingebaut und die time.sleep auf 120 gesetzt, damit der Russound auf jeden Fall wach ist. Also wie folgt:

                              Code:
                              #!/usr/bin/env python3
                              # e3ruspower.py
                              if sh.RUS.ZONE1.BOOLTOV() == True and sh.K4.STECK.SWIT2() == True:
                                  sh.RUS.ZONE1.TURNONVOL(7)
                                  sh.RUS.ZONE1.SOURCE(2)
                                  logic.logger.warning("E3_if")
                              elif sh.RUS.ZONE1.BOOLTOV() == True and sh.K4.STECK.SWIT2() == False:
                                  sh.K4.STECK.SWIT2(True)
                                  logic.logger.warning("E3_elif_A")
                                  time.sleep(120)
                                  sh.RUS.ZONE1.TURNONVOL(7)
                                  logic.logger.warning("E3_elif_B")
                                  sh.RUS.ZONE1.SOURCE(2)
                                  logic.logger.warning("E3_elif_C")
                              else:
                                  sh.RUS.ZONE1.POWER(False)
                                  logic.logger.warning("E3_else")
                              Zum Testen habe ich die Steckdose abgestellt und per Druck auf einen KNX-Tastsensor das Item "RUS.ZONE1.BOOLTOV" auf "True" gesetzt. Die Logik lief ab, die Musik spielte wie gewollt und im Log tauchte auf:

                              Code:
                              2021-04-03 20:27:39 WARNING logics.E3RUSPOWER E3_elif_A
                              2021-04-03 20:29:39 WARNING logics.E3RUSPOWER E3_elif_B
                              2021-04-03 20:29:39 WARNING logics.E3RUSPOWER E3_elif_C
                              Also scheinbar alles super. Wenn ich aber nun den Kanal wieder abschalte, über den Tastensor Item "RUS.ZONE1.BOOLTOV" auf "False" und die Steckdose über die Smartvisu wieder abschalte, lässt sich das nicht wiederholen, auch nicht wenn ich es zweimal versuche. Dabei wird die Steckdose über den elif-Zweig zuverlässig bei jedem Versuch eingeschaltet, nur der Russound macht nicht mit. Im Log sieht das Ganze dann so aus:

                              Code:
                              2021-04-03 20:30:14 WARNING logics.E3RUSPOWER E3_else
                              2021-04-03 20:31:14 WARNING logics.E3RUSPOWER E3_elif_A
                              2021-04-03 20:33:14 WARNING logics.E3RUSPOWER E3_elif_B
                              2021-04-03 20:33:14 WARNING logics.E3RUSPOWER E3_elif_C
                              2021-04-03 20:37:04 WARNING logics.E3RUSPOWER E3_elif_A
                              2021-04-03 20:39:04 WARNING logics.E3RUSPOWER E3_elif_B
                              2021-04-03 20:39:04 WARNING logics.E3RUSPOWER E3_elif_C
                              Das "E3_else" gehört zum Abschalten nach dem ersten Versuch. Zwischen dem ersten "E3_elif_C" und dem zweiten "E3_elif_A" hatte ich die Steckdose manuell abgeschaltet, aber nicht am Tastsensor "RUS.ZONE1.BOOLTOV" auf "False" gesetzt, nur um zu sehen, ob das etwas ändert. Auch das funktionierte nicht.

                              Im Anschluss habe ich nochmal per Tastsensor "RUS.ZONE1.BOOLTOV" auf "False" gesetzt, die Steckdose abgestellt und die Logik erneut per Tastsensor "RUS.ZONE1.BOOLTOV" auf "True" gestartet. Das hat wiederum funktioniert. Im Log tauchten die erwarteten Meldungen auf. Danach habe ich wieder am Tastsensor abgeschaltet und die Steckdose ebenfalls deaktiviert. Wieder versucht, nicht funktioniert.

                              Entscheidend für die Lösung des Problems ist natürlich, den Unterschied zu finden. Unter welchen Umständen funktioniert es, wann funktioniert es nicht.

                              Natürlich habe ich mir in der ETS den Busmonitor angesehen. Der sieht wie folgt aus (Uhrzeiten nicht exakt identisch zu Logfile):
                              russound1.jpg
                              russound2.jpg

                              Man sieht hier also einen interessanten Unterschied: In den Fällen, in denen es funktioniert, erscheinen die Meldungen "MUTE", "BALANCE" etc. VOR(!) dem Item "TURNONVOL". In den Fällen, in denen es nicht funktioniert, erscheint zuerst "TURNONVOL" und dann die Items "MUTE", "BALANCE" etc.

                              Mir scheinen jetzt zwei Ursachen möglich:

                              1. time.sleep ist mit 120 immer noch zu kurz, der Russound braucht manchmal deutlich mehr als die 120 Sekunden zum Aufwachen
                              2. der Russound braucht manchmal noch einen zweiten Stups bevor er richtig aufwacht, dieser erfolgt in den Fällen, in denen es nicht geklappt hat, anhand des "TURNONVOL"-Items, wonach einige Sekunden später die Meldungen "MUTE", "BALANCE" etc. als Bestätigung des Aufwachens erscheinen.

                              Ich probiere jetzt, den time.sleep auf 180 Sekunden zu setzen.
                              Angehängte Dateien
                              Cheers
                              Art Mooney

                              Kommentar

                              Lädt...
                              X