Seite 2 von 2

Re: Schalter mit 4 Zuständen via Rule auswerten

Verfasst: 23. Mär 2020 16:26
von udo1toni
Ja, sicher ist das sinnvoll. Du möchtest vermutlich abhängig von der gewählten Taste unterschiedlich lange Ein/Ausschalten?

Gesendet von meinem SM-G973F mit Tapatalk


Re: Schalter mit 4 Zuständen via Rule auswerten

Verfasst: 23. Mär 2020 21:28
von hurra
also, ich hab's geschnallt !!! danke!!!

aber ... obwohl ich doch schon einiges mit rules gelöste habe, stoße ich dennoch auf ein Hinternis:

wie schaffe ich es, den aktuellen Wert/Command von Rollo_X_Zustand auzulesen?
Mir wird egal bei welchem Wert, nur die 1 angezeigt.

Code: Alles auswählen

rule Rollo_X
 
 when
      Item Rollo_X_Zustand received command
 then 
    	
//val Rollo_X_Zustandstate = Rollo_X_Zustand.state.toString
//logInfo("light", Rollo_X_Zustandstate.state.toString)

        if (Rollo_X_Zustand.state.toString == "1")
            {   logInfo("test", "test 1") }
         
        else if (Rollo_X_Zustand.state.toString == "2")
            {   logInfo("test", "test 2") }

        else if (Rollo_X_Zustand.state.toString == "3")
            {   logInfo("test", "test 3") }

        else if (Rollo_X_Zustand.state.toString == "4")
            {   logInfo("test", "CtestH 4") }
        
end

Re: Schalter mit 4 Zuständen via Rule auswerten

Verfasst: 23. Mär 2020 22:40
von udo1toni
Da nun an der Tastatur und nicht per Handy, etwas ausführlicher ;)

Du hast das Item so definiert, dass autoupdate="false" gesetzt ist. Das Item ist ansonsten mit keinem Binding gekoppelt.
Wenn Du in der Sitemap ein Item betätigst, wird immer ein Kommando gesendet. Gewöhnlich löst dieses Kommando auch eine Änderung des Status aus, da Du das aber explizit abgeschaltet hast, unterbleibt das Update des Status.

Du reagierst in der Rule auf ein Kommando. Nun sollte Dich nicht der Status eines Items (zufälligerweise das selbe, wie das, von dem das Kommando kommt) interessieren, sondern das Kommando. Dieses steht mit der impliziten Variablen receivedCommand zur Verfügung.

Deine Rule sähe also besser so aus:

Code: Alles auswählen

rule "Rollo X"
when
    Item Rollo_X_Zustand received command
then 
    logInfo("test", "Empfangenes Kommando für Rollo_X_Zustand: {}",receivedCommand)
end
Jetzt komme ich aber gleich mit einer wichtigen Frage: Das X deutet für mich an, dass es um mehrere Rollos geht. Wenn das so ist, solltest Du von Anfang an darauf achten, die Rule allgemein zu fassen.
Du möchtest nicht zehn Rules anlegen, die bis auf das triggernde Item und das beeinflusste Item identisch sind. Stattdessen sollte die Rule auf alle betroffenen Items triggern und anschließend selbst bestimmen, auf welches Item sie einwirken soll.
Um so eine Rule zu entwickeln, muss aber schon konkret bekannt sein, was die Rule machen soll. Bezogen auf das Beispiel oben: Packe alle Items Rollo_X_Zustand in eine Gruppe gRollo_Zustand. Anschließend sieht die Rule so aus:

Code: Alles auswählen

rule "Rollo X"
when
    Member of gRollo_Zustand received command
then 
    logInfo("test", "Empfangenes Kommando für {}: {}",triggeringItem.name,receivedCommand)
end
Es hat sich also (fast) nichts geändert. Lediglich der Trigger ist nun ein anderer und im logInfo wird eine zweite implizite Variable verwendet, triggeringItem ist das Item, welches die Rule ausgelöst hat, es handelt sich um einen Zeiger auf das Original Item, somit verhält sich triggeringItem exakt wie das Original.

Re: Schalter mit 4 Zuständen via Rule auswerten

Verfasst: 26. Mär 2020 10:00
von hurra
Jetzt habe ich gerade etwas Zeit für die Weiterarbeit, und da muss ich dir gleich mal für die ausführliche Erklärung danken! So hat alles geklappt und es funktioniert wie gewollt!!

Re: Schalter mit 4 Zuständen via Rule auswerten

Verfasst: 8. Jul 2020 19:36
von hurra
Ich habe gestern das Thema wieder aufgenommen und hänge noch immer an einem -wahrscheinlich- Interpretationsfehler!

