ein Klammer - Syntaxproblem bei Xiaomi Sauger...?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

ein Klammer - Syntaxproblem bei Xiaomi Sauger...?

Beitrag von Steinspiel »

Moin,

Mit einer Rule will ich den Saugroboter zurück zur Ladestation schicken (was auch funktioniert).
Wenn er dann dort ist und der Status von "StatusInCleaning" und "ActionsControl" "0" bzw "dock" ist, soll eine Lampe eingeschaltet werden.
Einzelnd funktionieren die Befehle:

- der Rototer fährt zur Ladestation
- ist er in der Ladestation schaltet sich die Lampe an

Nur so wie ich sie in der Rule zusammengesetzt habe schaltet sich die Lampe nicht ein. Ich habe schon jede Menge Klammersetzvarianten probiert, aber scheinbar nicht die richtige gefunden ...

Kann mir jemand auf die Sprünge helfen?

Code: Alles auswählen

rule "sauger_ins_dock"

when
        Item Robo_ins_Dock changed to ON                                                                // Schalter "ins Dock"  geschaltet
                                                                                                             
then
         Mi_1S_ActionsCommands.sendCommand("app_charge") {	                                        // Kommando "Sauger zum laden fahren"
        
                if(Mi_1S_StatusInCleaning.state == 0 && Mi_1S_ActionsControl.state == "dock") {         // wird nicht gesaugt + ist im Dock, dann:
                        Dose1_Switch.sendCommand(ON)                                                    // Steckdose mit Lampe an
        }
        }
end
bis dann, Steinspiel

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Re: ein Klammer - Syntaxproblem bei Xiaomi Sauger...?

Beitrag von Darkwin101 »

Dein Problem ist kein Rule Problem sondern ein Logik Problem, wenn der Sauger nicht in der Ladestation ist und du ihn mit dem Schalter Anweist dorthin zu fahren braucht er sagen wir eine Minute, deine Rule wird aber in ca 1ms abgearbeitet.
Eine Rule wartet ja nicht das deine Bedingungen erfüllt sind sondern prüft nur ob die Bedingung erfüllt sind und beendet sich dann bzw. macht die Anweisung die Programmiert sind.
Also entweder muss du das ganze in einer Zeitschleife Laufen lassen bis der Roboter in der Station ist oder du verwendest eine Zweite Rule die Du auf den Status den Roboters triggerst.

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: ein Klammer - Syntaxproblem bei Xiaomi Sauger...?

Beitrag von Steinspiel »

Darkwin101 hat geschrieben: 17. Jul 2020 19:42 Dein Problem ist kein Rule Problem sondern ein Logik Problem,
[...]
Jetzt wo Du es sagst, scheint das "Logik Problem" logisch... ;)
Eigentlich kommt wirklich nur eine ausreichend langer Timer in betracht. Aber das mit der Zeit ist ja so ne Sache... Mal braucht er länger mal nicht. So richtig zufrieden bin ich damit noch nicht so...

Danke Dir.

Code: Alles auswählen

rule "sauger_ins_dock"

when
        Item Robo_ins_Dock changed to ON                                                                        // Schalter "ins Dock"  geschaltet
                                                                                                             
then
         Mi_1S_ActionsCommands.sendCommand("app_charge") 	                                                // Kommando "Sauger zum laden fahren"
                logInfo("Sauger","zum laden geschickt")
        
                        verz_sauger?.cancel                                                                     // evtl. laufenden Timer abbrechen
                        verz_sauger = createTimer(now.plusSeconds(50), [|                                       // Timer auf 2 sec setzen
                        
                                if(Mi_1S_StatusInCleaning.state == 0 && Mi_1S_ActionsControl.state == "dock")   // wird nicht gesaugt + ist im Dock, dann:
                                Dose1_Switch.sendCommand(ON)                                                    // Steckdose mit Lampe an
                        
                        verz_sauger = null                                                                      // Timer wieder auf NULL setzen     

                                 
                                ]
                                )
                                       
end
bis dann, Steinspiel

Darkwin101
Beiträge: 424
Registriert: 6. Mär 2019 11:19
Answers: 14

Re: ein Klammer - Syntaxproblem bei Xiaomi Sauger...?

Beitrag von Darkwin101 »

Code: Alles auswählen

rule "sauger_ins_dock"

when
        Item Robo_ins_Dock changed to ON                                                                        // Schalter "ins Dock"  geschaltet
                                                                                                             
then
         Mi_1S_ActionsCommands.sendCommand("app_charge") 	                                                // Kommando "Sauger zum laden fahren"
                logInfo("Sauger","zum laden geschickt")
        
                        verz_sauger?.cancel                                                                     // evtl. laufenden Timer abbrechen
                        verz_sauger = createTimer(now.plusSeconds(50), [|                                       // Timer auf 2 sec setzen
                        
                                if(Mi_1S_StatusInCleaning.state == 0 && Mi_1S_ActionsControl.state == "dock"){   // wird nicht gesaugt + ist im Dock, dann:
                                Dose1_Switch.sendCommand(ON)                                                    // Steckdose mit Lampe an
                        
                        verz_sauger = null}                                                                                              // Timer wieder auf NULL setzen     
                        else { verz_sauger.reschedule(now.plusSeconds(10)) }     					// Starte Timer erneut für 10 Sek.

                                 
                                ]
                                )
                                       
end
Wenn ich das richtig mit den Timern verstanden habe sollte er jetzt beim ersten Durchgang 50 Sekunden Warten und solange der Sauger nicht zurück ist alle 10 Sekunden wieder Abfragen bis die Bedingung erfüllt ist.

Eventuell würde ich noch einen Zähler einbauen damit dies nicht unendlich passiert und du eine Schleife hast wenn der Sauger mal nicht die Ladestation findet, so das er nach 100 Durchgängen abricht oder so.

Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: ein Klammer - Syntaxproblem bei Xiaomi Sauger...?

Beitrag von udo1toni »

Bitte immer auch dran denken, dass ein Timer Objekt auch definiert werden muss, und zwar global. das heißt, vorn in der Datei muss vor der ersten Rule noch ein

Code: Alles auswählen

var Timer verz_sauger = null
mit rein.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten