Seite 1 von 2

Mit Rules einen Text ändern

Verfasst: 14. Dez 2018 15:02
von OliverCJ
Hallo nochmal,

nachdem mir udo1toni gestern hervorragend geholfen hat und meine Sitemap jetzt endlich so aussieht, wie ich mir das vorstelle, habe ich mich heute das allererste Mal mit Rules beschäftigt. Lese mich jetzt schon den ganzen Tag ein und komme auch hier nicht wirklich zum Ziel. Aber was möchte ich eigentlich? Ausgangssituation:

Ich lasse mir auf der UI mittels Group die Anzahl der noch 'brennenden' Lampen bzw. offene Fenster/Türen anzeigen:
Unbenannt3.PNG
In der Item-Datei:

Code: Alles auswählen

//--> Licht gruppieren
Group:Switch:OR(ON,OFF) gLichtCounter "[(%d Lampen sind an)]" <light>
In der Sitemap:

Code: Alles auswählen

Frame label="Gewerke" {
		Group item=gLichtCounter label="Licht" icon="light" {
			Frame label="Obergeschoss" {
Jetzt finde ich es einfach unschön, wenn bei nur einer Lampe dort trotzdem "Lampen sind an" steht. Da sollte dann schon stehen "Lampe ist an"! :D

Nach gefühlten fünf Stunden Studium diverser Dokumentationen habe ich folgende Zeilen in der rules geschafft:

Code: Alles auswählen

var msgLichtCounter = "Lampen sind an"

rule "Testregel"
when
    Group:Switch:OR(ON,OFF) gLichtCounter < 2
then
    var msgLichtCounter = "Lampe ist an"
end

Und die Variable "msgLichtCounter" würde ich jetzt in der item-Datei gegen den fixen Text austauschen bzw. hatte das auch schon getan. Hat aber nur dazu geführt, dass ich lediglich die Anzahl angezeigt bekommen habe und gar keinen Text mehr...

Irgendwie habe ich das mit den rules wohl immer noch nicht begriffen. Naja, jetzt kommen die Feiertage und vielleicht kann ich mich dann noch weiter damit beschäftigen, aber vielleicht kann mir vorher doch jemand die richtige Richtung weisen?! Wäre toll. Danke schön!

Viele Grüße
Oliver

Re: Mit Rules einen Text ändern

Verfasst: 14. Dez 2018 15:58
von udo1toni
Du kannst das Problem ganz ohne Rule lösen (das Label kann eigentlich nicht dynamisch geändert werden):

Code: Alles auswählen

Frame label="Gewerke" {
		Text item=gLichtCounter label="[(%d Lampen sind an)]" icon="light" visibility=[gLichtCounter != 1] {
			Frame label="Obergeschoss" {
                       ...
                       }
                 }
		Text item=gLichtCounter label="[(%d Lampe ist an)]" icon="light" visibility=[gLichtCounter == 1] {
			Frame label="Obergeschoss" {
                       ...
                       }
                 }
Leider musst Du in diesem Fall, eben weil es sich um eine übergeordnete Zeile handelt, den gesamten Baum darunter duplizieren. Der Trick ist, dass entweder das eine oder das andere Widget angezeigt wird.
Ich habe das bei mit so gelöst:

Code: Alles auswählen

		Text item=GLights label="Alle Lichter [(%d)]"{
			Switch item=GLights mappings=[OFF="Alles aus!"] visibility=[GLights!=0]
			Slider item=DimmerGruppe3_Ch2 label="Laura 6-flammig [%d]" visibility=[DimmerGruppe3_Ch2!=0]
			Slider item=DimmerGruppe3_Ch3 label="Laura 4-flammig [%d]" visibility=[DimmerGruppe3_Ch3!=0]
			Slider item=DimmerGruppe4_Ch1 label="Matty 4-flammig [%d]" visibility=[DimmerGruppe4_Ch1!=0]
			Slider item=DimmerGruppe4_Ch2 label="Matty 6-flammig [%d]" visibility=[DimmerGruppe4_Ch2!=0]
			Slider item=DimmerGruppe2_Ch1 label="Eltern Sterne [%d]" visibility=[DimmerGruppe2_Ch1!=0]
			Slider item=Einzeldimmer_Ch1 label="Eltern Strahler [%d]" visibility=[Einzeldimmer_Ch1!=0]
			Default item=SchaltGruppe1_Ch2 label="Bad OG" visibility=[SchaltGruppe1_Ch2==ON]
			Default item=SchaltGruppe3_Ch3 label="Licht Balkon" visibility=[SchaltGruppe3_Ch3==ON]
			Slider item=DimmerGruppe1_Ch2 label="Strahler Couch [%d]" visibility=[DimmerGruppe1_Ch2!=0]
			Default item=SchaltGruppe1_Ch1 label="Wozi Stehlampe" visibility=[SchaltGruppe1_Ch1==ON]
			Default item=SchaltGruppe1_Ch3 label="Wozi Vitrine" visibility=[SchaltGruppe1_Ch3==ON]
			Default item=SchaltGruppe2_Ch2 label="Wozi Steckdose" visibility=[SchaltGruppe2_Ch2==ON]
			Slider item=DimmerGruppe1_Ch3 label="Strahler Essen [%d]" visibility=[DimmerGruppe1_Ch3!=0]
			Slider item=DimmerGruppe1_Ch1 label="Strahler Buffet [%d]" visibility=[DimmerGruppe1_Ch1!=0]
			Default item=SchaltGruppe1_Ch5 label="Wozi Buffet" visibility=[SchaltGruppe1_Ch5==ON]
			Slider item=DimmerGruppe3_Ch1 label="Sterne Wozi [%d]" visibility=[DimmerGruppe3_Ch1!=0]
			Slider item=DimmerGruppe4_Ch3 label="Flur Tür [%d]" visibility=[DimmerGruppe4_Ch3!=0]
			Default item=SchaltGruppe1_Ch6 label="Flur" visibility=[SchaltGruppe1_Ch6==ON]
			Slider item=DimmerGruppe2_Ch2 label="Küche Decke [%d]" visibility=[DimmerGruppe2_Ch2!=0]
			Default item=SchaltGruppe2_Ch6 label="Küche Schrank" visibility=[SchaltGruppe2_Ch6==ON]
			Default item=SchaltGruppe2_Ch3 label="Technik oben" visibility=[SchaltGruppe2_Ch3==ON]
			Default item=SchaltGruppe2_Ch4 label="Technik unten" visibility=[SchaltGruppe2_Ch4==ON]
			Default item=SchaltGruppe3_Ch5 label="Bad EG" visibility=[SchaltGruppe3_Ch5==ON]
			Default item=SchaltGruppe3_Ch2 label="Steckdosen" visibility=[SchaltGruppe3_Ch2==ON]
		}
Man könnte die Items natürlich noch nach Räumen oder Stockwerken sortieren, mit Frames, aber das habe ich mir bisher gespart. dafür werden auf der Unterseite nur die Leuchten angezeigt, die auch eingeschaltet sind. Jede Leuchte ist separat auszuschalten, wahlweise gibt es auch ein General Aus welches dann an alle Leuchten den Ausschaltbefehl sendet. Man beachte die unterschiedlichen Bedingungen für Switch und Dimmer Items.
Sieht dann so aus:
Lichter1.PNG
Lichter2.PNG

Re: Mit Rules einen Text ändern

Verfasst: 14. Dez 2018 17:10
von OliverCJ
Ja, dann danke noch mal auch für diese Antwort!

Aber schade eigentlich. Bin es aus anderen "Sprachen" so gewohnt, dass ich Text in eine Variable schreiben kann (diesen natürlich auch über Regeln verändern) und diese Variable dann nahezu überall dort nutzen kann, wo ich den Text ausgeben möchte...


Den ganzen Baum 2x anlegen und mit Sichtbarkeiten zu arbeiten, ist natürlich eine Lösung, aber programmiertechnisch eine eher unsaubere. Und auch wenn es einfach nur C&P ist, leidet doch darunter stark die Übersichtlichkeit. Dann lebe ich entweder mit dem schlechten Deutsch (1 Lampen sind an) oder lasse den Text doch weg.


Schönes Wochenende!
Oliver

Re: Mit Rules einen Text ändern

Verfasst: 14. Dez 2018 19:07
von udo1toni
Du kannst natürlich auch ein anderes Item als "Überschrift" verwenden:

Code: Alles auswählen

String sLichter "[%s]" <light>

Code: Alles auswählen

rule "label setzen"
when
    Member of gLichtCounter changed
then
    val Number nAnzahl = gLichtCounter.members.filter[m|m.state == ON].size
    var String sLabel
    if(nAnzahl == 1) 
        sLabel = "Es ist 1 Licht an"
    else 
        sLabel = "Es sind "+nAnzahl.toString+" Lichter an"
    sLichter.postUpdate(sLabel)
end
Und in der Sitemap:

Code: Alles auswählen

Text item=sLichter {
    Frame label="Obergeschoss" {
        Switch item=...
    }
    Frame label="Erdgeschoss" {
        Switch item=...
    }
}
Zu beachten ist hier aber, dass nun ein konkreter Status abgefragt wird.
Nutzt man eine gemeinsame Gruppe für geschaltetes und gedimmtes Licht, muss man zwei getrennte Zähler anlegen und die Items vorher nach Typ filtern, da ein Dimmer Item nur den Status NULL oder 0-100 haben kann, während ein Switch Item nur den Zustand NULL, ON oder OFF haben kann.
Man kann diesem Problem bequem aus dem Weg gehen, indem man eine Gruppe pro Typ anlegt, dann muss man natürlich auch pro Gruppe einen Trigger einbauen:

Code: Alles auswählen

rule "label setzen"
when
    Member of gLichtCounterSwitch changed or 
    Member of gLichtCounterDimmer changed
then
    val Number nAnzahlSwitch = gLichtCounterSwitch.members.filter[m|m.state == ON].size
    val Number nAnzahlDimmer = gLichtCounterDimmer.members.filter[g|g.state instanceof Number].filter[m|(m.state as Number) != 0].size
    var String sLabel
    if(nAnzahlSwitch + nAnzahlDimmer == 1) 
        sLabel = "Es ist 1 Licht an"
    else 
        sLabel = "Es sind "+(nAnzahlSwitch + nAnzahlDimmer).toString+" Lichter an"
    sLichter.postUpdate(sLabel)
end
Der erste Filter in der Dimmergruppe verhindert hier, dass es eine null-Exception gibt, falls eines der Items den Status NULL hat.

Re: Mit Rules einen Text ändern

Verfasst: 17. Dez 2018 11:56
von OliverCJ
Oh man, das sieht ja perfekt aus... An dieser Stelle dann erneut meinen Dank! Werde ich aber wohl erst zwischen den Tage zu kommen, mich damit näher zu beschäftigen..

Was mir halt noch nicht klar ist, ist die Syntax oder auch Notation der Regeln. Alle Seite, auf die ich im Netz so gestoßen bin, erklären, wie der grundsätzliche Aufbau einer Regeln ist, das es eben Bedingungen gibt (when) und das man dann nach dem then die auszuführende Regel notiert. Leider geht niemand darauf ein, wie man das denn tut...

Finde ich irgendwo umfangreichere Dokumentationen dazu? Vorzugsweise Deutsch, aber ich komme auch mit Englisch klar...

Viele Grüße
Oliver

Re: Mit Rules einen Text ändern

Verfasst: 17. Dez 2018 15:23
von udo1toni
Es gibt ein gutes Buch zu openHAB2 von Marianne Spiller (die ist auch im englischen Forum aktiv), die Rules machen natürlich nur einen Bruchteil des Buches aus.
Ansonsten gibt es da tatsächlich nicht so wahnsinnig viel Dokumentation. Eine Rule besteht aus dem Rahmen:

Code: Alles auswählen

rule rulename // wenn der Rulename Leerzeichen enthalten oder nicht mit einem Buchstaben beginnen soll, müssen "" drum rum
when
    // hier kommen alle Trigger hin, die die Rule auslösen sollen
then
    // hier kommt alles hin, was passieren soll, falls einer der Trigger die Rule ausgelöst hat.
end
Wichtig zu verstehen ist, dass das Schlüsselwort then nichts mit der bedingten Verzweigung (aus BASIC bekannt als IF ... THEN) zu tun hat!
Die verwendete Sprache ist eine DSL (DomainSpecificLanguage), d.h., die Programmiersprache wurde extra für openHAB erfunden. Da man sowas aber nicht gerne tut, wurde hier auf einen Baukasten zurückgegriffen, XTEXT und XTEND sind die zwei wichtigen Stichworte dazu.
XTEXT wiederum setzt zu erheblichen Teilen auf JAVA auf, so dass man etliches in zumindest ähnlicher Form in JAVA wieder finden wird - oder umgekehrt, man kann etliches aus JAVA in openHAB Rules verwenden. Leider aber nicht 1:1 und auch nicht alles, dafür gibt es aber ein paar essenzielle Erweiterungen, die es erlauben, Items zu verwenden.

Wenn Du VSCode mit dem openHAB Plugin als Editor verwendest, kannst Du Dir jederzeit eine Liste aller möglichen Schlüsselworte anzeigen lassen, wenn Du also z.B. den Namen eines Items tippst, zeigt VSCode Dir an, welche Methoden das Item grundsätzlich anbietet.
Keine Angst, VSCode ist kostenlos, OpenSource und inzwischen sehr weit verbreitet. Es bietet (mit dem direkt aus der Anwendung installierbaren Plugin) vollumfängliche Unterstützung für openHAB, von Code Completion über Syntax Highlighting bis zur Anzeige dynamischer Listen der vorhandenen Things, Channel und Items (diese hierarchisch nach Gruppen angeordnet), es werden Fehler im Code angezeigt und man kann Codefragmente einfügen lassen, mehrere Ansichten parallel nebeneinander anzeigen, alle Vorkommen eines Begriffs auf einen Schlag ändern, Code in mehreren Zeilen gleichzeitig einfügen, es gibt eine Arbeitsumgebungsverwaltung, und damit bin ich immer noch am Anfang der Featureliste... lohnt sich definitiv!

Re: Mit Rules einen Text ändern

Verfasst: 17. Dez 2018 20:06
von BOP
So ein paar Sachen (Expressions) schaue ich schon mal hier nach:
https://www.eclipse.org/xtend/documenta ... sions.html

Re: Mit Rules einen Text ändern

Verfasst: 19. Dez 2018 20:43
von OliverCJ
Cool, das hat schon.mal funktioniert. Konnte die Regel sogar noch etwas erweitern. ;-)

Aber jetzt habe ich das nächste Problem. Yahoo Wetter zeigt mir keine Daten mehr an. Dabei war ich an dem Teil gar nicht dran. Allerdings habe ich heute auch mal über das config Menü ein Upgrade gemacht... Das letzte war lang her. Könnte es daran liegen? Sind Probleme bekannt?

Danke!

Gesendet von meinem SM-N950F mit Tapatalk


Re: Mit Rules einen Text ändern

Verfasst: 19. Dez 2018 23:06
von udo1toni
Welches Binding verwendest Du?

Eventuell wäre es besser, ein neues Thema aufzumachen, da es sich ja nun um einen komplett anderen Fehler handelt...

Re: Mit Rules einen Text ändern

Verfasst: 20. Dez 2018 07:17
von OliverCJ
Hast Recht.. hab einen neuen Thread aufgemacht: viewtopic.php?f=15&t=1000.

Danke!