Ankündigung

Einklappen
Keine Ankündigung bisher.

Klingel Funktion klappt nicht - kein Ton mehr nach einmaligem abspielen? Bug?

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

    Klingel Funktion klappt nicht - kein Ton mehr nach einmaligem abspielen? Bug?

    Hallo zusammen,

    ich habe eine Klingel mit Hilfe von Homematic realisiert. Draußen gibt es einen Schalter auf den reagiert wird (ich frage alle verschiedene Stati wie Short_press usw ab, daher reagiert er auf 4 items). Bei Betätigung wird eine Steckdose eingeschaltet und kurz gewartet damit die MP3 nicht schon abgespielt wird ohne dass die Lautsprecher an sind. Ich möchte nun 3 mal die doorbell.mp3 abspielen (aus der Demo) und nach 10 Sekunden den Lautsprecher wieder ausmachen.

    So viel zur Theorie...

    In der Praxis passiert follgendes:
    - Es klingelt einmal - die nachfolgenden playSound Statements werden verarbeitet (es gibt keinen Fehler, und das Log zeigt an, dass das Coding durchlaufen wird) aber es kommt kein Ton mehr
    - Ist die Regel einmal durchlaufen wird kein weiterer Ton abgespielt so lange bis ich etwas an der Regel verändere und diese abspeichere (und damit die Regeln neu initialisiert werden).

    Ist das ein Bug oder mache ich etwas falsch!?

    Hier die Regel:

    Code:
    rule "Klingel"
    
    when Item Klingel1 received update ON or 
        Item Klingel1_L received update ON  or     
        Item Klingel2 received update ON or 
        Item Klingel2_L received update ON
            
    
    then
        sendCommand(Lautsprecher_switch, ON)
        logInfo("klingel", "Lautsprecher an")
        createTimer(now.plusSeconds(1)) [|
        playSound("doorbell.mp3")
            logInfo("klingel", "erstes Klingeln")
        playSound("doorbell.mp3")
            logInfo("klingel", "zweites Klingeln")
        playSound("doorbell.mp3")
            logInfo("klingel1", "drittes klingeln")
        ]
        createTimer(now.plusSeconds(10)) [|
        sendCommand(Lautsprecher_switch, OFF)
        logInfo("klingel", "Lautsprecher aus")
        
        ]
    end
    Danke schon mal für eure Hilfe

    Gruß
    mm1804

    #2
    Moin Moin,

    Ich würde als erstes deine Schater in eine Gruppe stecken, damit du in der Rule nur auf ein Item reagieren musst.

    Den Timer würde ich gegen einen Thread::sleep() tauschen.

    Code:
    rule "Klingel"
    
    when
    Item Klingel changed to ON
    then
        sendCommand(Lautsprecher_switch, ON)
        logInfo("klingel", "Lautsprecher an")
        Thread::sleep(1000)
        playSound("doorbell.mp3")
        logInfo("klingel", "erstes Klingeln")
        playSound("doorbell.mp3")
        logInfo("klingel", "zweites Klingeln")
        playSound("doorbell.mp3")
        logInfo("klingel1", "drittes klingeln")
        Thread::sleep(10000)
        sendCommand(Lautsprecher_switch, OFF)
        logInfo("klingel", "Lautsprecher aus")
    end
    Code ist nicht getestet und ohne Garantie....

    MfG

    Kommentar


      #3
      auch ich würde hier über Sleep gehen. Mit dem Timer startest Du quasi einen neuen Thread. D.h. dreimal Doorbell abspeilen darf 9 Sekunden dauern, da nach 10 Sekunden dier Lautsprecher abgeschaltet wird. Aber ich denke mal du möchtest, dass nach den 3 Doorbells 10 Sekunden gewartet wird und dann der Lautsprecher abgeschaltet wird.

      Thomas

      Kommentar


        #4
        Um meinen Senf dazu zu geben: ich bin mir nicht sicher, ob playSound wartet, bis das Audio fertig gespielt ist, soll heißen, playSound wird vermutlich dreimal aufgerufen, allerdings im Abstand von weniger als 1ms, sodass Du effektiv nur den letzten Sound hörst. Abhilfe aus meiner Sicht - Quick 'n' Dirty - zwischen die einzelnen playSound-Anweisungen auch noch ein Thread::sleep(x) einbauen, x passend zur Länge des Soundfiles...

        Und nicht vergessen, dass die Anwendung playSound eventuell ein paar ms braucht, bis sie wieder abspielbereit ist...

        Kommentar


          #5
          Wäre es dann in Summe nicht besser die drei mp3s in ein mp3 zusammenzuführen und nur einmal abzuspielen

          Kommentar


            #6
            Hallo zusammen, ne Menge guter Anregungen, danke! Werde ich mal ausprobieren und dann berichten...
            Noch jemand ne Idee warum die Regel nach dem ersten abspielen keinen Ton mehr ausgibt und es erst nach einer Änderung wieder Funktion!?

            Kommentar


              #7
              Ich bin zwar auch noch Anfänger glaube aber das liegt an "received update ON", setzt den Status nur passiv und nicht aktiv....

              Bitte korrigieren, wenn ich mich irre!

              MfG

              siehe auch....


              Kommentar


                #8
                Kommen denn die Logzeilen bei wiederholtem Klingeln?
                Zuletzt geändert von udo1toni; 05.08.2015, 16:45.

                Kommentar


                  #9
                  Zitat von udo1toni Beitrag anzeigen
                  Kommen denn die Logzeilen bei wiederholtem Klingeln?

                  Ja, aber halt kein Ton...

                  Kommentar


                    #10
                    Und wenn Du das Audio nur einmal spielen lässt, klappt es dann beim nächsten Klingeln (also wenn playSound genug Zeit hatte, zuende zu spielen)?

                    Kommentar


                      #11
                      Hallo zusammen,

                      so, habs mal umgebaut (mit den Sleeps) mit diesen Effekten:
                      - Es wird einmal die MP3 Datei abgespielt - die anderen male nicht
                      - Jetzt geht es dass wenn ich wieder klingle die Regel erneut mit Ton abgearbeitet wird (was mein eigentliches Hauptproblem war).

                      Ich werde mir jetzt so helfen, dass ich die mp3 3x in eine Datei zusammenführe, dann tut das auch, wenn noch jemand eine Idee hat - immer gern her damit...

                      Vielen Dank für eure Hilfe!

                      Kommentar


                        #12
                        hört sich für mich immer noch danach an, als ob playSound einfach etwas mehr "Bedenkzeit" braucht. der Thread::sleep sollte auf jeden Fall mindestens die Audiolänge haben, am besten noch mit zusätzlich Luft, damit die Schnittstelle wieder freigegeben wird, bevor die nächste Anforderung kommt..

                        Kommentar

                        Lädt...
                        X