Ankündigung

Einklappen
Keine Ankündigung bisher.

Regeln mit unbekanntem Fehler

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

    Regeln mit unbekanntem Fehler

    Hi,

    ich bin hier ja blutiger Anfänger. Ein Stück weit bin ich auch schon voran gekommen. Ich habe verstanden, was Items und Things sind, Die Kanäle sind mir ein Begriff und Sitemap und Regeln auch. Alle Geräte sind eingerichtet und kommunizieren auch mit meinem PaperUI, eine Regel habe ich mit externer Hilfe auch schon hinbekommen (Fenster auf, dann Heizung auf 7°C; Fenster zu, dann Heizung auf 20°C), die sieht so aus:

    Code:
    rule "Badheizung auf Frostschutz"
    when
    Item FF_Bathroom_Window changed
    then
    if (FF_Bathroom_Window.state == OPEN) {
    FF_Bathroom_Heating.sendCommand(7)
    }
    else {FF_Bathroom_Heating.sendCommand(20)
    }
    end
    Wenn ich aber die nächste Regel erstellen will, dann komme ich wieder an meine Grenzen.

    Ich will einfach nur, dass die Steckdose (an der der Entfeuchter hängt) bei unter 55 % ausgeht und bei über 60 % wieder an:

    Verschiedene Versuche:

    1)
    Code:
    rule "Entfeuchter"
    when
    Item C_HomeCinema_Humidity changed
    then
    if (C_HomeCinema_Humidity >= 60)
    {C_HomeCinema_Socket1.sendCommand(on)}
    else
    if (C_HomeCinema_Humidity <= 58)
    {C_HomeCinema_Socket1.sendCommand(off)}
    end
    2)
    Code:
    rule "Entfeuchter"
    when
    Channel "zwave:device:36288293:node6:sensor_relhumidity" changed
    then
    if (C_HomeCinema_Humidity >= 60)
    {C_HomeCinema_Socket1.sendCommand(ON)}
    else
    if (C_HomeCinema_Humidity <= 58)
    {C_HomeCinema_Socket1.sendCommand(OFF)}
    end
    3)
    Code:
    rule "Entfeuchter"
    when
    Channel "zwave:device:36288293:node6:sensor_relhumidity" triggered
    then
    if (C_HomeCinema_Humidity >= 60)
    {C_HomeCinema_Socket1.sendCommand(ON)}
    else
    if (C_HomeCinema_Humidity <= 58)
    {C_HomeCinema_Socket1.sendCommand(OFF)}
    end
    4)
    Code:
    rule "Entfeuchter"
    when
    Channel "zwave:device:36288293:node6:sensor_relhumidity" triggered
    then
    if (Channel "zwave:device:36288293:node6:sensor_relhumidity" >= 60)
    {C_HomeCinema_Socket1.sendCommand(ON)}
    else
    if (Channel "zwave:device:36288293:node6:sensor_relhumidity" <= 58)
    {C_HomeCinema_Socket1.sendCommand(OFF)}
    end
    Das sind die beiden Items, die ich anspreche:
    Code:
    Switch    C_HomeCinema_Socket1    "Steckdose"          <poweroutlet>      (C_HomeCinema, gPower)      ["Switch", "Switchable"]   {channel="zwave:device:36288293:node2:switch_binary"}
    und

    Code:
    Number    C_HomeCinema_Humidity   "Luftfeuchtigkeit"   <humidity>         (C_HomeCinema, gHumidity)                              {channel="zwave:device:36288293:node6:sensor_relhumidity"}

    Wo liegt denn mein Dreher in meinen Gedanken? Was mache ich falsch?

    Danke und Gruß,
    Torsten

    #2
    Grundsätzlich triggern Rules nicht auf Channel. Grundsätzlich im juristischen Sinn, das heißt, es gibt Ausnahmen von dieser Regel. Hier gibt es aber keine Ausnahme.
    Deine erste Rule ist schon fast richtig. Leider hast Du aber ausgerechnet in dieser Rule die Worte ON und OFF klein geschrieben.
    In openHAB ist grundsätzlich die Groß/Kleinschreibung essentiell. Auch hier gibt es an ein paar wenigen Stellen Ausnahmen, aber das Einfachste ist, Du achtest immer auf die exakte Schreibweise, dann bist Du auf der sicheren Seite.

    Und dann ist da die Sache mit dem Unterschied zwischen Item und Status des Items...
    C_HomeCinema_Humidity ist das Item, Du willst aber nicht das Item vergleichen, sondern den Zustand des Items, also C_HomeCinema_Humidity.state...

    Ich bin ein Freund von Vermeidung (unnötiger Schaltvorgänge), deshalb hier eine leicht angepasste Variante Deiner Rule:
    Code:
    rule "Entfeuchter"
    when
        Item C_HomeCinema_Humidity changed
    then
        var Soll = C_HomeCinema_Socket1.state
        if((C_HomeCinema_Humidity.state as Number) >= 60)
            Soll = ON
        else if((C_HomeCinema_Humidity.state as Number) <= 58)
            Soll = OFF
        if(C_HomeCinema_Socket1.state != Soll)
            C_HomeCinema_Socket1.sendCommand(Soll.toString)
    end
    Der Code ist Deinem sehr ähnlich, der wesentliche Unterschied besteht darin, dass ich nur dann einen Schaltbefehl an das Item schicke, wenn dies auch nötig ist. Wenn die Feuchte über 60 steigt, startet die Entfeuchtung, nachfolgende Messwerte können aber dennoch über 60 liegen, womit dann bei jeder Wertänderung trotzdem ein Einschaltbefehl gesendet wird, obwohl das völlig unnötig ist. Ebenso beim Ausschalten. Der kleine Umweg über den Vergleich soll <> ist vermeidet dies.

    Kommentar


      #3
      Hi und Danke.

      Ich habe das jetzt anhand Deines Beispieles über Stunden gebastelt mit folgendem Ergebnis (jetzt nicht Entfeuchtersteuerung, sondern Lichtsteuerung, weil sich da der Status alle paar Sekunden ändert, aber das macht ja glaube ich nichts):

      PHP-Code:
      rule "Dim Lights"
      when
      Item PlexShieldProgress changed 
      or
      Item PlexShieldStatus changed
      then
      var Dimmer C_HomeCinema_Dimmer.state

      if (PlexShieldStatus.state == "Paused"){
      Dimmer 34}

      if (
      PlexShieldStatus.state == "Playing" && PlexShieldType.state == "clip"){
      Dimmer 34}

      if (
      PlexShieldStatus.state == "Playing" && PlexShieldType.state == "trailer"){
      Dimmer 34}

      if (
      PlexShieldStatus.state == "Playing" && PlexShieldTitle.state == "Das Boot"){
      if (
      PlexShieldProgress.state <0.3){
      Dimmer 30}
      if (
      PlexShieldProgress.state >97.8){
      Dimmer 30}
      else 
      Dimmer 0}

      else if (
      PlexShieldStatus.state == "Playing"){
      Dimmer 0}

      if (
      C_HomeCinema_Dimmer.state != Dimmer)
      {
      C_HomeCinema_Dimmer.sendCommand(Dimmer.toString)}
      end

      rule 
      "Lights On"
      when
      Item PlexShieldStatus changed to Stopped
      then
      C_HomeCinema_Dimmer
      .sendCommand(50)
      end 
      Vom Prinzip her ist das eine recht einfache Logik. Es funktioniert aber nur teilweise. Wenn der Status "Playing" ist und der Type "clip" geht er korrekterweise auf Dimmer 34... aber beim nachfolgenden Film geht er sofort auf 0, soll aber eigentlich ja erst ab 0,3 Prozent Fortschritt... Seltsamerweise geht er ab Prozent 97,8 auf 34...

      Ich habe noch ein logInfo eingebaut, der Titel wird korrekt übergeben:

      Code:
      2020-09-13 17:46:02.287 [INFO ] [se.smarthome.model.script.plex.rules] - PlexShieldTitle (Type=StringItem, State=Das Boot, Label=Title, Category=video)
      2020-09-13 17:46:02.296 [INFO ] [se.smarthome.model.script.plex.rules] - PlexShieldType (Type=StringItem, State=movie, Label=Type, Category=video)
      Außerdem haut er immer noch bei jedem Progress-change einen Befehl an den Dimmer, guggschd Du hier :-( :

      Code:
      2020-09-13 17:21:17.694 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 0.27 to 0.36
      2020-09-13 17:21:17.731 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 0
      2020-09-13 17:21:17.733 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 0
      2020-09-13 17:21:27.701 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-13T20:40:15.932+0200 to 2020-09-13T20:40:16.126+0200
      2020-09-13 17:21:27.703 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 0.36 to 0.44
      2020-09-13 17:21:27.724 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 0
      2020-09-13 17:21:27.725 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 0
      2020-09-13 17:21:37.717 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-13T20:40:16.126+0200 to 2020-09-13T20:40:16.124+0200
      2020-09-13 17:21:37.722 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 0.44 to 0.52
      2020-09-13 17:21:37.754 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 0
      2020-09-13 17:21:37.755 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 0
      2020-09-13 17:21:47.730 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-13T20:40:16.124+0200 to 2020-09-13T20:40:16.114+0200
      2020-09-13 17:21:47.741 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 0.52 to 0.61
      2020-09-13 17:21:47.791 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 0
      2020-09-13 17:21:47.797 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 0
      2020-09-13 17:21:57.735 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-13T20:40:16.114+0200 to 2020-09-13T20:40:16.121+0200
      Eine Idee oder einen Ansatz, was ich falsch mache? 😕

      Thank you.
      Zuletzt geändert von ToHe2307; 13.09.2020, 16:53.

      Kommentar


        #4
        Da ist die Sache mit den Datentypen... Grundsätzlich ist ein state ein Status und weder ein String noch eine Zahl. Dass openHAB hier oftmals sehr gütig reagiert, liegt daran, dass es oftmals richtig rät, wenn es darum geht, die Daten zu analysieren. Aber manchmal geht das halt auch schief. Deshalb ist es besser, den Datentyp explizit vorzugeben. Von einigem Balast entfernt sieht die Rule dann so aus:
        Code:
        rule "Dim Lights"
        when
            Item PlexShieldProgress changed or
            Item PlexShieldStatus changed
        then
            var Number nDimmer = C_HomeCinema_Dimmer.state as Number
            val String strStatus = PlexShieldStatus.state.toString
            val String strType = PlexShieldType.state.toString
            val Number nProgress = if(PlexShieldProgress.state instanceof Number) (PlexShieldProgress.state as Number) else 0
        
            if(strStatus == "Stopped")
                nDimmer = 50
            if(strStatus == "Paused")
                nDimmer = 34
            if(strStatus == "Playing") {
                nDimmer = 0
                if(strType == "clip" || strType == "trailer")
                    nDimmer = 34
                if(PlexShieldTitle.state.toString == "Das Boot")
                    if(nProgress < 0.3 || nProgress > 97.8)
                        nDimmer = 30
            }
        
            if((C_HomeCinema_Dimmer.state as Number) != nDimmer)
                C_HomeCinema_Dimmer.sendCommand(nDimmer)
        end
        Da die Rule eh bei Statuswechsel triggert, kann sie sich auch bequem um Stopped kümmern
        Die Konstanten verwende ich hier nur, weil der korrekte Ausdruck so lang ist und die Rule damit viel übersichtlicher erscheint. Ein paar Doppelungen ließen sich leicht entfernen, was auch erleichtert, zu verstehen, was die Rule tun soll.
        Geschweifte Klammern dienen dazu, aus einzelnenAnweisungen Codeblöcke zu bilden. Wenn es nur um einen einzelnen Befehl geht, kann man sie also weg lassen.

        Ich gehe davon aus, dass PlexShieldType nie "clip" oder "trailer" enthält, falls PlexShieltTitle gerade "Das Boot" enthält. Ansonsten hättest Du an dieser Stelle ein Dilemma (allerdings leicht durch ein zusätzliches else zu umgehen)

        Kommentar


          #5
          Du bist ja spitze! Danke Dir ☺️

          werde ich spätestens kommendes Wochenende testen, bin aber schon jetzt vom Support begeistert 🤩

          Kommentar


            #6

            Kommentar


              #7
              Also, funktioniert (fast) einwandfrei... ich bin nahezu begeistert :-)

              Eine Frage habe ich aber dazu: Am Ende eines Clips geht er kurz auf 50, dann runter auf 0 und dann kurzn nach Filmstart bis zum Progress von (hier) 0,3 auf korrekte 30. Kann man diese beiden Zwischenschritte iwie abschalten? nach dem Motto, geh nur auf 0, wenn auch wirklich ein Film läuft und geh nur auf 50, wenn auch wirklich nix läuft? 😵

              Hier mal das, was passiert, wenn ich nen Trailer mit anschließendem Film laufen lasse:

              Code:
              2020-09-14 20:35:32.955 [vent.ItemStateChangedEvent] - PlexShieldStop changed from ON to OFF
              2020-09-14 20:35:32.957 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 23.32 to 4.95
              2020-09-14 20:35:32.960 [vent.ItemStateChangedEvent] - PlexShieldPlay changed from OFF to ON
              2020-09-14 20:35:32.962 [vent.ItemStateChangedEvent] - PlexShieldTitle changed from The Devil Wears Prada (German Trailer) to Muriel's Wedding (German)
              2020-09-14 20:35:32.966 [vent.ItemStateChangedEvent] - PlexShieldStatus changed from Stopped to Playing
              [MARKIEREN]2020-09-14 20:35:33.001 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 34
              2020-09-14 20:35:33.014 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 34
              2020-09-14 20:35:33.021 [vent.ItemStateChangedEvent] - C_HomeCinema_Dimmer changed from 50 to 34[/MARKIEREN]
              2020-09-14 20:35:42.916 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-14T20:37:57.414+0200 to 2020-09-14T20:37:57.371+0200
              2020-09-14 20:35:42.918 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 4.95 to 11.53
              2020-09-14 20:35:52.917 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-14T20:37:57.371+0200 to 2020-09-14T20:37:57.358+0200
              .
              .
              .
              .
              2020-09-14 20:37:43.037 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 83.98 to 90.56
              2020-09-14 20:37:52.985 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-14T20:37:57.334+0200 to 2020-09-14T20:37:57.312+0200
              2020-09-14 20:37:53.007 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 90.56 to 97.15
              2020-09-14 20:37:56.970 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-14T20:37:57.312+0200 to 2020-09-14T20:37:57.469+0200
              2020-09-14 20:37:56.973 [vent.ItemStateChangedEvent] - PlexShieldStop changed from OFF to ON
              2020-09-14 20:37:56.975 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 97.15 to 99.65
              2020-09-14 20:37:56.977 [vent.ItemStateChangedEvent] - PlexShieldPlay changed from ON to OFF
              2020-09-14 20:37:56.978 [vent.ItemStateChangedEvent] - PlexShieldStatus changed from Playing to Stopped
              [MARKIEREN]2020-09-14 20:37:57.001 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 50
              2020-09-14 20:37:57.024 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 50
              2020-09-14 20:37:57.037 [vent.ItemStateChangedEvent] - C_HomeCinema_Dimmer changed from 34 to 50[/MARKIEREN]
              2020-09-14 20:37:57.192 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-14T20:37:57.469+0200 to 2020-09-14T23:55:06.703+0200
              2020-09-14 20:37:57.198 [vent.ItemStateChangedEvent] - PlexShieldType changed from clip to movie
              2020-09-14 20:37:57.200 [vent.ItemStateChangedEvent] - PlexShieldStop changed from ON to OFF
              2020-09-14 20:37:57.206 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 99.65 to 1.26
              2020-09-14 20:37:57.209 [vent.ItemStateChangedEvent] - PlexShieldPlay changed from OFF to ON
              2020-09-14 20:37:57.213 [vent.ItemStateChangedEvent] - PlexShieldTitle changed from Muriel's Wedding (German) to Das Boot
              2020-09-14 20:37:57.217 [vent.ItemStateChangedEvent] - PlexShieldStatus changed from Stopped to Playing
              [MARKIEREN]2020-09-14 20:37:57.264 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 0
              2020-09-14 20:37:57.288 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 0
              2020-09-14 20:37:57.310 [vent.ItemStateChangedEvent] - C_HomeCinema_Dimmer changed from 50 to 0[/MARKIEREN]
              2020-09-14 20:37:57.321 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-14T23:55:06.703+0200 to 2020-09-14T23:55:06.793+0200
              2020-09-14 20:37:59.193 [vent.ItemStateChangedEvent] - zwave_device_36288293_node4_sensor_power1 changed from 4.4 to 2.8
              2020-09-14 20:37:59.527 [vent.ItemStateChangedEvent] - denonmarantz_avr_0005cdb5c30a_general_surroundProg ram changed from STEREO to DOLBY AUDIO-DD+DSUR
              2020-09-14 20:38:06.991 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-14T23:55:06.793+0200 to 2020-09-14T23:57:39.646+0200
              2020-09-14 20:38:07.001 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 1.26 to 0.07
              [MARKIEREN]2020-09-14 20:38:07.034 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 30
              2020-09-14 20:38:07.046 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 30
              2020-09-14 20:38:07.059 [vent.ItemStateChangedEvent] - C_HomeCinema_Dimmer changed from 0 to 30[/MARKIEREN]
              2020-09-14 20:38:16.997 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-14T23:57:39.646+0200 to 2020-09-14T23:57:39.633+0200
              2020-09-14 20:38:17.001 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 0.07 to 0.15
              2020-09-14 20:38:27.010 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-14T23:57:39.633+0200 to 2020-09-14T23:57:39.628+0200
              2020-09-14 20:38:27.013 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 0.15 to 0.24
              2020-09-14 20:38:37.008 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-14T23:57:39.628+0200 to 2020-09-14T23:57:39.609+0200
              2020-09-14 20:38:37.013 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 0.24 to 0.32
              2020-09-14 20:38:37.041 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 0
              2020-09-14 20:38:37.053 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 0
              2020-09-14 20:38:37.065 [vent.ItemStateChangedEvent] - C_HomeCinema_Dimmer changed from 30 to 0
              2020-09-14 20:38:47.035 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 0.32 to 0.40
              2020-09-14 20:38:57.026 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-14T23:57:39.606+0200 to 2020-09-14T23:57:39.600+0200
              2020-09-14 20:38:57.034 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 0.40 to 0.49
              .
              .
              .
              Vielleicht unter Einbindung von "PlexShieldPlay" oder "PlexShieldStop"? - zusätzlich oder alleine? Oder indem man sagt: Nachdem ein Clip endet, warte 5 Sekunden, bevor du die nächste Änderung machst... geht das?
              Zuletzt geändert von ToHe2307; 14.09.2020, 19:52.

              Kommentar


                #8
                Na ja, das Problem wird sein, dass die Rule durch verschiedene Ereignisse getriggert wird und andere Items ausgewertet werden, welches eventuell ihren Status noch nicht geändert haben.
                Plex sendet offensichtlich zwischendurch ein Stopped. Und noch schlimmer: es sendet einen Progress 1.26 noch bevor der Film richtig los geht. Das ist also ein Problem auf Plex-Seite. Während das erste Problem relativ leicht abgefangen werden kann (führe die Stopp-Bedingung nur aus, falls nach dem Wechsel auf Stopped nicht innerhalb (z.B.) einer Sekunde ein anderes Kommando kommt), ist das Problem mit dem falschen Progress Stand sehr viel schwieriger zu lösen (also im Sinne von: geht immer korrekt).

                Kommentar


                  #9
                  Ja, ich verstehe und sehe das genauso. Werde ich aber wohl mit leben müssen, weil Plex bekomme ich nicht umprogrammiert Ich schaue mir das am kommenden Wochenende mal genauer an. Die nächsten Tage bin ich unterwegs.

                  wie könnte man das mit „mach nix, wenn nach Stop innerhalb von 2 Sekunden was anderes kommt, sondern mach dann nur das andere“ denn lösen?

                  Kommentar


                    #10
                    Das ist der leichte Teil
                    Code:
                    var Timer tPlex = null                 // globale Variablen zu Beginn der Datei definieren!
                    
                    rule "Dim Lights"
                    when
                        Item PlexShieldProgress changed or
                        Item PlexShieldStatus changed
                    then
                        var Number nDimmer = C_HomeCinema_Dimmer.state as Number
                        val String strStatus = PlexShieldStatus.state.toString
                        val String strType = PlexShieldType.state.toString
                        val Number nProgress = if(PlexShieldProgress.state instanceof Number) (PlexShieldProgress.state as Number) else 0
                    
                        tPlex?.cancel                                        // eventuell laufenden Timer abbrechen
                        if(strStatus == "Stopped")
                            tPlex = createTimer(now.plusSeconds(2),[|        // Timer auf jetzt plus 2 Sekunden
                                C_HomeCinema_Dimmer.sendCommand(50)          // Bei Ablauf Dimmer setzen
                            ])                                               // Ende der Timer Definition
                        if(strStatus == "Paused")
                            nDimmer = 34
                        if(strStatus == "Playing") {
                            nDimmer = 0
                            if(strType == "clip" || strType == "trailer")
                                nDimmer = 34
                            if(PlexShieldTitle.state.toString == "Das Boot")
                                if(nProgress < 0.3 || nProgress > 97.8)
                                    nDimmer = 30
                        }
                    
                        if((C_HomeCinema_Dimmer.state as Number) != nDimmer)
                            C_HomeCinema_Dimmer.sendCommand(nDimmer)
                    end
                    Ich habe noch eine Idee, den Progress betreffend. Dazu müsste die Rule sich mit danach richten, wann der Status auf Playing gewechselt hat. Muss ich erst noch etwas drüber nachdenken...
                    Zuletzt geändert von udo1toni; 14.09.2020, 21:57.

                    Kommentar


                      #11
                      So, ich konnte jetzt mal testen, die Woche ist rum :-)

                      Grundsätzlich funktioniert die Regel, nur während des Übergangs vom Trailer in den Film verhält sie sich nicht korrekt: Sie schaltet das Licht ganz aus, dann ganz hell (50) und dann bis zur eingestellten Prozentzahl auf (30)

                      Code:
                      2020-09-18 18:23:36.630 [vent.ItemStateChangedEvent] - PlexShieldStop changed from ON to OFF
                      2020-09-18 18:23:36.634 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 0.33 to 5.84
                      2020-09-18 18:23:36.636 [vent.ItemStateChangedEvent] - PlexShieldPlay changed from OFF to ON
                      2020-09-18 18:23:36.637 [vent.ItemStateChangedEvent] - PlexShieldTitle changed from Joker to Elysium (German Trailer 2)
                      2020-09-18 18:23:36.639 [vent.ItemStateChangedEvent] - PlexShieldStatus changed from Stopped to Playing
                      [MARKIEREN]2020-09-18 18:23:36.989 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 34
                      2020-09-18 18:23:36.997 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 34
                      2020-09-18 18:23:37.004 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 34
                      2020-09-18 18:23:37.013 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 34
                      2020-09-18 18:23:37.020 [vent.ItemStateChangedEvent] - C_HomeCinema_Dimmer changed from 50 to 34[/MARKIEREN]
                      2020-09-18 18:23:44.977 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-18T18:25:31.494+0200 to 2020-09-18T18:25:01.799+0200
                      2020-09-18 18:23:44.979 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 5.84 to 37.02
                      .
                      .
                      .
                      
                      2020-09-18 18:23:46.587 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 86.22 to 86.49
                      2020-09-18 18:23:56.607 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-18T18:24:03.050+0200 to 2020-09-18T18:24:03.074+0200
                      2020-09-18 18:23:56.615 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 86.49 to 94.69
                      2020-09-18 18:24:02.584 [vent.ItemStateChangedEvent] - PlexShieldStop changed from OFF to ON
                      2020-09-18 18:24:02.596 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 94.69 to 99.62
                      2020-09-18 18:24:02.598 [vent.ItemStateChangedEvent] - PlexShieldPlay changed from ON to OFF
                      2020-09-18 18:24:02.600 [vent.ItemStateChangedEvent] - PlexShieldStatus changed from Playing to Stopped
                      2020-09-18 18:24:02.821 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-18T18:24:03.014+0200 to 2020-09-18T20:23:50.368+0200
                      2020-09-18 18:24:02.855 [vent.ItemStateChangedEvent] - PlexShieldType changed from clip to movie
                      2020-09-18 18:24:02.859 [vent.ItemStateChangedEvent] - PlexShieldStop changed from ON to OFF
                      2020-09-18 18:24:02.861 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 99.62 to 1.66
                      2020-09-18 18:24:02.862 [vent.ItemStateChangedEvent] - PlexShieldPlay changed from OFF to ON
                      2020-09-18 18:24:02.864 [vent.ItemStateChangedEvent] - PlexShieldTitle changed from Elysium (German Trailer 2) to Joker
                      2020-09-18 18:24:02.869 [vent.ItemStateChangedEvent] - PlexShieldStatus changed from Stopped to Playing
                      2020-09-18 18:24:02.871 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-18T20:23:50.368+0200 to 2020-09-18T20:23:50.378+0200
                      [MARKIEREN]2020-09-18 18:24:02.895 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 0
                      2020-09-18 18:24:02.906 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 0
                      2020-09-18 18:24:02.915 [vent.ItemStateChangedEvent] - C_HomeCinema_Dimmer changed from 34 to 0[/MARKIEREN]
                      [MARKIEREN]2020-09-18 18:24:04.885 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 50
                      2020-09-18 18:24:04.905 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 50
                      2020-09-18 18:24:04.920 [vent.ItemStateChangedEvent] - C_HomeCinema_Dimmer changed from 0 to 50[/MARKIEREN]
                      2020-09-18 18:24:06.556 [vent.ItemStateChangedEvent] - denonmarantz_avr_0005cdb5c30a_general_surroundProg ram changed from STEREO to DOLBY ATMOS
                      2020-09-18 18:24:12.609 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-18T20:23:50.378+0200 to 2020-09-18T20:25:53.818+0200
                      2020-09-18 18:24:12.617 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 1.66 to 0.11
                      [MARKIEREN]2020-09-18 18:24:12.651 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 30
                      2020-09-18 18:24:12.663 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 30
                      2020-09-18 18:24:12.680 [vent.ItemStateChangedEvent] - C_HomeCinema_Dimmer changed from 50 to 30[/MARKIEREN]
                      2020-09-18 18:24:22.627 [vent.ItemStateChangedEvent] - PlexShieldEndTime changed from 2020-09-18T20:25:53.818+0200 to 2020-09-18T20:25:53.808+0200
                      2020-09-18 18:24:22.629 [vent.ItemStateChangedEvent] - PlexShieldProgress changed from 0.11 to 0.24
                      [MARKIEREN]2020-09-18 18:24:22.653 [ome.event.ItemCommandEvent] - Item 'C_HomeCinema_Dimmer' received command 0
                      2020-09-18 18:24:22.660 [nt.ItemStatePredictedEvent] - C_HomeCinema_Dimmer predicted to become 0
                      2020-09-18 18:24:22.683 [vent.ItemStateChangedEvent] - C_HomeCinema_Dimmer changed from 30 to 0[/MARKIEREN]
                      Ginge es, den Timer so zu setzen, dass er nicht einfach nur 2 Sekunden verzögert, sondern nach zwei Sekunden nochmal checkt: "Status Stopped"? Und nur wenn auch nach zwei Sekunden immer noch auf Stopped... dann mach Helligkeit (50)

                      Kommentar


                        #12
                        Okay, also beim Stopped nochmal zu hinterfragen funktioniert schon mal recht gut:
                        Code:
                        tPlex?.cancel                              // eventuell laufenden Timer abbrechen
                        if(strStatus == "Stopped")
                        tPlex = createTimer(now.plusSeconds(2),[|                  // Timer auf jetzt plus 2 Sekunden
                        if (strStatus == "Stopped")                                  // Check, ob bei Ablauf immer noch "Stopped"
                        C_HomeCinema_Dimmer.sendCommand(50)                    // Bei immer noch "Stopped" Dimmer setzen
                        ])                                                                                            // Ende der Timer Definition
                        Jetzt teste ich noch, den Switch von Clip-Playing auf Movie-Playing mit nem Timer zu versehen, um die erste falsche Progress-Meldung zu übergehen... schau'n mer mal, ob ich das hin bekomme

                        Kommentar


                          #13
                          Also ich bin da zu doof für, glaube ich... es ist doch eigentlich ganz einfach:

                          Code:
                          var Timer tPlex = null
                          
                          rule "Dim Lights"
                          when
                          Item PlexShieldProgress changed or
                          Item PlexShieldStatus changed
                          then
                          var Number nDimmer = C_HomeCinema_Dimmer.state as Number
                          val String strStatus = PlexShieldStatus.state.toString
                          val String strType = PlexShieldType.state.toString
                          val Number nProgress = if(PlexShieldProgress.state instanceof Number) (PlexShieldProgress.state as Number) else 0
                          
                          // 1)
                          if(strStatus == "Stopped")
                          tPlex?.cancel
                          tPlex = createTimer(now.plusSeconds(5),[|
                          if (strStatus == "Stopped")
                          C_HomeCinema_Dimmer.sendCommand(50)
                          ])
                          // 2)
                          if(strStatus == "Paused" || strType == "clip" || strType == "trailer")
                          nDimmer = 34
                          
                          // 3)
                          else if(strStatus == "Playing" && PlexShieldTitle.state.toString == "Tod auf dem Nil"){
                          if(nProgress <= 0.3 || nProgress >= 98.8)
                          nDimmer = 30
                          else
                          tPlex?.cancel
                          tPlex = createTimer(now.plusSeconds(5),[|
                          nDimmer = 0])}
                          
                          // 4)
                          else if(strStatus == "Playing"){
                          tPlex?.cancel
                          if (strStatus == "Playing")
                          tPlex = createTimer(now.plusSeconds(5),[|
                          C_HomeCinema_Dimmer.sendCommand(0)
                          ]) }
                          
                          if((C_HomeCinema_Dimmer.state as Number) != nDimmer)
                          C_HomeCinema_Dimmer.sendCommand(nDimmer)
                          
                          end

                          1)
                          Bei Stopped soll er auf hell (50) schalten, wenn in fünf Sekunden immer noch stopped ist, wenn aber nach 5 Sekunden was anderes Phase ist, dann soll er natürlich das andere machen

                          2)
                          Wenn Status oder Type Paused, clip oder trailer sind, dann ohne Rücksicht auf Verluste das Licht dimmen (34)

                          3)
                          Wenn Play und der bestimmte Titel, dann einfach kleiner und größer der Prozente das Licht auf 30 dimmen und ansonsten aus lassen. Aus lassen aber erst nach fünf sekunden, weil der PlexServer ja den ersten Prozentstatus falsch rübergibt, die Regel soll also fünf Sekunden warten und erst dann auf 0 schalten, wenn denn die Prozente inzwischen auf dem Innenbereich (0) stehen

                          4) Wenn nur Playing, ohne dass der Titel mit dem in Regel 3 benannten übereinstimmt, dann schalte einfach nach 5 Sekunden auf dunkel (0)

                          Im Ergebnis ist es aber leider so, dass zum Beispiel im Trailer das Licht nur ständig an und wieder aus geht, weil er natürlich auch beim Type "Clip" einen Status "Playing" hat. Aber das habe ich doch in ein else if gepackt und soll daher ja nur angesprochen werden, wenn kein vorheriges if greift... oder ist das falsch`?

                          Kommentar


                            #14
                            Also lieber Udo,

                            ich habe mich jetzt leicht umentschieden

                            Ich werde die Lichtsteuerung nicht komplett automatisieren, weil es so viele Sonderfälle gibt, dass man die im Leben nicht abgedeckt bekommt. Das hat mir das vergangene Wochenende gezeigt 😂

                            ich werde daher dazu übergehen, eine anständige Sitemap, ggf. mit einem guten UI aufzusetzen und ein altes Tablet dafür fit zu machen.

                            Auf jeden Fall bin ich Dir sehr dankbar für deinen Support, der hat mir in vielerlei Hinsicht sehr weitergeholfen

                            Schönen Sonntag Abend noch,
                            Torsten

                            Kommentar


                              #15
                              Also, das Problem mit den Timern ist, man muss schon verstehen, wie die ticken

                              openHAB ist ereignisorientiert. Rules triggern, wenn ein bestimmtes Ereignis eintritt. Wenn ich in einer Rule einen Timer erzeuge (mit create Timer), dann wird dieser in dem Scheduler eingetragen. Der zum Zeitpunkt X auszuführende Code ist Bestandteil dieses Eintrags. Er hat nichts mit der Rule zu tun (also außer der Tatsache, dass die Rule den Timer angelegt hat).

                              Die Abarbeitung der Rules, der Timer und auch aller anderen Dinge in openHAB wird von Threads erledigt. openHAB nutzt davon selbst wenn kein einziges Addon installiert ist schon über 100. Tendenziell kommen für jedes installierte Addon ein paar dazu.
                              Deshalb läuft openHAB hervorragend auf "schwachbrüstigen" Mehrkernsystemen, die Aufgaben werden alle parallel abgearbeitet.
                              Das bedeutet aber auch, dass man beim Programmieren zeitlicher Abläufe auf ein Problem stößt, weil "Warteschleifen" eine Todsünde darstellen. Stattdessen muss man sich Ereignisse suchen und entsprechend anders an die Aufgabe herangehen.

                              Mein oben geposteter Code erledigt seine Aufgabe in einer ganz bestimmten Weise. z.B. das Löschen des Timers muss bei jeder Regelausführung erfolgen, deshalb steht der Befehl auch außerhalb der if() Statements.
                              Die Rule triggert, falls sich der Status ändert oder der Progress sich ändert, in beiden Fällen kann man davon ausgehen, dass der Status nicht mehr Stopped ist. Wenn Du nun denselben Timer für eine andere Funktion verwenden willst, musst Du schon extrem genau aufpassen, was im Code passiert. Im Zweifel wäre es dann besser, Progress aus den Triggern hinauszuwerfen und im Zweifel über eine separate Rule diesen Teil zu bedienen. Also eine Rule, welche sich nur bei Statuswechseln um eine Anpassung der Beleuchtung kümmert, eine weitere Rule, welche beim Fortschreiten der Wiedergabe (abhängig vom wiedergegebenen Material) das Licht steuert.
                              Durch die Entflechtung kann dann die Status-Rule den Timer frei verwenden - bei Statusänderungen vor Ablauf des Timeouts ist ja der jeweils auszuführende Code hinfällig - darum kümmert sich die Anweisung tPlex?.cancel im Code.

                              Kommentar

                              Lädt...
                              X