Lastig om zo even uit te leggen. Maar ik ga een poging doen.
Ik heb in openhab meerder Items gemaakt die bepaalde waardes kunnen bevatten, zoals Alarm.state = ON, System_pod_mode.state = ON, LightLevel.state = 50, etc. Voor onze benedenverdieping (Keuken en woonkamer zijn 1 grote ruimte) zijn dat 9 items die ik gebruikt daarvoor. Die zitten in een groep. Met een rule, Member changed, check ik of er een item veranderd. Daarna laat ik een string maken met alle items en hun statussen erin. Die string met statussen vergelijk ik met eerder opgeslagen statussen. Als er zo'n status / situatie bestaat dan start er een functie die gaat zoeken naar die status. Die functie krijgt een ruimte naam mee waarmee hij weet in welke items hij moet kijken. In zo'n item staan alle statussen opgeslagen als String in JSON formaat, best grootte string dus

. Ik itereer dan door die waardes heen en laad de status in waarbij de scene staat die ingeladen moet worden. Scene laden werkt op zo'n zelfde principe, Ruimte naam wordt meegegeven, ik itereer door een ander item met JSON waardes waarin de scene namen staan met bijbehorende lamp statussen.
Het zelf lerende gaat als volgt. Als één van de members verandert voor de benedenverdieping en de status wordt niet gevonden in de JSON string (contains = false), dan start er een andere functie. Deze gaat kijken of er statussen zijn die redelijk overeen komen (20% van LightLevel en TV staat uit bijvoorbeeld) met de huidige waardes van die 9 items voor de benedenverdieping. Als deze gevonden wordt, dan wordt die scene geladen en direct ook de status opgeslagen met bijbehorende scene. Als er niks overeen komt dan wordt de huidige scene gebruikt met de huidige status, dus nieuwe scene.
Soms worden er dus scenes verlengt, bijvoorbeeld lightlevel daalt maar er is geen overeenkomstige scene, dan wordt de huidige opnieuw gebruikt, bijvoorbeeld verlichting uit. Als dit opnieuw gebeurt blijft de verlichting uit. Ik zal dan zelf op een moment een scene moeten kiezen wat bij het huidige licht niveau past. Dit wordt dan ook opgeslagen en later hergebruikt als die situatie zich opnieuw voordoet.
Ik ben nog aan het optimaliseren van mijn code, want ik gebruik voor 3 ruimtes dezelfde functie, en de raspberry pi 4 heeft het een beetje zwaar met deze functies. Dus als een scene geladen moet worden duurt het wel 3 tot 5 seconden voordat deze geladen is. Op zich niet zo'n probleem omdat het niet hoeft te werken aan de hand van beweging. Maar iets vlotter, bijvoorbeeld als we thuiskomen, dat de lampen niet nog aan het inschakelen zijn tijdens naar binnen lopen, is wel zo fijn. Ik kwam er bijvoorbeeld gisteren achter dat wanneer een scene al geladen is, hij toch opnieuw geladen wordt. Dat scheelt alweer in de system resources

.