Ankündigung

Einklappen
Keine Ankündigung bisher.

OH2: Mähroboter Rule

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

    OH2: Mähroboter Rule

    Hallo zusammen,

    ich versuche eine Regel zu bauen um meinen Mähroboter (Landroid S) zu steuern. Da es ja leider noch kein Binding gibt, läuft dies über MQTT.
    Hintergrund: Ich möchte die gesamte Steuerung in OH vornehmen und nicht über die jeweiligen Apps der Hersteller, da diese natürlich nicht unter einander kommunizieren. Auch steht der Roboter in einer Ecke, wo die Rasensprenger ihn nicht erreichen und ich möchte vermeiden, dass der Roboter die Gardena Beregner umnietet ;-)

    Folgendes habe ich mir bisher überlegt
    Code:
     rule"Mower Schedule"
      when
      Time cron "0 58 21 ? * MON-SAT"
      then
          pushNotification("eDolly: "+ now, "Scheduler")
      while (now.getHourOfDay <1350) {
              pushNotification("eDolly: "+ now, "While")
      Thread::sleep(60000)
      if (Mower_StatusCode.state ==0&&Mower_ChargeState.state.toString =="false") {
                  pushNotification("eDolly: "+ now, "Ich bin zu Hause müsste losfahren")
      
              }
          }
      end
    Die Regel startet erwartungsgemäß und ich bekomme die erste Pushnachricht und dann jede Minute die nächste.
    Aber die Kombination über && funktioniert nicht :-/
    Einzeln habe ich diese Abfragen in anderen Regeln

    Viele Grüße,
    Jörg
    Zuletzt geändert von JoergA; 13.07.2018, 21:05.

    #2
    Hallo Jörg,
    ich hab auch vor meinen Landroid S über openHAB zu steuern. Leider zickt die Anbindung an den MQTT noch etwas. Welche Software nutzt du da und auf welcher Plattform?
    Grüße
    Stefan

    Kommentar


      #3
      Hallo Stefan

      ich habe node.js laufen mit einem angepassten IOBroker script (aus dem Roboterforum)
      Dann noch Mosquitto für MQTT

      btw: Den Fehler habe ich gefunden und die While Schleife funktioniert nur ;-) Nun kann ich weiter testen.

      Viele Grüße,
      Jörg

      Kommentar


        #4
        Hallo noch einmal,

        ich bin doch noch nicht so weit

        Die Routine springt in die While Schleife, jedoch dann nicht mehr raus
        ich vermutet, dass While nicht "now.getHourOfDay <1350" interpretieren kann.
        Habt ihr eine Idee, wie ich eine Zeit in der While Schleife angeben kann?
        Ggfs. in der While Schleife zählen?

        Gruß,
        Jörg

        Kommentar


          #5
          Hallo Jörg,

          hab die MQTT-Abindung von https://github.com/weweave/landroid-bridge. Jetzt hab ich es zum Laufen gebracht. Die Fehlermeldung kam von Zeile 46 der Datei landroid-cloud-2.js des IOBroker Bindings. Hier passt das IOBroker Binding anscheinend nicht zum übergeordneten Script. Das Problem lag an einem falschen Passwort. Das Script kann sich jetzt an der Cloud anmelden und bekommt alle Daten über meinen Robby. :sunglasses:

          Jetzt mal zu deinem Problem: Ich verstehe nicht, warum du unbedingt den Status pollen willst. Ich würde für das Beenden einfach eine neue Regel aufnehmen, die dann halt zur gewünschten Endezeit oder wenn die Bewässerung angeht den Landroid nach Hause schickt.

          Grüße
          Stefan

          Kommentar


            #6
            Hallo Stefan,

            wenn das E-Schaaf zur gewünschten Zeit losfährt, soll es dann eben 2,5 Stunden auf der Weide bleiben.
            In der Regel ist nach ca. 1 Std. der Akku leer und Dolly fährt alleine nach Hause.
            Daher polle ich auf den Status des Akkus und wenn der in dem Zeit Fenster wieder voll wird (was normalerweise der Fall ist) dann soll Dolly eben wieder los.
            Wenn das Fenster abgelaufen ist, kommt dann der Rückruf und Dolly fährt heim.

            Ich könnte auch den Scheduler jeden Tag aufs neue setzen, aber für am liebsten auf die native App verzichten. Ein Punkt ist sicher auch noch der Kantenschnitt, den bekomme ich derzeit ohne die App auch noch nicht hin. Aber dies ist dann für später, nun möchte ich erst einmal die Steuerung in OH bekommen ;-)

            Gruß
            Jörg

            PS: Schön, dass Du es noch geschafft hast. Im Roboter Forum war jemand, der sich an ein Binding geben wollte, aber dies scheint wohl leider im Sande verlaufen zu sein :-(

            Kommentar


              #7
              Hallo Jörg,

              du kannst auch beim Vollladen einen Event auslösen und ihn dann wieder losschicken, wenn die Zeit noch nicht um ist. Sprich, beim Start die geplante Endezeit ausrechnen in einer Variablen (am einfachsten ein virtuelles Item) zwischenspeichern und erst wenn er wieder geladen ist, prüfen, ob er nochmal los soll. Für die Endezeit müsste man sich dann etwas überlegen, dass er während des Mähens auch regelmäßig in eine Prüfroutine läuft.

              Update:
              Ich habe jetzt mal geprüft, welche Nachrichten er während des Mähens schickt. Das dauert ganz schön lange, bis er ein Update sendet. 10 Minuten ist schon eine recht geringe Auflösung. Man kann das Aktualisieren in der App aber manuell auslösen, indem man den refresh Button (die kreisenden Pfeile oben rechts) drückt.

              Mein Vorschlag zu deinem Problem: Du könntest ein Item für die aktuelle Zeit des Robbies (dateTime, in der App "Letzte Aktualisierung"). Dann eine Rule erstellen mit der du auf eine Änderung dieses Items reagierst. Sobald die Endezeit überschritten ist, Robby (oder bei dir das Schaf) nach Hause schicken. Alternativ eine Rule, die einfach jede Minute per cron getriggert wird und prüft, ob der Robby noch mäht und die Endezeit überschritten ist.

              Grüße
              Stefan
              Zuletzt geändert von Don Stefano; 14.07.2018, 21:09.

              Kommentar


                #8
                Es ist eine ganz schlechte Idee, eine Rule mit langem Thread::sleep() schlafen zu lassen. Rules werden Event-gesteuert gestartet, in diesem Fall Montag bis Samstag um 21:58. Anschließend lebt diese Rule ewig, da die while-Bedingung immer erfüllt ist (now.getHourOfDay ist vom Typ Integer mit dem Wertebereich 0 bis 23)
                Am Samstag würde also die Rule sechsmal gleichzeitig laufen, wenn nicht der Scheduler nur 5 Threads für die Ausführung von Rules zur Verfügung stellen würde.
                Ab Freitag wird also keine einzige andere Rule mehr ausgeführt...

                Stattdessen sollte das Ganze als Timer angelegt werden (wenn man denn die Funktion so umsetzen will...)
                Code:
                var Timer teDolly = null
                
                rule"Mower Schedule"
                when
                    Time cron "0 58 21 ? * MON-SAT"                                                                                                   //21:58:00 Uhr
                then
                    pushNotification("eDolly: " + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") + " Scheduler")
                    teDolly?.cancel                                                                                                                   // if(teDolly !== null) teDolly.cancel
                    teDolly = createTimer(now, [|
                        pushNotification("eDolly: "+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") +" Timer")
                        if (Mower_StatusCode.state == 0 && Mower_ChargeState.state.toString == "false")
                            pushNotification("eDolly: " + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") + " Ich bin zu Hause müsste losfahren")
                        if (now.getMinuteOfDay < 1350)                                                                                               // 22:20 Uhr
                            teDolly.reschedule(now.plusMinutes(1))
                        else
                            teDolly = null
                    ])
                end
                Wo liegt nun der Unterschied?
                Die rule startet und legt einen Timer an. Anschließend ist die Rule zuende.
                Der Timer-Code wird unmittelber ein erstes Mal ausgeführt. Anschließend wird der Timer erneut geplant, diesmal eine Minute in der Zukunft. Nun wird kein Thread belegt, es gibt nur den Code im Scheduler. Der Scheduler führt den Code zur geplanten Zeit aus, bis 22:19 Uhr. Danach wir der Timer nicht erneut geplant und der Zeiger auf den Timer wird "genullt".

                Allerdings denke ich nicht, dass die Rule - in welcher Form auch immer - zielführend ist

                Kommentar

                Lädt...
                X