UseCase Saugroboter: kann man Variablenwerte sortieren?

Hi zusammen,
ich neu im Homey Universum und ganz angetan.

Folgendes Problem habe ich gerade. Ich möchte meinen Saugroboter Räume saugen lassen, abhängig welche Knöpfe auf einer Fernbedienung gedrückt wurden (z.B. Kreis = Bad, Plus = Schlafzimmer, etc).
Drücke ich die Knöpfe direkt hintereinander, sollen die Räume nacheinander gereinigt werden. Der RoborockApp übergibt man Nummern für die jeweiligen Räume (z.B. Bad = 16, Schlafzimmer = 20). Die Nummern müssen aufsteigend mit Komma getrennt übergeben werden. Ich habe einen Adv. Flow gebaut, der die Nummern nach und nach in eine Variable schreibt und der RoborockApp übergibt - das klappt aber nur, wenn ich die Knöpfe aufsteigend und in korrekter Reihenfolge drücke. Erst Schlafzimmer (=20) und dann Bad (=16) erzeugt die Textvariable “20, 16” und damit kann die RoborockApp nicht umgehen.
Habt ihr eine Idee, wie Variablenwerte sortieren kann oder einen anderen Workaround?

(wenn ich den Workflow schick gemacht habe und für Dritte lesbar gemacht habe, stell ich den gerne zur Verfügung)

Du könntest den String mit den Nummern in einem Homeyscript sortieren. Dann zurückgeben und den Tag mit dem sortierten String an deinen Sauger schicken.
Gib mal bitte Rückmeldung, ob du mit dem Tipp zurecht kommst oder weitere Details brauchst.

Könntest Du bitte trotzdem schon mal den Flow zu Verständniszwecken posten?
Mich würden außerdem alle möglichen Raum-Ziffern interessieren.
Wenn man diese nämlich zuerst addiert, also z.B. Schlafzimmer 20 + Bad 16 = 36, und die Summe immer einzigartig ist, dann könnte man die Textvariable entsprechend füllen.

Wenn…
– Num. Variable Saugrobo hat sich geändert
Und…
– Num. Variable Saugrobo = 36
Dann…
– Textvariable auf 16, 20 setzen

Schon mal etwas vorbereitet :slight_smile:

Du nimmst diese HomeyScript-Karte:
grafik

Bei “Wert” fügst du deine Variable ein mit dem Text z.B: ‘10, 30, 20’.
Bei Script fügst du diesen Code ein:

let rooms = args[0];
if (!rooms){
  return '';
}
rooms = rooms.split(',');
rooms.sort(function(a, b){
  let x = Number(a);
  let y = Number(b);
  if (x < y) {return -1;}
  if (x > y) {return 1;}
  return 0;
});
return rooms.toString();

Das sieht dann so aus:

Die Karte liefert dir nun einen sortierten Text zurück.

3 Likes

Habe eben zu kompliziert um die Ecke gedacht, weil eigentlich ist alles vorhanden:

Nach den Karten BeispielText auf xyz setzen muss der Inhalt natürlich noch an den Saugrobo übergeben werden.

Damit sind alle Kombinationen der 3 Räume abgedeckt, außer die einzelnen Räume für sich. Ich gehe mal davon aus, dass das ja nicht das Problem ist. Ansonsten könnte man diese natürlich auch noch mit hinzufügen.

Das ist zwar nicht so elegant wie mit dem Script, funktioniert aber dennoch. Und man benötigt keine zusätzliche App, falls man die HomeyScript App bisher nicht installiert hatte.

2 Likes

Erst einmal vielen Dank für schnelle Rückmeldungen. Ich denke beide Lösungen kommen zum gleichen Ziel.
Die Script Version ist für mehrere Räume die eleganteste.

Ich versuche das morgen mal umzusetzen da ich noch keine Erfahrung mit Scripten in homey habe.

Und dann poste ich den Workflow mal. Da gibt’s sicherlich mögliche Verbesserungen.

2 Likes

Herzlichen Glückwunsch Dirk !

1 Like

Hi Ronny,
Script funktioniert. Die Werte werden sortiert. ABER:
wie schreib ich denn jetzt den Text-tag in meine Variable?

