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
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();
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.
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.
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
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.
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.
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);”.
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.