Ankündigung

Einklappen
Keine Ankündigung bisher.

wifiLED Binding - Farbe in Rule einstellen

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

    wifiLED Binding - Farbe in Rule einstellen

    Hallo.
    Hat jemand einen Tip, wie ich in einer Rule einen Farbwert an meinen LED Stripe übergeben kann?
    Ich habe folgende Items:
    Code:
    //Wohnzimmerschrankbeleuchtung Wifi Ufo 382A
    Switch WZ_LED_Power "LED Lichtschalter" (gWZ_LED_Schrank, gWohnzimmer) {channel="wifiled:wifiled:ACCF2384DDA2:power"}
    Color WZ_LED_Color "LED Farbe" (gWZ_LED_Schrank) {channel="wifiled:wifiled:ACCF2384DDA2:color"}
    Dimmer WZ_LED_White "LED Weiß" (gWZ_LED_Schrank) {channel="wifiled:wifiled:ACCF2384DDA2:white"}
    Dimmer WZ_LED_White2 "LED Weiß 2" (gWZ_LED_Schrank) {channel="wifiled:wifiled:ACCF2384DDA2:white2"}
    String WZ_LED_Program "LED Programm" (gWZ_LED_Schrank) {channel="wifiled:wifiled:ACCF2384DDA2:program"}
    Dimmer WZ_LED_ProgramSpeed "LED Programmgeschwindigkeit" (gWZ_LED_Schrank) {channel="wifiled:wifiled:ACCF2384DDA2:programSpeed"}
    Ich möchte jetzt, wenn es an der Tür klingelt den Stripe rot aufleuchten lassen.
    Code:
    rule "Türklingel"
    when
        Item Klingel_1 changed to ON
    then
         if (WZ_LED_Power==ON)
    {
    WZ_LED_Color.sendCommand(100,100,100)
    }
    end
    Das tut es nicht. Im Visual Code kommt die Meldung:
    Code:
    file: 'file:///k%3A/rules/Licht.rules'
    severity: 'Fehler'
    message: 'Invalid number of arguments. The method sendCommand(Item, Number) is not applicable for the arguments (ColorItem,int,int,int)'
    at: '25,28'
    source: ''
    code: 'org.eclipse.xtext.xbase.validation.IssueCodes.invalid_number_of_arguments'
    Wie muß ich die Farben angeben

    #2
    Color Items verwenden HSB als Farbraum. Schau mal, ob Du hiermit weiter kommst: https://community.openhab.org/t/ligh...nversion/39132

    Kommentar


      #3
      Guten Morgen.
      So manches Mal sollte man eine Nacht über einProblem schlafen und dann erst fragen.
      Ich habe im sendCommand die "" vergessen.
      Nachdem ich das gemacht hatte und die if-Bedingung gelöscht hatte, leuchtete der Stripe beim Klingeln in knallgrün(da muss ich noch ein wenig spielen, sonst bekomme ich Augenkrebs wenn es klingeln.)
      Den verlinkten Beitrag hab ich mir mal angeschaut, aber das ist mir noch eine Nummer zu viel am Anfang.
      Trotzdem super lieben Dank.

      Kommentar


        #4
        Jetzt hab ich doch noch Fragen zur Timergesteuerten Schaltung:
        Ich habe jetzt meine Rule mit der Türklingel zum testen mal mit einem Dummy-Item (switch Testbutton "Schalter") eingegeben und versuche per Timer eine Schaltbare Steckdose für 5 sekunden an und dann wieder auszuschalten.
        Wenn ich das mit createTimer mache, dann funktioniert es, wenn ich das mit Thread::sleep mache, passiert garnichts.
        Im Log kommt das change from OFF to ON an, aber es passiert sonst nicht. Bei CreateTimer geht das.
        Was läuft da schief?

        Hier die Rule:
        Code:
         rule "Türklingel"
        when
            Item Testbutton changed to ON
        then
            if (Wallplugecas1_SwitchBinary.state == OFF)
                    {
                       sendCommand(Wallplugecas1_SwitchBinary, ON)
                      sendTelegram("holger", "Es hat an der Tür geklingelt und Das Licht war AUS")
                      //Thread::sleep(5000)
                      //sendCommand(Wallplugecas1_SwitchBinary, OFF)
                      createTimer(now.plusSeconds(5)) [| sendCommand(Wallplugecas1_SwitchBinary, OFF)
                       ]
                      sendCommand(Testbutton, OFF)
                    }
        
        end
        So wie die Rule da steht, geht es, wenn ich aber die "//" vor creatTimer setze und vor Thread::sleep und sendCommand entferne kommt auch keine Nachricht per Telegramm und der Wallplug bleibt auf OFF.

        Ich möchte ja in einer 2. if-Bedingung abfragen, wenn Wallplugcas1_SwitchBinary.state ==ON, dann soll er ja nur die Farbe für 5 Sekunden wechseln und dann wieder zurück auf die "Standardfarbe". Bei CreateTimer würde das ja sofort passieren, oder wie kann ich mehrer Befehle nacheinander im CreateTimer absetzen, also, Color-Item und Dimmer-Item ändern?

        Kommentar


          #5
          Thread::sleep() mit Werten größer 500 ist eine ganz schlechte Idee, wobei es grundsätzlich schon funktionieren sollte, aber: openHAB nutzt einen Threadpool für die Rules, der per default 5 Threads vorhält. Wenn Du also mit längeren Thread::sleep() Anweisungen arbeitest, wird openHAB vermutlich nicht zuverlässig alle Rules ausführen. Macht aber nichts, denn selbstverständlich kann man innerhalb des Lambdas (Der Bereich zwischen [| ...]) ebenfall beliebig viele Befehle verwenden. Du kannst das Problem elegant lösen, indem Du die Lichteinstellung persistierst und anschließend im Timer
          Code:
          Wallplugecas1_SwitchBinary.sendCommand(Wallplugecas1_SwitchBinary.previousState().state)
          verwendest (entsprechend natürlich auch für die Farbe). Damit sparst Du Dir sogar die Bedingung zu Beginn.

          Kommentar


            #6
            Zitat von udo1toni Beitrag anzeigen
            Thread::sleep() mit Werten größer 500 ist eine ganz schlechte Idee, wobei es grundsätzlich schon funktionieren sollte, aber: openHAB nutzt einen Threadpool für die Rules, der per default 5 Threads vorhält. Wenn Du also mit längeren Thread::sleep() Anweisungen arbeitest, wird openHAB vermutlich nicht zuverlässig alle Rules ausführen. Macht aber nichts, denn selbstverständlich kann man innerhalb des Lambdas (Der Bereich zwischen [| ...]) ebenfall beliebig viele Befehle verwenden. Du kannst das Problem elegant lösen, indem Du die Lichteinstellung persistierst und anschließend im Timer
            Code:
            Wallplugecas1_SwitchBinary.sendCommand(Wallplugecas1_SwitchBinary.previousState().state)
            verwendest (entsprechend natürlich auch für die Farbe). Damit sparst Du Dir sogar die Bedingung zu Beginn.
            Das heisst dann aber, ich kann rrd4j nicht zum persistieren nehmen, da es ja "nur" Zahlen kann, oder?
            Aber MapDB sollte doch ganz gut dafür gehen, oder?
            Kann die Rule dann in etwa so aussehen?

            Code:
            rule "Türklingel" when
                Item Klingel_1 changed to ON
            then
                WZ_LED_Color.sendCommand("100,100,100")
                WZ_LED_White.sendCommand(0)
                WZ_LED_Power.sendCommand(ON)
                createTimer(now.plusSeconds(5)) [|
                            sendCommand(WZ_LED_Color.previousState().state
                            sendCommand(WZ_LED_White.previousState().state
                           sendCommand(WZ_LED_Power.previousState().state] )
            end
            Zuletzt geändert von hoggle1969; 17.02.2018, 11:54.

            Kommentar


              #7
              Bis auf die fehlenden und überzähligen Klammern sollte das so stimmen. Was die Persistence betrifft, bin ich mir jetzt nicht 100% sicher, ob mapdb tatsächlich zwei Werte vorhält (also den aktuellen und den alten Status), aber Versuch macht kluch, oder so.
              Bis auf den Switch sind aber alle Items Zahlenwerte, und selbst beim ON/OFF könnte es sein, dass rrd4j das intern als 1/0 speichert, also auch da könnte ein Versuch lohnen.

              Wenn man Code kopiert und einfügt, werden oftmals im Foreneditor noch die korrekten Zeilenumbrüche angezeigt, im Posting sind sie dann aber weg. Abhilfe (im Sinne von Blindheit beim Verfassen des Postings) schafft es, einmal Die Ansicht auf Quelltext (und wieder zurück) zu ändern (im Foreneditor in der Titelzeile das unterstrichene A anklicken, anschließend das Symbol mit <> (ganz links). Falls man den Fehler erst nach dem Posten bemerkt, kann man das Posting noch bearbeiten

              Kommentar


                #8
                Zitat von udo1toni Beitrag anzeigen
                ...

                Wenn man Code kopiert und einfügt, werden oftmals im Foreneditor noch die korrekten Zeilenumbrüche angezeigt, im Posting sind sie dann aber weg. Abhilfe (im Sinne von Blindheit beim Verfassen des Postings) schafft es, einmal Die Ansicht auf Quelltext (und wieder zurück) zu ändern (im Foreneditor in der Titelzeile das unterstrichene A anklicken, anschließend das Symbol mit <> (ganz links). Falls man den Fehler erst nach dem Posten bemerkt, kann man das Posting noch bearbeiten
                Hab ich mich darüber gestern aufgeregt.
                Naja, hab gedacht, es liegt an meinem Tablett. Kommt davon, wenn man faul auf dem Sofa liegt.

                Das mit den zu viel/zu wenigen Klammern muß ich mir mal anschauen und das mit dem "zwischenspeichern" der Werte auch, aber vielen Dank für deine schnelle Hilfe. Ich melde mich mal, wenn es so läuft, wie ich es erhoffe.

                Kommentar


                  #9
                  Es will immer noch nicht
                  Hier noch einmal die Rule:
                  Code:
                  rule "React on Türklingel1 (Klingel_1) change/update"
                  when
                      Item Klingel_1 changed from OFF
                  then
                      WZ_LED_Color.sendCommand("100,100,100")
                      WZ_LED_White.sendCommand(0)
                      WZ_LED_Power.sendCommand(ON)
                      createTimer(now.plusSeconds(5)
                  [|
                  {
                                  sendCommand(WZ_LED_Color.previousState().state)
                                  sendCommand(WZ_LED_White.previousState().state)
                                 sendCommand(WZ_LED_Power.previousState().state))
                  }
                           ]
                  end
                  Wo fehlt denn da noch was?
                  Im Log kommen diese Fehler, obwohl der Visual Studio Code Editor keinen Fehler anzeigt:
                  Code:
                   
                      
                  2018-02-17 12:22:23.207 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'Klingel.rules' has errors, therefore ignoring it:
                  [23,1]: no viable alternative at input ' '
                  [24,1]: no viable alternative at input ' '
                  [25,1]: no viable alternative at input ' '
                  [28,1]: mismatched input ' ' expecting '}'
                  [29,1]: no viable alternative at input ' '
                  [30,2]: no viable alternative at input ' '
                  [30,64]: missing ']' at ')'
                  [31,17]: mismatched input '}' expecting 'end'
                  In der rrd4j.perstist steht:
                  Code:
                  WZ_LED_Power : strategy = everyChange, restoreOnStartup
                  WZ_LED_Color : strategy = everyChange, restoreOnStartup
                  WZ_LED_White : strategy = everyChange, restoreOnStartup
                  In der Item-Datei:

                  Code:
                  Switch WZ_LED_Power "LED Lichtschalter" (gWZ_LED_Schrank, gWohnzimmer) {channel="wifiled:wifiled:ACCF2384DDA2:power"}
                  Color WZ_LED_Color "LED Farbe" (gWZ_LED_Schrank) {channel="wifiled:wifiled:ACCF2384DDA2:color"}
                  Dimmer WZ_LED_White "LED Weiß" (gWZ_LED_Schrank) {channel="wifiled:wifiled:ACCF2384DDA2:white"}
                  
                  Switch Klingel_1 "Türklingel1" (gTuerklingel) {fs20="ea9c00"}
                  Ich hab heute Abend ein "kleines" Treffen mit gut 40 Freunden und kann die Klingel leider nicht hören, weil die Frauen so laut sind.
                  Könnt ihr mir helfen?

                  PS: Ich glaube, die Jungs sind mindestens genauso laut, aber das würde ich nie sagen

                  Kommentar


                    #10
                    Du hast nur sendCommand geschrieben. Entweder Item.sendCommand(state) oder sendCommand(Item, State) (wobei die erste variante stark zu bevorzugen ist, also z.B.:
                    Code:
                    WZ_LED_Color.sendCommand(WZ_LED_Color.previousState().state)
                    Bist Du sicher, dass das Klingel Item immer wieder nach OFF wechselt (meine Klingel sendet ausschließlich ON, weshalb ich auf received command ON triggere)

                    Kommentar


                      #11
                      Code:
                      [18]rule "React on Türklingel1 (Klingel_1) change/update"
                      [19]   when
                      [20]        Item Klingel_1 changed to ON
                      [21]   then
                      [22]       WZ_LED_Color.sendCommand("100,100,100")
                      [23]       WZ_LED_White.sendCommand(0)
                      [24]       WZ_LED_Power.sendCommand(ON)
                      [25]       createTimer(now.plusSeconds(5))
                      [26]              [|
                      [27]                  {
                      [28]                   WZ_LED_Color.sendCommand(WZ_LED_Color.previousState().state)
                      [29]                   WZ_LED_White.sendCommand(WZ_LED_White.previousState().state)
                      [30]                   WZ_LED_Power.sendCommand(WZ_LED_Power.previousState().state)
                      [31]                 }
                      [32]                ]
                      [33]   end
                      Und im LOG:
                      Code:
                      2018-02-17 14:23:48.100 [WARN ] [el.core.internal.ModelRepositoryImpl] -
                      Configuration model 'Klingel.rules' has errors, therefore ignoring it: 
                      [23,1]: no viable alternative at input ' '
                      [24,1]: no viable alternative at input ' '
                      [25,1]: no viable alternative at input ' '
                      [29,1]: no viable alternative at input ' '
                      [30,2]: no viable alternative at input ' '
                      Klappt also auch nicht. Hab mal die Zeilennummern eingefügt.

                      Kommentar


                        #12
                        Also, diese Rule geht erst einmal:
                        Code:
                        then
                                        sendTelegram("holger", "Es hat an der Tür geklingelt")                                                      
                                        WZ_LED_Color.sendCommand("200,100,100")                                                             
                                        WZ_LED_White.sendCommand(5)                                                                         
                                        Klingel_1.sendCommand("OFF")                                                                        
                        
                        
                        createTimer(now.plusSeconds(5))                                                                                     
                                [                                                                                                           
                                        WZ_LED_Color.sendCommand("0,0,0")                                                                   
                                        WZ_LED_White.sendCommand(27)      
                        ]
                        Es liegt dann wohl an den abgespeicherten Werten.
                        Egal, hauptsache das Licht wechselt beim klingeln.
                        Vielleicht hat ja noch jemand eine Idee.

                        Kommentar


                          #13
                          Du kannst ja mal nachschauen, was das Item zurück gibt:
                          Code:
                          logInfo("Rule.Klingel","WZ_LED_Color: {}",WZ_LED_Color.previousState().state)
                          logInfo("Rule.Klingel","WZ_LED_White: {}",WZ_LED_White.previousState().state)
                          logInfo("Rule.Klingel","WZ_LED_Power: {}",WZ_LED_Power.previousState().state)
                          Den Block fügst Du im Timer ein, oder auch davor (aber natürlich, nachdem die Lampen schon geschaltet wurden). Nachdem die Rule ausgeführt wurde, findest Du in der Datei openhab.log drei Zeilen mit den zurück gelieferten alten Werten.

                          Die Rule sieht eigentlich gut aus. Ein möglicher Fehler könnte sein, dass rrd4j nicht die default Persistence ist. Dann müsste es
                          Code:
                          WZ_LED_Color.previousState(false,"rrd4j").state
                          heißen. Das false ist der default Wert und muss deswegen normalerweise nicht angegeben werden. Wenn dort true steht, wird der letzte Status zurückgegeben, der sich vom aktuellen Status unterscheidet. als zweiten Parameter kann man dann den Persistence Service angeben, der als Quelle dienen soll. Ist dieser wert nicht gesetzt, wird immer der Default Service genommen, das könnte natürlich auch ein anderer Service sein, der vielleicht gar keine werte für das Item enthält.

                          Kommentar

                          Lädt...
                          X