EDIT: ich glaub ich habs gefunden - das Ergebnis wird in eine “Ergebnis” Variable geschrieben

Happy Birthday @DirkG :heart:

1 Like

@DirkG erst einmal happy birthday :wink:

Hier mein Flow.
Wahrscheinlich ließe sich das enorm verschlanken - aber dafür fehlt mir noch die Erfahrung. Für Tipps bin ich dankbar.

@RonnyW
Das Script hab ich mittels ChatGPT noch anpassen lassen, da das Ergebnis sonst die Leerzeichen falsch gesetzt hatte.
Kann ich eigentlich das Script eigentlich auch als eigenes HomeyScript speichern und im Flow aufrufen?

let rooms = args[0];
if (!rooms){
  return ''; // Gibt einen leeren String zurück, wenn rooms leer oder undefiniert ist
}
rooms = rooms.split(',').map(room => room.trim()); // Teilt den String in ein Array und entfernt Leerzeichen um die Elemente
rooms.sort(function(a, b){
  let x = Number(a); // Konvertiert a in eine Zahl
  let y = Number(b); // Konvertiert b in eine Zahl
  if (x < y) {return -1;} // Sortiert a vor b, wenn x kleiner als y ist
  if (x > y) {return 1;} // Sortiert a nach b, wenn x größer als y ist
  return 0; // Lässt die Reihenfolge gleich, wenn x gleich y ist
});
return rooms.join(', '); // Konvertiert das Array zurück in einen String mit Komma und Leerzeichen als Trennzeichen
1 Like

Ja, du kannst das Skript auch in HomeyScript speichern.
Du müsstest dann eine andere Flowkarte verwenden, und zwar die, wo man den Skriptname wählen kann.

Lieben Dank für die Glückwünsche… :+1:t3:

ich finde zwar ein “Dann” Flow, der ein Script ausführt, der liefert aber nichts zurück. überseh ich etwas?

Versuchst du das in AdvancedFlow oder StandardFlow?
Aktionen mit Rückgabewerten sind nur in AdvancedFlow möglich, weil man nur dort Folgeprozesse ausführen kann.

ich bin schon in den Adv.Flow unterwegs, siehe Bild oben. Hier ist nochmal das “Problem” genauer dargestellt.
Im oberen Beispiel wird der Code direkt im Flow genutzt. Das Ergebnis wird als Text-Tag zurückgegeben werden und in die Variable “@Ergebnis” geschrieben.

Im unteren Beispiel wird das HomeyScript “sortieren” genutzt. Das Ergebnis kann ich nicht aufgreifen und verwenden, da es NICHT in Variable “@Ergebnis” geschrieben wird.

Kannst du mir folgen? :wink:

Stimmt, bei den Karten mit Skript geht das nicht. Da kannst du aber im Skript ein Tag erzeugen. Das ist dann als globaler Tag in allen Flows verfügbar. Schau mal bitte in den Beispiel-Skripten. Da gibt es ein Beispiel mit “await tag(‘Name’, wert);”.

1 Like

Vielleicht nochmal abschließend für die Nachwelt die Erklärung wie man in diesem Fall ein Homeyscript mit Variablen nutzt, die man im Flow aufgreift.
Hier erst einmal das Script “sortieren”. In der letzten Zeile wird die Variable “My Rooms” beschrieben.

rooms = rooms.split(',').map(room => room.trim()); // Teilt den String in ein Array und entfernt Leerzeichen um die Elemente
rooms.sort(function(a, b) {
  let x = Number(a); // Konvertiert a in eine Zahl
  let y = Number(b); // Konvertiert b in eine Zahl
  if (x < y) { return -1; } // Sortiert a vor b, wenn x kleiner als y ist
  if (x > y) { return 1; } // Sortiert a nach b, wenn x größer als y ist
  return 0; // Lässt die Reihenfolge gleich, wenn x gleich y ist
});

await tag('My Rooms', rooms.join(', ')); // Speichert das Ergebnis als globlaen Tag mit dem Namen 'My Rooms'

Und hier ein Auszug des Flows. Hier wird das Homeyscript ausgeführt und als Ergebnis kann man im Flow “My Rooms” nutzen.

1 Like