Die Rule spricht bei Wertänderung des Items an, brint mir auch die Meldung im log. Aber die Schaltzustände selbst lassen sich nicht auswerten. Im Log wird aber dennoch die Wertänderung protokolliert. Sorry, ich komme leider ohne Hilfe nicht mehr weiter :?

Code: Alles auswählen

2020-07-08 19:32:10.608 [ome.event.ItemCommandEvent] - Item 'PLC_Rollo_X_STRG' received command 0
Das Item:

Code: Alles auswählen

Number PLC_Rollo_X_STRG {autoupdate="false"}
Die Rule:

Code: Alles auswählen

rule "Rollo X1"
when
    Item PLC_Rollo_X_STRG received command
then 
   logInfo("test", "Rollosteuerung_Wert empfangen: {}",receivedCommand)

        if (PLC_Rollo_X_STRG.state.toString == 0){           // STOP
        logInfo("test", "Rollosteuerung_Kokreter Wert: {}",receivedCommand) 
        }
....

Re: Schalter mit 4 Zuständen via Rule auswerten

Verfasst: 8. Jul 2020 19:54
von peter-pan
...hast du schon mal probiert das ".toString" bei der If-Abfrage weg zu lassen, oder aber die 0 in Hochkomma "0" zu setzen ?

Code: Alles auswählen

if (PLC_Rollo_X_STRG.state == 0)

Code: Alles auswählen

if (PLC_Rollo_X_STRG.state.toString == "0")

Re: Schalter mit 4 Zuständen via Rule auswerten

Verfasst: 8. Jul 2020 20:27
von hurra
bestimmt, aber ich hab noch einmal zur Sicherheit folgende Varianten -ohne Erfolg- probiert:

Code: Alles auswählen

if (PLC_Rollo_X_STRG.state == "0"){ 
if (PLC_Rollo_X_STRG.state == 0){
if (PLC_Rollo_X_STRG.state.toString == "0"){    
if (PLC_Rollo_X_STRG.state.toString == 0){

Re: Schalter mit 4 Zuständen via Rule auswerten

Verfasst: 9. Jul 2020 00:39
von peter-pan
...andere Frage: Triggert die Rule ? D.h. bekommst du die LogInfos ?

Re: Schalter mit 4 Zuständen via Rule auswerten

Verfasst: 9. Jul 2020 01:22
von udo1toni
Wenn Du einen String verwendest, musst Du auch mit einem String vergleichen.

Aber wie oben erwähnt, darfst Du Dich nicht für den Status interessieren, sondern nur für das Kommando, das sind zwei komplett unabhängige Dinge!!!

Deine Abfrage MUSS receivedCommand auswerten und DARF NICHT Item.state auswerten!!!

Code: Alles auswählen

rule "Rollo X1"
when
    Item PLC_Rollo_X_STRG received command
then 
   logInfo("test", "Rollosteuerung_Wert empfangen: {}",receivedCommand)
   if (receivedCommand == 0)           // STOP
        logInfo("test", "Rollosteuerung hat Null empfangen") 
   if (receivedCommand == 1)
        logInfo("test", "Rollosteuerung hat Eins empfangen") 
   if (receivedCommand == 2)
        logInfo("test", "Rollosteuerung hat Zwei empfangen") 
end
Alternativ, falls Du mit String arbeiten willst:

Code: Alles auswählen

rule "Rollo X1"
when
    Item PLC_Rollo_X_STRG received command
then 
   logInfo("test", "Rollosteuerung_Wert empfangen: {}",receivedCommand)
   if (receivedCommand.toString == "0")           // STOP
        logInfo("test", "Rollosteuerung hat Null empfangen") 
   if (receivedCommand.toString == "1")
        logInfo("test", "Rollosteuerung hat Eins empfangen") 
   if (receivedCommand.toString == "2")
        logInfo("test", "Rollosteuerung hat Zwei empfangen") 
end

Re: Schalter mit 4 Zuständen via Rule auswerten

Verfasst: 9. Jul 2020 19:39
von hurra
udo1toni hat geschrieben: 9. Jul 2020 01:22 ...

Deine Abfrage MUSS receivedCommand auswerten und DARF NICHT Item.state auswerten!!!
Da war mein Fehler. Ich habe immer

Code: Alles auswählen

 PLC_Rollo_X_STRG.receivedCommand
ausgwertet. Warum auch immer... aber wenn ich nur

Code: Alles auswählen

receivedCommand 
auswerte, komm ich auf die Lösung!

Danke