Moin,
ich habe Deine Rules mal etwas umformatiert (vor allem, damit sie etwas weniger Platz einnehmen, das erhöht die Lesbarkeit hier im Forum).
Fragen dazu:
1. Von wo werden die Items bedient? Passiert das über die UI? BasicUI, MainUI?
2. Die Rule
Navimov mähen autoff ist der Versuch, den Switch wieder auf OFF zu bringen?
3. In welcher Form kommt die Antwort von Alexa?
Mein Vorschlag (falls nicht unbedingt getrennte Switch Items gewünscht sind):
Ein Number Item:
Code: Alles auswählen
Number Navimov_command "Navimov Befehl" {autoupdate="false"} // ungebundenes Item
Eine Rule:
Code: Alles auswählen
rule "Navimov Kommando"
when
Item Navimov_command received command
then
if(!(receivedCommand instanceof Number)) {
logWarn("navimovCommand","Befehl enthält keine Zahl. Abbruch!")
return;
}
var String strCommand = "Alexa, "
switch((receivedCommand as Number).intValue) {
case 0: { strCommand = strCommand + "sage Segway Roboter den Rasenmäher zu stoppen"
logInfo("navimovCommand","Sende Befehl zum Stoppen des Mähvorgangs")
}
case 1: { strCommand = strCommand + "sage Segway Roboter den Rasenmäher zu parken"
logInfo("navimovCommand","Sende Befehl zum Parken des Mähroboters")
}
case 2: { strCommand = strCommand + "sage Segway Roboter den Rasenmäher zu starten"
logInfo("navimovCommand","Sende Befehl zum Starten des Mähvorgangs")
}
case 3: { strCommand = strCommand + "frage Segway Roboter wie der Status des Mähers ist"
logInfo("navimovCommand","Sende Anfrage zum Status des Mähroboters")
}
case 4: { strCommand = strCommand + "frage Segway Roboter wieviel Akku der Roboter noch hat"
logInfo("navimovCommand","Sende Anfrage zum Akku Status des Mähroboters")
}
default :{
logWarn("navimovCommand","Unbekannter Befehl. Abbruch!")
return;
}
}
Alexa_EG_Textcomand.sendCommand(strCommand)
end
In der Sitemap für BasicUI definierst Du z.B. so:
Code: Alles auswählen
Switch item=Navimov_command mappings=[2="Start",1="Park",0="Stopp",3="?",4="Akku"]
In der MainUI kannst Du ein Widget in ähnlicher Form definieren, es benötigt lediglich die fünf Schaltflächen für die Befehle.
Wenn man in der UI ein Widget bedient, wird immer das Event
received command getriggert. Mittels autoupdate="false" wird verhindert, dass openHAB den Status des Items automatisch entsprechend dem gesendeten Befehl anpasst. Das Item hält also weiterhin den Status vor dem Befehl.
Die Rule prüft, ob der Befehl gültig ist und führt ihn gegebenenfalls aus. Sollte der Befehl ungültig sein, wird eine entsprechende Warnmeldung geloggt.
Bei einem gültigen Befehl wird der Befehlsstring zusammengesetzt und nach dem Logging auch gesendet.
Für die Auswertung bedarf es ebenfalls einer Rule, welche dann auf die Antwort von Alexa triggert. Da ich nicht weiß, wie die Antwort lautet, kann ich hier erst mal nicht weiter helfen (ich habe keine Alexa). Im Prinzip wird es aber ähnlich laufen, je nachdem in welcher Form die Antwort in openHAB ankommt, kannst Du sie z.B. über ein String Item einer Rule zuführen (diesmal mittels
received update, weil ankommende Daten gewöhnlich als Status gewertet werden). Zu Beginn der Auswertung solltest Du prüfen, ob die Antwort überhaupt auf den Mähroboter bezogen ist, ich gehe davon aus, dass z.B. immer "Segway Roboter" in der Antwort enthalten sein wird).
Dann musst Du vermutlich auf das Vorhandensein bestimmter Teilstrings reagieren (meinetwegen "geparkt" oder "gestoppt"), das geht mit der Methode .contains():
Code: Alles auswählen
if(AlexaAntwort.state.contains("geparkt"))... // Das Wort "geparkt" ist enthalten
Und dann könntest Du z.B. mittels Navimov_command.postUpdate(1) das Befehlsitem auf den entsprechenden Status setzen (falls das sinnvoll ist) oder den Status in ein anderes Item schreiben - gerne auch als String in ein String Item, der Phantasie sind da kaum Grenzen gesetzt...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet