Seite 2 von 2

Re: Xiaomi Sauer 2x nacheinander saugen lassen?

Verfasst: 26. Jul 2020 15:18
von Steinspiel
udo1toni hat geschrieben: 26. Jul 2020 00:42 [...}
Ich hab das oben mal korrigiert.
Moin,

Schön das Du es so schnell richten konntest.

Ich habe die neue, zweite Variante so aus dem Codefeld übernommen. VSCode zeigt mir dann ein "The method or field Raumreinigung is undefined" und unterstreicht "Raumreinigung" in der logInfo Zeile. Ich nehme an sie bezieht sich auf das neue "Raeume" in der HashMap,habe es geändert und es verschwindet nicht nur die Fehlermeldung, -> der Roboter fährt los, und zwar in die richtige Richtung! :-) :-)

Super, ich bin Begeistert! Wirklich!

Kurz zum Verständniss:
- die HashMap verwaltet die Räume mit den dazugehörigen Befehlszeilen ?
- val vacRoom die Räume die in der *.item Gruppe angelegt sind?
- und val String sorgt dafür das der entsprechende Befehl für den entsprechenden Raum in .sendCommand() eingefügt wird?

Also, wenn Du Zeit hast, ich lese gerne eine längere Erklärung. ;-)

So, nun muss ich aber erst mal saugen ;-)

Danke und schönen Sonntag noch

Re: Xiaomi Sauer 2x nacheinander saugen lassen?

Verfasst: 26. Jul 2020 19:44
von udo1toni
Steinspiel hat geschrieben: 26. Jul 2020 15:18
Kurz zum Verständniss:
- die HashMap verwaltet die Räume mit den dazugehörigen Befehlszeilen ?
- val vacRoom die Räume die in der *.item Gruppe angelegt sind?
- und val String sorgt dafür das der entsprechende Befehl für den entsprechenden Raum in .sendCommand() eingefügt wird?
  • Richtig, in der Hashmap wird jedem Schalter der passende Zonenbefehl zugeordnet.
  • vacRoom ist das erste Item in der Liste der aktivierten Räume:

    Code: Alles auswählen

    vacRoom = gRooms.members.filter[i|i.state == ON].sortBy[name].head
    • gRooms -> Gruppenitem, dem alle Raumschalter zusammengefasst sind.
    • members -> die unmittelbaren Mitglieder der Gruppe (also eine Liste aller Items, die in der Definition (gRooms) stehen haben)
    • filter -> ein Filter, der die Liste filtert, und zwar mit der Bedingung, der Status des jeweiligen Items ist ON (i.state == ON). Das Ergebnis ist wiederum eine Liste :)
    • sortBy -> sortiere die Liste - in diesem Fall alphabetisch nach dem Namen des Items; hier könnte man z.B. auch lastUpdate stehen, dann wäre die Reihenfolge die des letzten Updates (gleich, ob mit oder ohne Wertänderung). Das Ergebnis ist wiederum eine Liste :)
    • head -> das erste Element der Liste. Nun ist das Ergebnis ein Item, keine Liste.
  • strRaum enthält den konkreten Befehl, der an den Sauger geschickt werden soll (der stammt, wie Du schon erkannt hast, aus der Hashmap)
  • val -> definiere eine Konstante (außerhalb einer Rule global, innerhalb einer Rule nur im Kontext). Die Konstante kann unbestimmt sein, dann ergibt sich der Typ durch den zugewiesenen Wert, oder man typisiert sie direkt (z.B. String für ein String Objekt)

Re: Xiaomi Sauer 2x nacheinander saugen lassen?

Verfasst: 27. Jul 2020 21:18
von Steinspiel
udo1toni hat geschrieben: 26. Jul 2020 19:44 Richtig, in der Hashmap wird jedem Schalter der passende Zonenbefehl zugeordnet.
[...]
Danke für die Erläuterungen.

Die Rule läuft bestens! Was den Trigger betrifft habe ich sie etwas angepasst und heute war die erste Lauf unter "realen" Bedingungen:
gestern Abend habe ich die Räume die ich gesaugt haben wollte in der Sitemap ausgewählt und nachdem ich heute früh das Haus verlassen hatte sprang um 09:30 die Rule an, "merkte" das niemand im Haus war (Präsenzerkennung) und saugte zuverlässig die ausgewählten Räume! :-)

Eine Frage habe ich noch, auch wenn sie nicht direkt was mit der Funktion der Rule zu tun hat: Ich will mir zusäztlich zur logInfo eine Telegram Nachricht schicken lassen. Dazu habe ich einfach den Text aus der LogInfo in die Telegram Zeile kopiert

Code: Alles auswählen

    logInfo("vacuum","Raumzone {} gewählt",strRaum)
    sendTelegram("bot1", "Raumzone {} gewählt",strRaum)		             
Während im Log alles richtig angezeigt wird,

Code: Alles auswählen

[INFO ] [clipse.smarthome.model.script.vacuum] - Raumzone app_segment_clean[16] gewählt
erscheint bei Telegram

Code: Alles auswählen

Raumzone {} gewählt
Gibt es eine Möglichkeit die generierte Meldung auch als Telegram Nachricht zu versenden?

Re: Xiaomi Sauer 2x nacheinander saugen lassen?

Verfasst: 27. Jul 2020 21:51
von udo1toni
Im Prinzip ja :) Das Problem ist hier, dass die Substitution der {} nur in bestimmten Bereichen funktioniert, beispielsweise in den log-Befehlen, aber leider nicht in den anderen Actions. Du kannst den String konventionell zusammensetzen, strRaum ist ja ohnehin ein String. also so:

Code: Alles auswählen

sendTelegram("bot1", "Raumzone "+ strRaum + " gewählt")

Re: Xiaomi Sauer 2x nacheinander saugen lassen?

Verfasst: 29. Jul 2020 20:51
von Steinspiel
udo1toni hat geschrieben: 27. Jul 2020 21:51 [...]
strRaum ist ja ohnehin ein String. also so:
Ja Danke, das funktioniert.